test/endecode_test.c: Update to specify output structures
[openssl.git] / test / evp_pkey_provided_test.c
1 /*
2  * Copyright 2019-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> /* memset */
11 #include <openssl/evp.h>
12 #include <openssl/pem.h>
13 #include <openssl/encoder.h>
14 #include <openssl/provider.h>
15 #include <openssl/param_build.h>
16 #include <openssl/core_names.h>
17 #include "crypto/ecx.h"
18 #include "crypto/evp.h"          /* For the internal API */
19 #include "crypto/bn_dh.h"        /* _bignum_ffdhe2048_p */
20 #include "internal/nelem.h"
21 #include "testutil.h"
22
23 static char *datadir = NULL;
24
25 #define PRIV_TEXT    0
26 #define PRIV_PEM     1
27 #define PRIV_DER     2
28 #define PUB_TEXT     3
29 #define PUB_PEM      4
30 #define PUB_DER      5
31
32 static void stripcr(char *buf, size_t *len)
33 {
34     size_t i;
35     char *curr, *writ;
36
37     for (i = *len, curr = buf, writ = buf; i > 0; i--, curr++) {
38         if (*curr == '\r') {
39             (*len)--;
40             continue;
41         }
42         if (curr != writ)
43             *writ = *curr;
44         writ++;
45     }
46 }
47
48 static int compare_with_file(const char *alg, int type, BIO *membio)
49 {
50     char filename[80];
51     BIO *file = NULL;
52     char buf[4096];
53     char *memdata, *fullfile = NULL;
54     const char *suffix;
55     size_t readbytes;
56     int ret = 0;
57     int len;
58     size_t slen;
59
60     switch (type) {
61     case PRIV_TEXT:
62         suffix = "priv.txt";
63         break;
64
65     case PRIV_PEM:
66         suffix = "priv.pem";
67         break;
68
69     case PRIV_DER:
70         suffix = "priv.der";
71         break;
72
73     case PUB_TEXT:
74         suffix = "pub.txt";
75         break;
76
77     case PUB_PEM:
78         suffix = "pub.pem";
79         break;
80
81     case PUB_DER:
82         suffix = "pub.der";
83         break;
84
85     default:
86         TEST_error("Invalid file type");
87         goto err;
88     }
89
90     BIO_snprintf(filename, sizeof(filename), "%s.%s", alg, suffix);
91     fullfile = test_mk_file_path(datadir, filename);
92     if (!TEST_ptr(fullfile))
93         goto err;
94
95     file = BIO_new_file(fullfile, "rb");
96     if (!TEST_ptr(file))
97         goto err;
98
99     if (!TEST_true(BIO_read_ex(file, buf, sizeof(buf), &readbytes))
100             || !TEST_true(BIO_eof(file))
101             || !TEST_size_t_lt(readbytes, sizeof(buf)))
102         goto err;
103
104     len = BIO_get_mem_data(membio, &memdata);
105     if (!TEST_int_gt(len, 0))
106         goto err;
107
108     slen = len;
109     if (type != PRIV_DER && type != PUB_DER) {
110         stripcr(memdata, &slen);
111         stripcr(buf, &readbytes);
112     }
113
114     if (!TEST_mem_eq(memdata, slen, buf, readbytes))
115         goto err;
116
117     ret = 1;
118  err:
119     OPENSSL_free(fullfile);
120     (void)BIO_reset(membio);
121     BIO_free(file);
122     return ret;
123 }
124
125 static int test_print_key_using_pem(const char *alg, const EVP_PKEY *pk)
126 {
127     BIO *membio = BIO_new(BIO_s_mem());
128     int ret = 0;
129
130     if (!TEST_ptr(membio))
131         goto err;
132
133     if (/* Output Encrypted private key in PEM form */
134         !TEST_true(PEM_write_bio_PrivateKey(bio_out, pk, EVP_aes_256_cbc(),
135                                             (unsigned char *)"pass", 4,
136                                             NULL, NULL))
137         /* Private key in text form */
138         || !TEST_true(EVP_PKEY_print_private(membio, pk, 0, NULL))
139         || !TEST_true(compare_with_file(alg, PRIV_TEXT, membio))
140         /* Public key in PEM form */
141         || !TEST_true(PEM_write_bio_PUBKEY(membio, pk))
142         || !TEST_true(compare_with_file(alg, PUB_PEM, membio))
143         /* Unencrypted private key in PEM form */
144         || !TEST_true(PEM_write_bio_PrivateKey(membio, pk,
145                                                NULL, NULL, 0, NULL, NULL))
146         || !TEST_true(compare_with_file(alg, PRIV_PEM, membio)))
147         goto err;
148
149     ret = 1;
150  err:
151     BIO_free(membio);
152     return ret;
153 }
154
155 static int test_print_key_type_using_encoder(const char *alg, int type,
156                                              const EVP_PKEY *pk)
157 {
158     const char *output_type, *output_structure;
159     int selection;
160     OSSL_ENCODER_CTX *ctx = NULL;
161     BIO *membio = BIO_new(BIO_s_mem());
162     int ret = 0;
163
164     switch (type) {
165     case PRIV_TEXT:
166         output_type = "TEXT";
167         output_structure = NULL;
168         selection = OSSL_KEYMGMT_SELECT_KEYPAIR
169             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
170         break;
171
172     case PRIV_PEM:
173         output_type = "PEM";
174         output_structure = "pkcs8";
175         selection = OSSL_KEYMGMT_SELECT_KEYPAIR
176             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
177         break;
178
179     case PRIV_DER:
180         output_type = "DER";
181         output_structure = "pkcs8";
182         selection = OSSL_KEYMGMT_SELECT_KEYPAIR
183             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
184         break;
185
186     case PUB_TEXT:
187         output_type = "TEXT";
188         output_structure = NULL;
189         selection = OSSL_KEYMGMT_SELECT_PUBLIC_KEY
190             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
191         break;
192
193     case PUB_PEM:
194         output_type = "PEM";
195         output_structure = "SubjectPublicKeyInfo";
196         selection = OSSL_KEYMGMT_SELECT_PUBLIC_KEY
197             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
198         break;
199
200     case PUB_DER:
201         output_type = "DER";
202         output_structure = "SubjectPublicKeyInfo";
203         selection = OSSL_KEYMGMT_SELECT_PUBLIC_KEY
204             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
205         break;
206
207     default:
208         TEST_error("Invalid encoding type");
209         goto err;
210     }
211
212     if (!TEST_ptr(membio))
213         goto err;
214
215     /* Make a context, it's valid for several prints */
216     TEST_note("Setting up a OSSL_ENCODER context with passphrase");
217     if (!TEST_ptr(ctx = OSSL_ENCODER_CTX_new_by_EVP_PKEY(pk, selection,
218                                                          output_type,
219                                                          output_structure,
220                                                          NULL, NULL))
221         /* Check that this operation is supported */
222         || !TEST_int_ne(OSSL_ENCODER_CTX_get_num_encoders(ctx), 0))
223         goto err;
224
225     /* Use no cipher.  This should give us an unencrypted PEM */
226     TEST_note("Testing with no encryption");
227     if (!TEST_true(OSSL_ENCODER_to_bio(ctx, membio))
228         || !TEST_true(compare_with_file(alg, type, membio)))
229         goto err;
230
231     if (type == PRIV_PEM) {
232         /* Set a passphrase to be used later */
233         if (!TEST_true(OSSL_ENCODER_CTX_set_passphrase(ctx,
234                                                           (unsigned char *)"pass",
235                                                           4)))
236             goto err;
237
238         /* Use a valid cipher name */
239         TEST_note("Displaying PEM encrypted with AES-256-CBC");
240         if (!TEST_true(OSSL_ENCODER_CTX_set_cipher(ctx, "AES-256-CBC", NULL))
241             || !TEST_true(OSSL_ENCODER_to_bio(ctx, bio_out)))
242             goto err;
243
244         /* Use an invalid cipher name, which should generate no output */
245         TEST_note("NOT Displaying PEM encrypted with (invalid) FOO");
246         if (!TEST_false(OSSL_ENCODER_CTX_set_cipher(ctx, "FOO", NULL))
247             || !TEST_false(OSSL_ENCODER_to_bio(ctx, bio_out)))
248             goto err;
249
250         /* Clear the cipher.  This should give us an unencrypted PEM again */
251         TEST_note("Testing with encryption cleared (no encryption)");
252         if (!TEST_true(OSSL_ENCODER_CTX_set_cipher(ctx, NULL, NULL))
253             || !TEST_true(OSSL_ENCODER_to_bio(ctx, membio))
254             || !TEST_true(compare_with_file(alg, type, membio)))
255             goto err;
256     }
257     ret = 1;
258 err:
259     BIO_free(membio);
260     OSSL_ENCODER_CTX_free(ctx);
261     return ret;
262 }
263
264 static int test_print_key_using_encoder(const char *alg, const EVP_PKEY *pk)
265 {
266     int i;
267     int ret = 1;
268
269     for (i = 0; i < 6; i++)
270         ret = ret && test_print_key_type_using_encoder(alg, i, pk);
271
272     return ret;
273 }
274
275 /* Array indexes used in test_fromdata_rsa */
276 #define N       0
277 #define E       1
278 #define D       2
279 #define P       3
280 #define Q       4
281 #define DP      5
282 #define DQ      6
283 #define QINV    7
284
285 static int test_fromdata_rsa(void)
286 {
287     int ret = 0, i;
288     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
289     EVP_PKEY *pk = NULL, *copy_pk = NULL;
290     /*
291      * 32-bit RSA key, extracted from this command,
292      * executed with OpenSSL 1.0.2:
293      *
294      * openssl genrsa 32 | openssl rsa -text
295      */
296     static unsigned long key_numbers[] = {
297         0xbc747fc5,              /* N */
298         0x10001,                 /* E */
299         0x7b133399,              /* D */
300         0xe963,                  /* P */
301         0xceb7,                  /* Q */
302         0x8599,                  /* DP */
303         0xbd87,                  /* DQ */
304         0xcc3b,                  /* QINV */
305     };
306     OSSL_PARAM fromdata_params[] = {
307         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_N, &key_numbers[N]),
308         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_E, &key_numbers[E]),
309         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_D, &key_numbers[D]),
310         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_FACTOR1, &key_numbers[P]),
311         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_FACTOR2, &key_numbers[Q]),
312         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_EXPONENT1, &key_numbers[DP]),
313         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_EXPONENT2, &key_numbers[DQ]),
314         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_COEFFICIENT1, &key_numbers[QINV]),
315         OSSL_PARAM_END
316     };
317     BIGNUM *bn = BN_new();
318     BIGNUM *bn_from = BN_new();
319
320     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL)))
321         goto err;
322
323     if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
324         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
325         || !TEST_int_eq(EVP_PKEY_bits(pk), 32)
326         || !TEST_int_eq(EVP_PKEY_security_bits(pk), 8)
327         || !TEST_int_eq(EVP_PKEY_size(pk), 4))
328         goto err;
329
330     if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
331         goto err;
332
333     if (!TEST_true(EVP_PKEY_check(key_ctx))
334         || !TEST_true(EVP_PKEY_public_check(key_ctx))
335         || !TEST_true(EVP_PKEY_private_check(key_ctx))
336         || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
337         goto err;
338
339     /* EVP_PKEY_copy_parameters() should fail for RSA */
340     if (!TEST_ptr(copy_pk = EVP_PKEY_new())
341         || !TEST_false(EVP_PKEY_copy_parameters(copy_pk, pk)))
342         goto err;
343
344     for (i = 0; fromdata_params[i].key != NULL; ++i) {
345         if (!TEST_true(BN_set_word(bn_from, key_numbers[i]))
346             || !TEST_true(EVP_PKEY_get_bn_param(pk, fromdata_params[i].key, &bn))
347             || !TEST_BN_eq(bn, bn_from))
348             goto err;
349     }
350     ret = test_print_key_using_pem("RSA", pk)
351           && test_print_key_using_encoder("RSA", pk);
352  err:
353     BN_free(bn_from);
354     BN_free(bn);
355     EVP_PKEY_free(pk);
356     EVP_PKEY_free(copy_pk);
357     EVP_PKEY_CTX_free(key_ctx);
358     EVP_PKEY_CTX_free(ctx);
359
360     return ret;
361 }
362
363 static int test_evp_pkey_get_bn_param_large(void)
364 {
365     int ret = 0;
366     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
367     EVP_PKEY *pk = NULL;
368     OSSL_PARAM_BLD *bld = NULL;
369     OSSL_PARAM *fromdata_params = NULL;
370     BIGNUM *n = NULL, *e = NULL, *d = NULL, *n_out = NULL;
371     /*
372      * The buffer size chosen here for n_data larger than the buffer used
373      * internally in EVP_PKEY_get_bn_param.
374      */
375     static unsigned char n_data[2050];
376     static const unsigned char e_data[] = {
377         0x1, 0x00, 0x01
378     };
379     static const unsigned char d_data[]= {
380        0x99, 0x33, 0x13, 0x7b
381     };
382
383     /* N is a large buffer */
384     memset(n_data, 0xCE, sizeof(n_data));
385
386     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
387         || !TEST_ptr(n = BN_bin2bn(n_data, sizeof(n_data), NULL))
388         || !TEST_ptr(e = BN_bin2bn(e_data, sizeof(e_data), NULL))
389         || !TEST_ptr(d = BN_bin2bn(d_data, sizeof(d_data), NULL))
390         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n))
391         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E, e))
392         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D, d))
393         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld))
394         || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL))
395         || !TEST_true(EVP_PKEY_key_fromdata_init(ctx))
396         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
397         || !TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, ""))
398         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_RSA_N, &n_out))
399         || !TEST_BN_eq(n, n_out))
400         goto err;
401     ret = 1;
402  err:
403     BN_free(n_out);
404     BN_free(n);
405     BN_free(e);
406     BN_free(d);
407     EVP_PKEY_free(pk);
408     EVP_PKEY_CTX_free(key_ctx);
409     EVP_PKEY_CTX_free(ctx);
410     OSSL_PARAM_BLD_free_params(fromdata_params);
411     OSSL_PARAM_BLD_free(bld);
412     return ret;
413 }
414
415
416 #ifndef OPENSSL_NO_DH
417 static int test_fromdata_dh_named_group(void)
418 {
419     int ret = 0;
420     int gindex = 0, pcounter = 0, hindex = 0;
421     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
422     EVP_PKEY *pk = NULL, *copy_pk = NULL;
423     size_t len;
424     BIGNUM *pub = NULL, *priv = NULL;
425     BIGNUM *pub_out = NULL, *priv_out = NULL;
426     BIGNUM *p = NULL, *q = NULL, *g = NULL, *j = NULL;
427     OSSL_PARAM *fromdata_params = NULL;
428     OSSL_PARAM_BLD *bld = NULL;
429     char name_out[80];
430     unsigned char seed_out[32];
431
432     /*
433      * DH key data was generated using the following:
434      * openssl genpkey -algorithm DH -pkeyopt group:ffdhe2048
435      *                 -pkeyopt priv_len:224 -text
436      */
437     static const unsigned char priv_data[] = {
438         0x88, 0x85, 0xe7, 0x9f, 0xee, 0x6d, 0xc5, 0x7c, 0x78, 0xaf, 0x63, 0x5d,
439         0x38, 0x2a, 0xd0, 0xed, 0x56, 0x4b, 0x47, 0x21, 0x2b, 0xfa, 0x55, 0xfa,
440         0x87, 0xe8, 0xa9, 0x7b,
441     };
442     static const unsigned char pub_data[] = {
443         0x00, 0xd6, 0x2d, 0x77, 0xe0, 0xd3, 0x7d, 0xf8, 0xeb, 0x98, 0x50, 0xa1,
444         0x82, 0x22, 0x65, 0xd5, 0xd9, 0xfe, 0xc9, 0x3f, 0xbe, 0x16, 0x83, 0xbd,
445         0x33, 0xe9, 0xc6, 0x93, 0xcf, 0x08, 0xaf, 0x83, 0xfa, 0x80, 0x8a, 0x6c,
446         0x64, 0xdf, 0x70, 0x64, 0xd5, 0x0a, 0x7c, 0x5a, 0x72, 0xda, 0x66, 0xe6,
447         0xf9, 0xf5, 0x31, 0x21, 0x92, 0xb0, 0x60, 0x1a, 0xb5, 0xd3, 0xf0, 0xa5,
448         0xfa, 0x48, 0x95, 0x2e, 0x38, 0xd9, 0xc5, 0xe6, 0xda, 0xfb, 0x6c, 0x03,
449         0x9d, 0x4b, 0x69, 0xb7, 0x95, 0xe4, 0x5c, 0xc0, 0x93, 0x4f, 0x48, 0xd9,
450         0x7e, 0x06, 0x22, 0xb2, 0xde, 0xf3, 0x79, 0x24, 0xed, 0xe1, 0xd1, 0x4a,
451         0x57, 0xf1, 0x40, 0x86, 0x70, 0x42, 0x25, 0xc5, 0x27, 0x68, 0xc9, 0xfa,
452         0xe5, 0x8e, 0x62, 0x7e, 0xff, 0x49, 0x6c, 0x5b, 0xb5, 0xba, 0xf9, 0xef,
453         0x9a, 0x1a, 0x10, 0xd4, 0x81, 0x53, 0xcf, 0x83, 0x04, 0x18, 0x1c, 0xe1,
454         0xdb, 0xe1, 0x65, 0xa9, 0x7f, 0xe1, 0x33, 0xeb, 0xc3, 0x4f, 0xe3, 0xb7,
455         0x22, 0xf7, 0x1c, 0x09, 0x4f, 0xed, 0xc6, 0x07, 0x8e, 0x78, 0x05, 0x8f,
456         0x7c, 0x96, 0xd9, 0x12, 0xe0, 0x81, 0x74, 0x1a, 0xe9, 0x13, 0xc0, 0x20,
457         0x82, 0x65, 0xbb, 0x42, 0x3b, 0xed, 0x08, 0x6a, 0x84, 0x4f, 0xea, 0x77,
458         0x14, 0x32, 0xf9, 0xed, 0xc2, 0x12, 0xd6, 0xc5, 0xc6, 0xb3, 0xe5, 0xf2,
459         0x6e, 0xf6, 0x16, 0x7f, 0x37, 0xde, 0xbc, 0x09, 0xc7, 0x06, 0x6b, 0x12,
460         0xbc, 0xad, 0x2d, 0x49, 0x25, 0xd5, 0xdc, 0xf4, 0x18, 0x14, 0xd2, 0xf0,
461         0xf1, 0x1d, 0x1f, 0x3a, 0xaa, 0x15, 0x55, 0xbb, 0x0d, 0x7f, 0xbe, 0x67,
462         0xa1, 0xa7, 0xf0, 0xaa, 0xb3, 0xfb, 0x41, 0x82, 0x39, 0x49, 0x93, 0xbc,
463         0xa8, 0xee, 0x72, 0x13, 0x45, 0x65, 0x15, 0x42, 0x17, 0xaa, 0xd8, 0xab,
464         0xcf, 0x33, 0x42, 0x83, 0x42
465     };
466     static const char group_name[] = "ffdhe2048";
467     static const long priv_len = 224;
468
469     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
470         || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
471         || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
472         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
473                                                       OSSL_PKEY_PARAM_GROUP_NAME,
474                                                       group_name, 0))
475         || !TEST_true(OSSL_PARAM_BLD_push_long(bld, OSSL_PKEY_PARAM_DH_PRIV_LEN,
476                                                priv_len))
477         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY, pub))
478         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, priv))
479         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
480         goto err;
481
482     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL)))
483         goto err;
484
485     if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
486         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
487         || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
488         || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
489         || !TEST_int_eq(EVP_PKEY_size(pk), 256))
490         goto err;
491
492     if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
493                                                   name_out, sizeof(name_out),
494                                                   &len))
495         || !TEST_str_eq(name_out, group_name)
496         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
497                                             &pub_out))
498
499         || !TEST_BN_eq(pub, pub_out)
500         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
501                                             &priv_out))
502         || !TEST_BN_eq(priv, priv_out)
503         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
504         || !TEST_BN_eq(&_bignum_ffdhe2048_p, p)
505         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
506         || !TEST_ptr(q)
507         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
508         || !TEST_BN_eq(&_bignum_const_2, g)
509         || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
510                                              &j))
511         || !TEST_ptr_null(j)
512         || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
513                                                        OSSL_PKEY_PARAM_FFC_SEED,
514                                                        seed_out,
515                                                        sizeof(seed_out), &len))
516         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
517                                              &gindex))
518         || !TEST_int_eq(gindex, -1)
519         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H, &hindex))
520         || !TEST_int_eq(hindex, 0)
521         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
522                                              &pcounter))
523         || !TEST_int_eq(pcounter, -1))
524         goto err;
525
526     if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
527         goto err;
528
529     if (!TEST_true(EVP_PKEY_check(key_ctx))
530         || !TEST_true(EVP_PKEY_public_check(key_ctx))
531         || !TEST_true(EVP_PKEY_private_check(key_ctx))
532         || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
533         goto err;
534
535     if (!TEST_ptr(copy_pk = EVP_PKEY_new())
536         || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
537         goto err;
538
539     ret = test_print_key_using_pem("DH", pk)
540           && test_print_key_using_encoder("DH", pk);
541 err:
542     BN_free(p);
543     BN_free(q);
544     BN_free(g);
545     BN_free(j);
546     BN_free(pub);
547     BN_free(priv);
548     BN_free(pub_out);
549     BN_free(priv_out);
550     EVP_PKEY_free(copy_pk);
551     EVP_PKEY_free(pk);
552     EVP_PKEY_CTX_free(ctx);
553     EVP_PKEY_CTX_free(key_ctx);
554     OSSL_PARAM_BLD_free_params(fromdata_params);
555     OSSL_PARAM_BLD_free(bld);
556
557     return ret;
558 }
559
560 static int test_fromdata_dh_fips186_4(void)
561 {
562     int ret = 0;
563     int gindex = 0, pcounter = 0, hindex = 0;
564     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
565     EVP_PKEY *pk = NULL;
566     size_t len;
567     BIGNUM *pub = NULL, *priv = NULL;
568     BIGNUM *pub_out = NULL, *priv_out = NULL;
569     BIGNUM *p = NULL, *q = NULL, *g = NULL, *j = NULL;
570     OSSL_PARAM_BLD *bld = NULL;
571     OSSL_PARAM *fromdata_params = NULL;
572     char name_out[80];
573     unsigned char seed_out[32];
574
575     /*
576      * DH key data was generated using the following:
577      * openssl genpkey -algorithm DH
578      *                 -pkeyopt group:ffdhe2048 -pkeyopt priv_len:224 -text
579      */
580     static const unsigned char priv_data[] = {
581        0x88, 0x85, 0xe7, 0x9f, 0xee, 0x6d, 0xc5, 0x7c, 0x78, 0xaf, 0x63, 0x5d,
582        0x38, 0x2a, 0xd0, 0xed, 0x56, 0x4b, 0x47, 0x21, 0x2b, 0xfa, 0x55, 0xfa,
583        0x87, 0xe8, 0xa9, 0x7b,
584     };
585     static const unsigned char pub_data[] = {
586        0xd6, 0x2d, 0x77, 0xe0, 0xd3, 0x7d, 0xf8, 0xeb, 0x98, 0x50, 0xa1, 0x82,
587        0x22, 0x65, 0xd5, 0xd9, 0xfe, 0xc9, 0x3f, 0xbe, 0x16, 0x83, 0xbd, 0x33,
588        0xe9, 0xc6, 0x93, 0xcf, 0x08, 0xaf, 0x83, 0xfa, 0x80, 0x8a, 0x6c, 0x64,
589        0xdf, 0x70, 0x64, 0xd5, 0x0a, 0x7c, 0x5a, 0x72, 0xda, 0x66, 0xe6, 0xf9,
590        0xf5, 0x31, 0x21, 0x92, 0xb0, 0x60, 0x1a, 0xb5, 0xd3, 0xf0, 0xa5, 0xfa,
591        0x48, 0x95, 0x2e, 0x38, 0xd9, 0xc5, 0xe6, 0xda, 0xfb, 0x6c, 0x03, 0x9d,
592        0x4b, 0x69, 0xb7, 0x95, 0xe4, 0x5c, 0xc0, 0x93, 0x4f, 0x48, 0xd9, 0x7e,
593        0x06, 0x22, 0xb2, 0xde, 0xf3, 0x79, 0x24, 0xed, 0xe1, 0xd1, 0x4a, 0x57,
594        0xf1, 0x40, 0x86, 0x70, 0x42, 0x25, 0xc5, 0x27, 0x68, 0xc9, 0xfa, 0xe5,
595        0x8e, 0x62, 0x7e, 0xff, 0x49, 0x6c, 0x5b, 0xb5, 0xba, 0xf9, 0xef, 0x9a,
596        0x1a, 0x10, 0xd4, 0x81, 0x53, 0xcf, 0x83, 0x04, 0x18, 0x1c, 0xe1, 0xdb,
597        0xe1, 0x65, 0xa9, 0x7f, 0xe1, 0x33, 0xeb, 0xc3, 0x4f, 0xe3, 0xb7, 0x22,
598        0xf7, 0x1c, 0x09, 0x4f, 0xed, 0xc6, 0x07, 0x8e, 0x78, 0x05, 0x8f, 0x7c,
599        0x96, 0xd9, 0x12, 0xe0, 0x81, 0x74, 0x1a, 0xe9, 0x13, 0xc0, 0x20, 0x82,
600        0x65, 0xbb, 0x42, 0x3b, 0xed, 0x08, 0x6a, 0x84, 0x4f, 0xea, 0x77, 0x14,
601        0x32, 0xf9, 0xed, 0xc2, 0x12, 0xd6, 0xc5, 0xc6, 0xb3, 0xe5, 0xf2, 0x6e,
602        0xf6, 0x16, 0x7f, 0x37, 0xde, 0xbc, 0x09, 0xc7, 0x06, 0x6b, 0x12, 0xbc,
603        0xad, 0x2d, 0x49, 0x25, 0xd5, 0xdc, 0xf4, 0x18, 0x14, 0xd2, 0xf0, 0xf1,
604        0x1d, 0x1f, 0x3a, 0xaa, 0x15, 0x55, 0xbb, 0x0d, 0x7f, 0xbe, 0x67, 0xa1,
605        0xa7, 0xf0, 0xaa, 0xb3, 0xfb, 0x41, 0x82, 0x39, 0x49, 0x93, 0xbc, 0xa8,
606        0xee, 0x72, 0x13, 0x45, 0x65, 0x15, 0x42, 0x17, 0xaa, 0xd8, 0xab, 0xcf,
607        0x33, 0x42, 0x83, 0x42
608     };
609     static const char group_name[] = "ffdhe2048";
610     static const long priv_len = 224;
611
612
613     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
614         || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
615         || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
616         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
617                                                       OSSL_PKEY_PARAM_GROUP_NAME,
618                                                       group_name, 0))
619         || !TEST_true(OSSL_PARAM_BLD_push_long(bld, OSSL_PKEY_PARAM_DH_PRIV_LEN,
620                                                priv_len))
621         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY, pub))
622         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, priv))
623         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
624         goto err;
625
626     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL)))
627         goto err;
628
629     if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
630         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
631         || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
632         || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
633         || !TEST_int_eq(EVP_PKEY_size(pk), 256))
634         goto err;
635
636     if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
637                                                   name_out, sizeof(name_out),
638                                                   &len))
639         || !TEST_str_eq(name_out, group_name)
640         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
641                                             &pub_out))
642         || !TEST_BN_eq(pub, pub_out)
643         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
644                                             &priv_out))
645         || !TEST_BN_eq(priv, priv_out)
646         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
647         || !TEST_BN_eq(&_bignum_ffdhe2048_p, p)
648         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
649         || !TEST_ptr(q)
650         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
651         || !TEST_BN_eq(&_bignum_const_2, g)
652         || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
653                                              &j))
654         || !TEST_ptr_null(j)
655         || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
656                                                        OSSL_PKEY_PARAM_FFC_SEED,
657                                                        seed_out,
658                                                        sizeof(seed_out), &len))
659         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
660                                              &gindex))
661         || !TEST_int_eq(gindex, -1)
662         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H, &hindex))
663         || !TEST_int_eq(hindex, 0)
664         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
665                                              &pcounter))
666         || !TEST_int_eq(pcounter, -1))
667         goto err;
668
669     if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
670         goto err;
671
672     if (!TEST_true(EVP_PKEY_check(key_ctx))
673         || !TEST_true(EVP_PKEY_public_check(key_ctx))
674         || !TEST_true(EVP_PKEY_private_check(key_ctx))
675         || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
676         goto err;
677
678     ret = test_print_key_using_pem("DH", pk)
679           && test_print_key_using_encoder("DH", pk);
680 err:
681     BN_free(p);
682     BN_free(q);
683     BN_free(g);
684     BN_free(j);
685     BN_free(pub);
686     BN_free(priv);
687     BN_free(pub_out);
688     BN_free(priv_out);
689     EVP_PKEY_free(pk);
690     EVP_PKEY_CTX_free(ctx);
691     EVP_PKEY_CTX_free(key_ctx);
692     OSSL_PARAM_BLD_free_params(fromdata_params);
693     OSSL_PARAM_BLD_free(bld);
694
695     return ret;
696 }
697
698 #endif
699
700
701
702 #ifndef OPENSSL_NO_EC
703 /* Array indexes used in test_fromdata_ecx */
704 # define PRIV_KEY        0
705 # define PUB_KEY         1
706
707 # define X25519_IDX      0
708 # define X448_IDX        1
709 # define ED25519_IDX     2
710 # define ED448_IDX       3
711
712 static int test_fromdata_ecx(int tst)
713 {
714     int ret = 0;
715     EVP_PKEY_CTX *ctx = NULL;
716     EVP_PKEY *pk = NULL, *copy_pk = NULL;
717     const char *alg = NULL;
718     size_t len;
719     unsigned char out_pub[ED448_KEYLEN];
720     unsigned char out_priv[ED448_KEYLEN];
721
722     /* ED448_KEYLEN > X448_KEYLEN > X25519_KEYLEN == ED25519_KEYLEN */
723     static unsigned char key_numbers[4][2][ED448_KEYLEN] = {
724         /* X25519: Keys from RFC 7748 6.1 */
725         {
726             /* Private Key */
727             {
728                 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d, 0x3c, 0x16,
729                 0xc1, 0x72, 0x51, 0xb2, 0x66, 0x45, 0xdf, 0x4c, 0x2f, 0x87,
730                 0xeb, 0xc0, 0x99, 0x2a, 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9,
731                 0x2c, 0x2a
732             },
733             /* Public Key */
734             {
735                 0x85, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54, 0x74, 0x8b,
736                 0x7d, 0xdc, 0xb4, 0x3e, 0xf7, 0x5a, 0x0d, 0xbf, 0x3a, 0x0d,
737                 0x26, 0x38, 0x1a, 0xf4, 0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b,
738                 0x4e, 0x6a
739             }
740         },
741         /* X448: Keys from RFC 7748 6.2 */
742         {
743             /* Private Key */
744             {
745                 0x9a, 0x8f, 0x49, 0x25, 0xd1, 0x51, 0x9f, 0x57, 0x75, 0xcf,
746                 0x46, 0xb0, 0x4b, 0x58, 0x00, 0xd4, 0xee, 0x9e, 0xe8, 0xba,
747                 0xe8, 0xbc, 0x55, 0x65, 0xd4, 0x98, 0xc2, 0x8d, 0xd9, 0xc9,
748                 0xba, 0xf5, 0x74, 0xa9, 0x41, 0x97, 0x44, 0x89, 0x73, 0x91,
749                 0x00, 0x63, 0x82, 0xa6, 0xf1, 0x27, 0xab, 0x1d, 0x9a, 0xc2,
750                 0xd8, 0xc0, 0xa5, 0x98, 0x72, 0x6b
751             },
752             /* Public Key */
753             {
754                 0x9b, 0x08, 0xf7, 0xcc, 0x31, 0xb7, 0xe3, 0xe6, 0x7d, 0x22,
755                 0xd5, 0xae, 0xa1, 0x21, 0x07, 0x4a, 0x27, 0x3b, 0xd2, 0xb8,
756                 0x3d, 0xe0, 0x9c, 0x63, 0xfa, 0xa7, 0x3d, 0x2c, 0x22, 0xc5,
757                 0xd9, 0xbb, 0xc8, 0x36, 0x64, 0x72, 0x41, 0xd9, 0x53, 0xd4,
758                 0x0c, 0x5b, 0x12, 0xda, 0x88, 0x12, 0x0d, 0x53, 0x17, 0x7f,
759                 0x80, 0xe5, 0x32, 0xc4, 0x1f, 0xa0
760             }
761         },
762         /* ED25519: Keys from RFC 8032 */
763         {
764             /* Private Key */
765             {
766                 0x9d, 0x61, 0xb1, 0x9d, 0xef, 0xfd, 0x5a, 0x60, 0xba, 0x84,
767                 0x4a, 0xf4, 0x92, 0xec, 0x2c, 0xc4, 0x44, 0x49, 0xc5, 0x69,
768                 0x7b, 0x32, 0x69, 0x19, 0x70, 0x3b, 0xac, 0x03, 0x1c, 0xae,
769                 0x7f, 0x60
770             },
771             /* Public Key */
772             {
773                 0xd7, 0x5a, 0x98, 0x01, 0x82, 0xb1, 0x0a, 0xb7, 0xd5, 0x4b,
774                 0xfe, 0xd3, 0xc9, 0x64, 0x07, 0x3a, 0x0e, 0xe1, 0x72, 0xf3,
775                 0xda, 0xa6, 0x23, 0x25, 0xaf, 0x02, 0x1a, 0x68, 0xf7, 0x07,
776                 0x51, 0x1a
777             }
778         },
779         /* ED448: Keys from RFC 8032 */
780         {
781             /* Private Key */
782             {
783                 0x6c, 0x82, 0xa5, 0x62, 0xcb, 0x80, 0x8d, 0x10, 0xd6, 0x32,
784                 0xbe, 0x89, 0xc8, 0x51, 0x3e, 0xbf, 0x6c, 0x92, 0x9f, 0x34,
785                 0xdd, 0xfa, 0x8c, 0x9f, 0x63, 0xc9, 0x96, 0x0e, 0xf6, 0xe3,
786                 0x48, 0xa3, 0x52, 0x8c, 0x8a, 0x3f, 0xcc, 0x2f, 0x04, 0x4e,
787                 0x39, 0xa3, 0xfc, 0x5b, 0x94, 0x49, 0x2f, 0x8f, 0x03, 0x2e,
788                 0x75, 0x49, 0xa2, 0x00, 0x98, 0xf9, 0x5b
789             },
790             /* Public Key */
791             {
792                 0x5f, 0xd7, 0x44, 0x9b, 0x59, 0xb4, 0x61, 0xfd, 0x2c, 0xe7,
793                 0x87, 0xec, 0x61, 0x6a, 0xd4, 0x6a, 0x1d, 0xa1, 0x34, 0x24,
794                 0x85, 0xa7, 0x0e, 0x1f, 0x8a, 0x0e, 0xa7, 0x5d, 0x80, 0xe9,
795                 0x67, 0x78, 0xed, 0xf1, 0x24, 0x76, 0x9b, 0x46, 0xc7, 0x06,
796                 0x1b, 0xd6, 0x78, 0x3d, 0xf1, 0xe5, 0x0f, 0x6c, 0xd1, 0xfa,
797                 0x1a, 0xbe, 0xaf, 0xe8, 0x25, 0x61, 0x80
798             }
799         }
800     };
801     OSSL_PARAM x25519_fromdata_params[] = {
802         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
803                                 key_numbers[X25519_IDX][PRIV_KEY],
804                                 X25519_KEYLEN),
805         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
806                                 key_numbers[X25519_IDX][PUB_KEY],
807                                 X25519_KEYLEN),
808         OSSL_PARAM_END
809     };
810     OSSL_PARAM x448_fromdata_params[] = {
811         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
812                                 key_numbers[X448_IDX][PRIV_KEY],
813                                 X448_KEYLEN),
814         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
815                                 key_numbers[X448_IDX][PUB_KEY],
816                                 X448_KEYLEN),
817         OSSL_PARAM_END
818     };
819     OSSL_PARAM ed25519_fromdata_params[] = {
820         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
821                                 key_numbers[ED25519_IDX][PRIV_KEY],
822                                 ED25519_KEYLEN),
823         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
824                                 key_numbers[ED25519_IDX][PUB_KEY],
825                                 ED25519_KEYLEN),
826         OSSL_PARAM_END
827     };
828     OSSL_PARAM ed448_fromdata_params[] = {
829         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
830                                 key_numbers[ED448_IDX][PRIV_KEY],
831                                 ED448_KEYLEN),
832         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
833                                 key_numbers[ED448_IDX][PUB_KEY],
834                                 ED448_KEYLEN),
835         OSSL_PARAM_END
836     };
837     OSSL_PARAM *fromdata_params = NULL;
838     int bits = 0, security_bits = 0, size = 0;
839
840     switch (tst) {
841     case X25519_IDX:
842         fromdata_params = x25519_fromdata_params;
843         bits = X25519_BITS;
844         security_bits = X25519_SECURITY_BITS;
845         size = X25519_KEYLEN;
846         alg = "X25519";
847         break;
848
849     case X448_IDX:
850         fromdata_params = x448_fromdata_params;
851         bits = X448_BITS;
852         security_bits = X448_SECURITY_BITS;
853         size = X448_KEYLEN;
854         alg = "X448";
855         break;
856
857     case ED25519_IDX:
858         fromdata_params = ed25519_fromdata_params;
859         bits = ED25519_BITS;
860         security_bits = ED25519_SECURITY_BITS;
861         size = ED25519_KEYLEN;
862         alg = "ED25519";
863         break;
864
865     case ED448_IDX:
866         fromdata_params = ed448_fromdata_params;
867         bits = ED448_BITS;
868         security_bits = ED448_SECURITY_BITS;
869         size = ED448_KEYLEN;
870         alg = "ED448";
871         break;
872     default:
873         goto err;
874     }
875
876     ctx = EVP_PKEY_CTX_new_from_name(NULL, alg, NULL);
877     if (!TEST_ptr(ctx))
878         goto err;
879
880     if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
881         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
882         || !TEST_int_eq(EVP_PKEY_bits(pk), bits)
883         || !TEST_int_eq(EVP_PKEY_security_bits(pk), security_bits)
884         || !TEST_int_eq(EVP_PKEY_size(pk), size))
885         goto err;
886
887     if (!TEST_ptr(copy_pk = EVP_PKEY_new())
888            /* This should succeed because there are no parameters to copy */
889         || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
890         goto err;
891
892     if (!TEST_true(EVP_PKEY_get_octet_string_param(
893                        pk, fromdata_params[PRIV_KEY].key,
894                        out_priv, sizeof(out_priv), &len))
895         || !TEST_mem_eq(out_priv, len,
896                         fromdata_params[PRIV_KEY].data,
897                         fromdata_params[PRIV_KEY].data_size)
898         || !TEST_true(EVP_PKEY_get_octet_string_param(
899                           pk, fromdata_params[PUB_KEY].key,
900                           out_pub, sizeof(out_pub), &len))
901         || !TEST_mem_eq(out_pub, len,
902                         fromdata_params[PUB_KEY].data,
903                         fromdata_params[PUB_KEY].data_size))
904         goto err;
905
906     ret = test_print_key_using_pem(alg, pk)
907           && test_print_key_using_encoder(alg, pk);
908
909 err:
910     EVP_PKEY_free(pk);
911     EVP_PKEY_free(copy_pk);
912     EVP_PKEY_CTX_free(ctx);
913
914     return ret;
915 }
916
917 #define CURVE_NAME 2
918
919 static int test_fromdata_ec(void)
920 {
921     int ret = 0;
922     EVP_PKEY_CTX *ctx = NULL;
923     EVP_PKEY *pk = NULL, *copy_pk = NULL;
924     OSSL_PARAM_BLD *bld = NULL;
925     BIGNUM *ec_priv_bn = NULL;
926     BIGNUM *bn_priv = NULL;
927     OSSL_PARAM *fromdata_params = NULL;
928     const char *alg = "EC";
929     const char *curve = "prime256v1";
930     /* UNCOMPRESSED FORMAT */
931     static const unsigned char ec_pub_keydata[] = {
932        POINT_CONVERSION_UNCOMPRESSED,
933        0x1b, 0x93, 0x67, 0x55, 0x1c, 0x55, 0x9f, 0x63,
934        0xd1, 0x22, 0xa4, 0xd8, 0xd1, 0x0a, 0x60, 0x6d,
935        0x02, 0xa5, 0x77, 0x57, 0xc8, 0xa3, 0x47, 0x73,
936        0x3a, 0x6a, 0x08, 0x28, 0x39, 0xbd, 0xc9, 0xd2,
937        0x80, 0xec, 0xe9, 0xa7, 0x08, 0x29, 0x71, 0x2f,
938        0xc9, 0x56, 0x82, 0xee, 0x9a, 0x85, 0x0f, 0x6d,
939        0x7f, 0x59, 0x5f, 0x8c, 0xd1, 0x96, 0x0b, 0xdf,
940        0x29, 0x3e, 0x49, 0x07, 0x88, 0x3f, 0x9a, 0x29
941     };
942     static const unsigned char ec_priv_keydata[] = {
943         0x33, 0xd0, 0x43, 0x83, 0xa9, 0x89, 0x56, 0x03,
944         0xd2, 0xd7, 0xfe, 0x6b, 0x01, 0x6f, 0xe4, 0x59,
945         0xcc, 0x0d, 0x9a, 0x24, 0x6c, 0x86, 0x1b, 0x2e,
946         0xdc, 0x4b, 0x4d, 0x35, 0x43, 0xe1, 0x1b, 0xad
947     };
948     const int compressed_sz = 1 + (sizeof(ec_pub_keydata) - 1) / 2;
949     unsigned char out_pub[sizeof(ec_pub_keydata)];
950     char out_curve_name[80];
951     const OSSL_PARAM *gettable = NULL;
952     size_t len;
953
954
955     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new()))
956         goto err;
957     if (!TEST_ptr(ec_priv_bn = BN_bin2bn(ec_priv_keydata,
958                                          sizeof(ec_priv_keydata), NULL)))
959         goto err;
960
961     if (OSSL_PARAM_BLD_push_utf8_string(bld, OSSL_PKEY_PARAM_GROUP_NAME,
962                                         curve, 0) <= 0)
963         goto err;
964     if (OSSL_PARAM_BLD_push_octet_string(bld, OSSL_PKEY_PARAM_PUB_KEY,
965                                          ec_pub_keydata,
966                                          sizeof(ec_pub_keydata)) <= 0)
967         goto err;
968     if (OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, ec_priv_bn) <= 0)
969         goto err;
970     if (!TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
971         goto err;
972     ctx = EVP_PKEY_CTX_new_from_name(NULL, alg, NULL);
973     if (!TEST_ptr(ctx))
974         goto err;
975
976     if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
977         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
978         || !TEST_int_eq(EVP_PKEY_bits(pk), 256)
979         || !TEST_int_eq(EVP_PKEY_security_bits(pk), 128)
980         || !TEST_int_eq(EVP_PKEY_size(pk), 2 + 35 * 2))
981         goto err;
982
983     if (!TEST_ptr(copy_pk = EVP_PKEY_new())
984         || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
985         goto err;
986
987     if (!TEST_ptr(gettable = EVP_PKEY_gettable_params(pk))
988         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_GROUP_NAME))
989         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_PUB_KEY))
990         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_PRIV_KEY)))
991         goto err;
992
993     if (!EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
994                                         out_curve_name, sizeof(out_curve_name),
995                                         &len)
996         || !TEST_str_eq(out_curve_name, curve)
997         || !EVP_PKEY_get_octet_string_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
998                                             out_pub, sizeof(out_pub), &len)
999         || !TEST_true(out_pub[0] == (POINT_CONVERSION_COMPRESSED + 1))
1000         || !TEST_mem_eq(out_pub + 1, len - 1,
1001                         ec_pub_keydata + 1, compressed_sz - 1)
1002         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
1003                                             &bn_priv))
1004         || !TEST_BN_eq(ec_priv_bn, bn_priv))
1005         goto err;
1006
1007     ret = test_print_key_using_pem(alg, pk)
1008           && test_print_key_using_encoder(alg, pk);
1009 err:
1010     BN_free(bn_priv);
1011     BN_free(ec_priv_bn);
1012     OSSL_PARAM_BLD_free_params(fromdata_params);
1013     OSSL_PARAM_BLD_free(bld);
1014     EVP_PKEY_free(pk);
1015     EVP_PKEY_free(copy_pk);
1016     EVP_PKEY_CTX_free(ctx);
1017     return ret;
1018 }
1019
1020 #endif /* OPENSSL_NO_EC */
1021
1022 #ifndef OPENSSL_NO_DSA
1023 static int test_fromdata_dsa_fips186_4(void)
1024 {
1025     int ret = 0;
1026     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
1027     EVP_PKEY *pk = NULL, *copy_pk = NULL;
1028     BIGNUM *pub = NULL, *priv = NULL;
1029     BIGNUM *p = NULL, *q = NULL, *g = NULL;
1030     BIGNUM *pub_out = NULL, *priv_out = NULL;
1031     BIGNUM *p_out = NULL, *q_out = NULL, *g_out = NULL, *j_out = NULL;
1032     int gindex_out = 0, pcounter_out = 0, hindex_out = 0;
1033     char name_out[80];
1034     unsigned char seed_out[32];
1035     size_t len;
1036     OSSL_PARAM_BLD *bld = NULL;
1037     OSSL_PARAM *fromdata_params = NULL;
1038
1039     /*
1040      * DSA parameter data was generated using the following:
1041      * openssl genpkey -genparam -algorithm DSA -pkeyopt pbits:2048 \
1042      *                 -pkeyopt qbits:256 -pkeyopt type:0 \
1043      *                 -pkeyopt gindex:1 -out dsa_params.pem -text
1044      */
1045     static const unsigned char p_data[] = {
1046         0x00, 0xa0, 0xb7, 0x02, 0xc4, 0xac, 0xa6, 0x42, 0xab, 0xf2, 0x34, 0x0b,
1047         0x22, 0x47, 0x1f, 0x33, 0xcf, 0xd5, 0x04, 0xe4, 0x3e, 0xec, 0xa1, 0x21,
1048         0xc8, 0x41, 0x2b, 0xef, 0xb8, 0x1f, 0x0b, 0x5b, 0x88, 0x8b, 0x67, 0xf8,
1049         0x68, 0x6d, 0x7c, 0x4d, 0x96, 0x5f, 0x3c, 0x66, 0xef, 0x58, 0x34, 0xd7,
1050         0xf6, 0xa2, 0x1b, 0xad, 0xc8, 0x12, 0x52, 0xb8, 0xe8, 0x2a, 0x63, 0xcc,
1051         0xea, 0xe7, 0x4e, 0xc8, 0x34, 0x4c, 0x58, 0x59, 0x0a, 0xc2, 0x4a, 0xe4,
1052         0xb4, 0x64, 0x20, 0xf4, 0xf6, 0x0a, 0xcf, 0x86, 0x01, 0x6c, 0x7f, 0x23,
1053         0x4a, 0x51, 0x07, 0x99, 0x42, 0x28, 0x7a, 0xff, 0x18, 0x67, 0x52, 0x64,
1054         0xf2, 0x9a, 0x62, 0x30, 0xc3, 0x00, 0xde, 0x23, 0xe9, 0x11, 0x95, 0x7e,
1055         0xd1, 0x3d, 0x8d, 0xb4, 0x0e, 0x9f, 0x9e, 0xb1, 0x30, 0x03, 0xf0, 0x73,
1056         0xa8, 0x40, 0x48, 0x42, 0x7b, 0x60, 0xa0, 0xc4, 0xf2, 0x3b, 0x2d, 0x0a,
1057         0x0c, 0xb8, 0x19, 0xfb, 0xb4, 0xf8, 0xe0, 0x2a, 0xc7, 0xf1, 0xc0, 0xc6,
1058         0x86, 0x14, 0x60, 0x12, 0x0f, 0xc0, 0xde, 0x4a, 0x67, 0xec, 0xc7, 0xde,
1059         0x76, 0x21, 0x1a, 0x55, 0x7f, 0x86, 0xc3, 0x97, 0x98, 0xce, 0xf5, 0xcd,
1060         0xf0, 0xe7, 0x12, 0xd6, 0x93, 0xee, 0x1b, 0x9b, 0x61, 0xef, 0x05, 0x8c,
1061         0x45, 0x46, 0xd9, 0x64, 0x6f, 0xbe, 0x27, 0xaa, 0x67, 0x01, 0xcc, 0x71,
1062         0xb1, 0x60, 0xce, 0x21, 0xd8, 0x51, 0x17, 0x27, 0x0d, 0x90, 0x3d, 0x18,
1063         0x7c, 0x87, 0x15, 0x8e, 0x48, 0x4c, 0x6c, 0xc5, 0x72, 0xeb, 0xb7, 0x56,
1064         0xf5, 0x6b, 0x60, 0x8f, 0xc2, 0xfd, 0x3f, 0x46, 0x5c, 0x00, 0x91, 0x85,
1065         0x79, 0x45, 0x5b, 0x1c, 0x82, 0xc4, 0x87, 0x50, 0x79, 0xba, 0xcc, 0x1c,
1066         0x32, 0x7e, 0x2e, 0xb8, 0x2e, 0xc5, 0x4e, 0xd1, 0x9b, 0xdb, 0x66, 0x79,
1067         0x7c, 0xfe, 0xaf, 0x6a, 0x05
1068     };
1069     static const unsigned char q_data[] = {
1070         0xa8, 0xcd, 0xf4, 0x33, 0x7b, 0x13, 0x0a, 0x24, 0xc1, 0xde, 0x4a, 0x04,
1071         0x7b, 0x4b, 0x71, 0x51, 0x32, 0xe9, 0x47, 0x74, 0xbd, 0x0c, 0x21, 0x40,
1072         0x84, 0x12, 0x0a, 0x17, 0x73, 0xdb, 0x29, 0xc7
1073     };
1074     static const unsigned char g_data[] = {
1075         0x6c, 0xc6, 0xa4, 0x3e, 0x61, 0x84, 0xc1, 0xff, 0x6f, 0x4a, 0x1a, 0x6b,
1076         0xb0, 0x24, 0x4b, 0xd2, 0x92, 0x5b, 0x29, 0x5c, 0x61, 0xb8, 0xc9, 0x2b,
1077         0xd6, 0xf7, 0x59, 0xfd, 0xd8, 0x70, 0x66, 0x77, 0xfc, 0xc1, 0xa4, 0xd4,
1078         0xb0, 0x1e, 0xd5, 0xbf, 0x59, 0x98, 0xb3, 0x66, 0x8b, 0xf4, 0x2e, 0xe6,
1079         0x12, 0x3e, 0xcc, 0xf8, 0x02, 0xb8, 0xc6, 0xc3, 0x47, 0xd2, 0xf5, 0xaa,
1080         0x0c, 0x5f, 0x51, 0xf5, 0xd0, 0x4c, 0x55, 0x3d, 0x07, 0x73, 0xa6, 0x57,
1081         0xce, 0x5a, 0xad, 0x42, 0x0c, 0x13, 0x0f, 0xe2, 0x31, 0x25, 0x8e, 0x72,
1082         0x12, 0x73, 0x10, 0xdb, 0x7f, 0x79, 0xeb, 0x59, 0xfc, 0xfe, 0xf7, 0x0c,
1083         0x1a, 0x81, 0x53, 0x96, 0x22, 0xb8, 0xe7, 0x58, 0xd8, 0x67, 0x80, 0x60,
1084         0xad, 0x8b, 0x55, 0x1c, 0x91, 0xf0, 0x72, 0x9a, 0x7e, 0xad, 0x37, 0xf1,
1085         0x77, 0x18, 0x96, 0x8a, 0x68, 0x70, 0xfc, 0x71, 0xa9, 0xa2, 0xe8, 0x35,
1086         0x27, 0x78, 0xf2, 0xef, 0x59, 0x36, 0x6d, 0x7c, 0xb6, 0x98, 0xd8, 0x1e,
1087         0xfa, 0x25, 0x73, 0x97, 0x45, 0x58, 0xe3, 0xae, 0xbd, 0x52, 0x54, 0x05,
1088         0xd8, 0x26, 0x26, 0xba, 0xba, 0x05, 0xb5, 0xe9, 0xe5, 0x76, 0xae, 0x25,
1089         0xdd, 0xfc, 0x10, 0x89, 0x5a, 0xa9, 0xee, 0x59, 0xc5, 0x79, 0x8b, 0xeb,
1090         0x1e, 0x2c, 0x61, 0xab, 0x0d, 0xd1, 0x10, 0x04, 0x91, 0x32, 0x77, 0x4a,
1091         0xa6, 0x64, 0x53, 0xda, 0x4c, 0xd7, 0x3a, 0x29, 0xd4, 0xf3, 0x82, 0x25,
1092         0x1d, 0x6f, 0x4a, 0x7f, 0xd3, 0x08, 0x3b, 0x42, 0x30, 0x10, 0xd8, 0xd0,
1093         0x97, 0x3a, 0xeb, 0x92, 0x63, 0xec, 0x93, 0x2b, 0x6f, 0x32, 0xd8, 0xcd,
1094         0x80, 0xd3, 0xc0, 0x4c, 0x03, 0xd5, 0xca, 0xbc, 0x8f, 0xc7, 0x43, 0x53,
1095         0x64, 0x66, 0x1c, 0x82, 0x2d, 0xfb, 0xff, 0x39, 0xba, 0xd6, 0x42, 0x62,
1096         0x02, 0x6f, 0x96, 0x36
1097     };
1098     static const unsigned char seed_data[] = {
1099         0x64, 0x46, 0x07, 0x32, 0x8d, 0x70, 0x9c, 0xb3, 0x8a, 0x35, 0xde, 0x62,
1100         0x00, 0xf2, 0x6d, 0x52, 0x37, 0x4d, 0xb3, 0x84, 0xe1, 0x9d, 0x41, 0x04,
1101         0xda, 0x7b, 0xdc, 0x0d, 0x8b, 0x5e, 0xe0, 0x84
1102     };
1103     const int gindex = 1;
1104     const int pcounter = 53;
1105     /*
1106      * The keypair was generated using
1107      * openssl genpkey -paramfile dsa_params.pem --pkeyopt pcounter:53 \
1108      *                 -pkeyopt gindex:1 \
1109      *                 -pkeyopt hexseed:644607328d709cb38a35de6200f26d -text
1110      */
1111     static const unsigned char priv_data[] = {
1112         0x00, 0x8f, 0xc5, 0x9e, 0xd0, 0xf7, 0x2a, 0x0b, 0x66, 0xf1, 0x32, 0x73,
1113         0xae, 0xf6, 0xd9, 0xd4, 0xdb, 0x2d, 0x96, 0x55, 0x89, 0xff, 0xef, 0xa8,
1114         0x5f, 0x47, 0x8f, 0xca, 0x02, 0x8a, 0xe1, 0x35, 0x90
1115     };
1116     static const unsigned char pub_data[] = {
1117         0x44, 0x19, 0xc9, 0x46, 0x45, 0x57, 0xc1, 0xa9, 0xd8, 0x30, 0x99, 0x29,
1118         0x6a, 0x4b, 0x63, 0x71, 0x69, 0x96, 0x35, 0x17, 0xb2, 0x62, 0x9b, 0x80,
1119         0x0a, 0x95, 0x9d, 0x6a, 0xc0, 0x32, 0x0d, 0x07, 0x5f, 0x19, 0x44, 0x02,
1120         0xf1, 0xbd, 0xce, 0xdf, 0x10, 0xf8, 0x02, 0x5d, 0x7d, 0x98, 0x8a, 0x73,
1121         0x89, 0x00, 0xb6, 0x24, 0xd6, 0x33, 0xe7, 0xcf, 0x8b, 0x49, 0x2a, 0xaf,
1122         0x13, 0x1c, 0xb2, 0x52, 0x15, 0xfd, 0x9b, 0xd5, 0x40, 0x4a, 0x1a, 0xda,
1123         0x29, 0x4c, 0x92, 0x7e, 0x66, 0x06, 0xdb, 0x61, 0x86, 0xac, 0xb5, 0xda,
1124         0x3c, 0x7d, 0x73, 0x7e, 0x54, 0x32, 0x68, 0xa5, 0x02, 0xbc, 0x59, 0x47,
1125         0x84, 0xd3, 0x87, 0x71, 0x5f, 0xeb, 0x43, 0x45, 0x24, 0xd3, 0xec, 0x08,
1126         0x52, 0xc2, 0x89, 0x2d, 0x9c, 0x1a, 0xcc, 0x91, 0x65, 0x5d, 0xa3, 0xa1,
1127         0x35, 0x31, 0x10, 0x1c, 0x3a, 0xa8, 0x4d, 0x18, 0xd5, 0x06, 0xaf, 0xb2,
1128         0xec, 0x5c, 0x89, 0x9e, 0x90, 0x86, 0x10, 0x01, 0xeb, 0x51, 0xd5, 0x1b,
1129         0x9c, 0xcb, 0x66, 0x07, 0x3f, 0xc4, 0x6e, 0x0a, 0x1b, 0x73, 0xa0, 0x4b,
1130         0x5f, 0x4d, 0xab, 0x35, 0x28, 0xfa, 0xda, 0x3a, 0x0c, 0x08, 0xe8, 0xf3,
1131         0xef, 0x42, 0x67, 0xbc, 0x21, 0xf2, 0xc2, 0xb8, 0xff, 0x1a, 0x81, 0x05,
1132         0x68, 0x73, 0x62, 0xdf, 0xd7, 0xab, 0x0f, 0x22, 0x89, 0x57, 0x96, 0xd4,
1133         0x93, 0xaf, 0xa1, 0x21, 0xa3, 0x48, 0xe9, 0xf0, 0x97, 0x47, 0xa0, 0x27,
1134         0xba, 0x87, 0xb8, 0x15, 0x5f, 0xff, 0x2c, 0x50, 0x41, 0xf1, 0x7e, 0xc6,
1135         0x81, 0xc4, 0x51, 0xf1, 0xfd, 0xd6, 0x86, 0xf7, 0x69, 0x97, 0xf1, 0x49,
1136         0xc9, 0xf9, 0xf4, 0x9b, 0xf4, 0xe8, 0x85, 0xa7, 0xbd, 0x36, 0x55, 0x4a,
1137         0x3d, 0xe8, 0x65, 0x09, 0x7b, 0xb7, 0x12, 0x64, 0xd2, 0x0a, 0x53, 0x60,
1138         0x48, 0xd1, 0x8a, 0xbd
1139     };
1140
1141     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
1142         || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
1143         || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
1144         || !TEST_ptr(p = BN_bin2bn(p_data, sizeof(p_data), NULL))
1145         || !TEST_ptr(q = BN_bin2bn(q_data, sizeof(q_data), NULL))
1146         || !TEST_ptr(g = BN_bin2bn(g_data, sizeof(g_data), NULL))
1147
1148         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
1149         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
1150         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
1151         || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
1152                                                        OSSL_PKEY_PARAM_FFC_SEED,
1153                                                        seed_data,
1154                                                        sizeof(seed_data)))
1155         || !TEST_true(OSSL_PARAM_BLD_push_int(bld, OSSL_PKEY_PARAM_FFC_GINDEX,
1156                                               gindex))
1157         || !TEST_true(OSSL_PARAM_BLD_push_int(bld,
1158                                               OSSL_PKEY_PARAM_FFC_PCOUNTER,
1159                                               pcounter))
1160         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
1161                                              pub))
1162         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
1163                                              priv))
1164         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
1165         goto err;
1166
1167     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL)))
1168         goto err;
1169
1170     if (!TEST_true(EVP_PKEY_key_fromdata_init(ctx))
1171         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, fromdata_params))
1172         || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
1173         || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
1174         || !TEST_int_eq(EVP_PKEY_size(pk), 2 + 2 * (3 + sizeof(q_data))))
1175         goto err;
1176
1177     if (!TEST_false(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
1178                                                    name_out, sizeof(name_out),
1179                                                    &len))
1180         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
1181                                             &pub_out))
1182         || !TEST_BN_eq(pub, pub_out)
1183         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
1184                                             &priv_out))
1185         || !TEST_BN_eq(priv, priv_out)
1186         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p_out))
1187         || !TEST_BN_eq(p, p_out)
1188         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q_out))
1189         || !TEST_BN_eq(q, q_out)
1190         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g_out))
1191         || !TEST_BN_eq(g, g_out)
1192         || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
1193                                              &j_out))
1194         || !TEST_ptr_null(j_out)
1195         || !TEST_true(EVP_PKEY_get_octet_string_param(pk,
1196                                                       OSSL_PKEY_PARAM_FFC_SEED,
1197                                                       seed_out, sizeof(seed_out),
1198                                                       &len))
1199         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
1200                                              &gindex_out))
1201         || !TEST_int_eq(gindex, gindex_out)
1202         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H,
1203                                              &hindex_out))
1204         || !TEST_int_eq(hindex_out, 0)
1205         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
1206                                              &pcounter_out))
1207         || !TEST_int_eq(pcounter, pcounter_out))
1208         goto err;
1209
1210     if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
1211         goto err;
1212
1213     if (!TEST_true(EVP_PKEY_check(key_ctx))
1214         || !TEST_true(EVP_PKEY_public_check(key_ctx))
1215         || !TEST_true(EVP_PKEY_private_check(key_ctx))
1216         || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
1217         goto err;
1218
1219     if (!TEST_ptr(copy_pk = EVP_PKEY_new())
1220         || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
1221         goto err;
1222
1223     ret = test_print_key_using_pem("DSA", pk)
1224           && test_print_key_using_encoder("DSA", pk);
1225  err:
1226     OSSL_PARAM_BLD_free_params(fromdata_params);
1227     OSSL_PARAM_BLD_free(bld);
1228     BN_free(p);
1229     BN_free(q);
1230     BN_free(g);
1231     BN_free(pub);
1232     BN_free(priv);
1233     BN_free(p_out);
1234     BN_free(q_out);
1235     BN_free(g_out);
1236     BN_free(pub_out);
1237     BN_free(priv_out);
1238     BN_free(j_out);
1239     EVP_PKEY_free(pk);
1240     EVP_PKEY_free(copy_pk);
1241     EVP_PKEY_CTX_free(ctx);
1242     EVP_PKEY_CTX_free(key_ctx);
1243
1244     return ret;
1245 }
1246
1247 static int test_check_dsa(void)
1248 {
1249     int ret = 0;
1250     EVP_PKEY_CTX *ctx = NULL;
1251
1252     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL))
1253         || !TEST_false(EVP_PKEY_check(ctx))
1254         || !TEST_false(EVP_PKEY_public_check(ctx))
1255         || !TEST_false(EVP_PKEY_private_check(ctx))
1256         || !TEST_false(EVP_PKEY_pairwise_check(ctx)))
1257        goto err;
1258
1259     ret = 1;
1260  err:
1261     EVP_PKEY_CTX_free(ctx);
1262
1263     return ret;
1264 }
1265 #endif /* OPENSSL_NO_DSA */
1266
1267
1268 int setup_tests(void)
1269 {
1270     if (!test_skip_common_options()) {
1271         TEST_error("Error parsing test options\n");
1272         return 0;
1273     }
1274
1275     if (!TEST_ptr(datadir = test_get_argument(0)))
1276         return 0;
1277
1278     ADD_TEST(test_evp_pkey_get_bn_param_large);
1279     ADD_TEST(test_fromdata_rsa);
1280 #ifndef OPENSSL_NO_DH
1281     ADD_TEST(test_fromdata_dh_fips186_4);
1282     ADD_TEST(test_fromdata_dh_named_group);
1283 #endif
1284 #ifndef OPENSSL_NO_DSA
1285     ADD_TEST(test_check_dsa);
1286     ADD_TEST(test_fromdata_dsa_fips186_4);
1287 #endif
1288 #ifndef OPENSSL_NO_EC
1289     ADD_ALL_TESTS(test_fromdata_ecx, 4);
1290     ADD_TEST(test_fromdata_ec);
1291 #endif
1292     return 1;
1293 }