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