Make EVP_PKEY_missing_parameters work properly on provided RSA keys
[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;
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         || !TEST_int_eq(EVP_PKEY_bits(pk), 32)
346         || !TEST_int_eq(EVP_PKEY_security_bits(pk), 8)
347         || !TEST_int_eq(EVP_PKEY_size(pk), 4)
348         || !TEST_false(EVP_PKEY_missing_parameters(pk)))
349         goto err;
350
351     if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
352         goto err;
353
354     if (!TEST_true(EVP_PKEY_check(key_ctx))
355         || !TEST_true(EVP_PKEY_public_check(key_ctx))
356         || !TEST_true(EVP_PKEY_private_check(key_ctx))
357         || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
358         goto err;
359
360     /* EVP_PKEY_copy_parameters() should fail for RSA */
361     if (!TEST_ptr(copy_pk = EVP_PKEY_new())
362         || !TEST_false(EVP_PKEY_copy_parameters(copy_pk, pk)))
363         goto err;
364
365     ret = test_print_key_using_pem("RSA", pk)
366           && test_print_key_using_encoder("RSA", pk);
367  err:
368     /* for better diagnostics always compare key params */
369     for (i = 0; fromdata_params[i].key != NULL; ++i) {
370         if (!TEST_true(BN_set_word(bn_from, key_numbers[i]))
371             || !TEST_true(EVP_PKEY_get_bn_param(pk, fromdata_params[i].key, &bn))
372             || !TEST_BN_eq(bn, bn_from))
373             ret = 0;
374     }
375     BN_free(bn_from);
376     BN_free(bn);
377     EVP_PKEY_free(pk);
378     EVP_PKEY_free(copy_pk);
379     EVP_PKEY_CTX_free(key_ctx);
380     EVP_PKEY_CTX_free(ctx);
381
382     return ret;
383 }
384
385 static int test_evp_pkey_get_bn_param_large(void)
386 {
387     int ret = 0;
388     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
389     EVP_PKEY *pk = NULL;
390     OSSL_PARAM_BLD *bld = NULL;
391     OSSL_PARAM *fromdata_params = NULL;
392     BIGNUM *n = NULL, *e = NULL, *d = NULL, *n_out = NULL;
393     /*
394      * The buffer size chosen here for n_data larger than the buffer used
395      * internally in EVP_PKEY_get_bn_param.
396      */
397     static unsigned char n_data[2050];
398     static const unsigned char e_data[] = {
399         0x1, 0x00, 0x01
400     };
401     static const unsigned char d_data[]= {
402        0x99, 0x33, 0x13, 0x7b
403     };
404
405     /* N is a large buffer */
406     memset(n_data, 0xCE, sizeof(n_data));
407
408     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
409         || !TEST_ptr(n = BN_bin2bn(n_data, sizeof(n_data), NULL))
410         || !TEST_ptr(e = BN_bin2bn(e_data, sizeof(e_data), NULL))
411         || !TEST_ptr(d = BN_bin2bn(d_data, sizeof(d_data), NULL))
412         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n))
413         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E, e))
414         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D, d))
415         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld))
416         || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL))
417         || !TEST_true(EVP_PKEY_fromdata_init(ctx))
418         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
419                                         fromdata_params))
420         || !TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, ""))
421         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_RSA_N, &n_out))
422         || !TEST_BN_eq(n, n_out))
423         goto err;
424     ret = 1;
425  err:
426     BN_free(n_out);
427     BN_free(n);
428     BN_free(e);
429     BN_free(d);
430     EVP_PKEY_free(pk);
431     EVP_PKEY_CTX_free(key_ctx);
432     EVP_PKEY_CTX_free(ctx);
433     OSSL_PARAM_BLD_free_params(fromdata_params);
434     OSSL_PARAM_BLD_free(bld);
435     return ret;
436 }
437
438
439 #ifndef OPENSSL_NO_DH
440 static int test_fromdata_dh_named_group(void)
441 {
442     int ret = 0;
443     int gindex = 0, pcounter = 0, hindex = 0;
444     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
445     EVP_PKEY *pk = NULL, *copy_pk = NULL;
446     size_t len;
447     BIGNUM *pub = NULL, *priv = NULL;
448     BIGNUM *pub_out = NULL, *priv_out = NULL;
449     BIGNUM *p = NULL, *q = NULL, *g = NULL, *j = NULL;
450     OSSL_PARAM *fromdata_params = NULL;
451     OSSL_PARAM_BLD *bld = NULL;
452     char name_out[80];
453     unsigned char seed_out[32];
454
455     /*
456      * DH key data was generated using the following:
457      * openssl genpkey -algorithm DH -pkeyopt group:ffdhe2048
458      *                 -pkeyopt priv_len:224 -text
459      */
460     static const unsigned char priv_data[] = {
461         0x88, 0x85, 0xe7, 0x9f, 0xee, 0x6d, 0xc5, 0x7c, 0x78, 0xaf, 0x63, 0x5d,
462         0x38, 0x2a, 0xd0, 0xed, 0x56, 0x4b, 0x47, 0x21, 0x2b, 0xfa, 0x55, 0xfa,
463         0x87, 0xe8, 0xa9, 0x7b,
464     };
465     static const unsigned char pub_data[] = {
466         0x00, 0xd6, 0x2d, 0x77, 0xe0, 0xd3, 0x7d, 0xf8, 0xeb, 0x98, 0x50, 0xa1,
467         0x82, 0x22, 0x65, 0xd5, 0xd9, 0xfe, 0xc9, 0x3f, 0xbe, 0x16, 0x83, 0xbd,
468         0x33, 0xe9, 0xc6, 0x93, 0xcf, 0x08, 0xaf, 0x83, 0xfa, 0x80, 0x8a, 0x6c,
469         0x64, 0xdf, 0x70, 0x64, 0xd5, 0x0a, 0x7c, 0x5a, 0x72, 0xda, 0x66, 0xe6,
470         0xf9, 0xf5, 0x31, 0x21, 0x92, 0xb0, 0x60, 0x1a, 0xb5, 0xd3, 0xf0, 0xa5,
471         0xfa, 0x48, 0x95, 0x2e, 0x38, 0xd9, 0xc5, 0xe6, 0xda, 0xfb, 0x6c, 0x03,
472         0x9d, 0x4b, 0x69, 0xb7, 0x95, 0xe4, 0x5c, 0xc0, 0x93, 0x4f, 0x48, 0xd9,
473         0x7e, 0x06, 0x22, 0xb2, 0xde, 0xf3, 0x79, 0x24, 0xed, 0xe1, 0xd1, 0x4a,
474         0x57, 0xf1, 0x40, 0x86, 0x70, 0x42, 0x25, 0xc5, 0x27, 0x68, 0xc9, 0xfa,
475         0xe5, 0x8e, 0x62, 0x7e, 0xff, 0x49, 0x6c, 0x5b, 0xb5, 0xba, 0xf9, 0xef,
476         0x9a, 0x1a, 0x10, 0xd4, 0x81, 0x53, 0xcf, 0x83, 0x04, 0x18, 0x1c, 0xe1,
477         0xdb, 0xe1, 0x65, 0xa9, 0x7f, 0xe1, 0x33, 0xeb, 0xc3, 0x4f, 0xe3, 0xb7,
478         0x22, 0xf7, 0x1c, 0x09, 0x4f, 0xed, 0xc6, 0x07, 0x8e, 0x78, 0x05, 0x8f,
479         0x7c, 0x96, 0xd9, 0x12, 0xe0, 0x81, 0x74, 0x1a, 0xe9, 0x13, 0xc0, 0x20,
480         0x82, 0x65, 0xbb, 0x42, 0x3b, 0xed, 0x08, 0x6a, 0x84, 0x4f, 0xea, 0x77,
481         0x14, 0x32, 0xf9, 0xed, 0xc2, 0x12, 0xd6, 0xc5, 0xc6, 0xb3, 0xe5, 0xf2,
482         0x6e, 0xf6, 0x16, 0x7f, 0x37, 0xde, 0xbc, 0x09, 0xc7, 0x06, 0x6b, 0x12,
483         0xbc, 0xad, 0x2d, 0x49, 0x25, 0xd5, 0xdc, 0xf4, 0x18, 0x14, 0xd2, 0xf0,
484         0xf1, 0x1d, 0x1f, 0x3a, 0xaa, 0x15, 0x55, 0xbb, 0x0d, 0x7f, 0xbe, 0x67,
485         0xa1, 0xa7, 0xf0, 0xaa, 0xb3, 0xfb, 0x41, 0x82, 0x39, 0x49, 0x93, 0xbc,
486         0xa8, 0xee, 0x72, 0x13, 0x45, 0x65, 0x15, 0x42, 0x17, 0xaa, 0xd8, 0xab,
487         0xcf, 0x33, 0x42, 0x83, 0x42
488     };
489     static const char group_name[] = "ffdhe2048";
490     static const long priv_len = 224;
491
492     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
493         || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
494         || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
495         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
496                                                       OSSL_PKEY_PARAM_GROUP_NAME,
497                                                       group_name, 0))
498         || !TEST_true(OSSL_PARAM_BLD_push_long(bld, OSSL_PKEY_PARAM_DH_PRIV_LEN,
499                                                priv_len))
500         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY, pub))
501         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, priv))
502         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
503         goto err;
504
505     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL)))
506         goto err;
507
508     if (!TEST_true(EVP_PKEY_fromdata_init(ctx))
509         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
510                                         fromdata_params))
511         || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
512         || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
513         || !TEST_int_eq(EVP_PKEY_size(pk), 256)
514         || !TEST_false(EVP_PKEY_missing_parameters(pk)))
515         goto err;
516
517     if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
518                                                   name_out, sizeof(name_out),
519                                                   &len))
520         || !TEST_str_eq(name_out, group_name)
521         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
522                                             &pub_out))
523
524         || !TEST_BN_eq(pub, pub_out)
525         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
526                                             &priv_out))
527         || !TEST_BN_eq(priv, priv_out)
528         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
529         || !TEST_BN_eq(&ossl_bignum_ffdhe2048_p, p)
530         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
531         || !TEST_ptr(q)
532         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
533         || !TEST_BN_eq(&ossl_bignum_const_2, g)
534         || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
535                                              &j))
536         || !TEST_ptr_null(j)
537         || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
538                                                        OSSL_PKEY_PARAM_FFC_SEED,
539                                                        seed_out,
540                                                        sizeof(seed_out), &len))
541         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
542                                              &gindex))
543         || !TEST_int_eq(gindex, -1)
544         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H, &hindex))
545         || !TEST_int_eq(hindex, 0)
546         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
547                                              &pcounter))
548         || !TEST_int_eq(pcounter, -1))
549         goto err;
550
551     if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
552         goto err;
553
554     if (!TEST_true(EVP_PKEY_check(key_ctx))
555         || !TEST_true(EVP_PKEY_public_check(key_ctx))
556         || !TEST_true(EVP_PKEY_private_check(key_ctx))
557         || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
558         goto err;
559
560     if (!TEST_ptr(copy_pk = EVP_PKEY_new())
561         || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
562         goto err;
563
564     ret = test_print_key_using_pem("DH", pk)
565           && test_print_key_using_encoder("DH", pk);
566 err:
567     BN_free(p);
568     BN_free(q);
569     BN_free(g);
570     BN_free(j);
571     BN_free(pub);
572     BN_free(priv);
573     BN_free(pub_out);
574     BN_free(priv_out);
575     EVP_PKEY_free(copy_pk);
576     EVP_PKEY_free(pk);
577     EVP_PKEY_CTX_free(ctx);
578     EVP_PKEY_CTX_free(key_ctx);
579     OSSL_PARAM_BLD_free_params(fromdata_params);
580     OSSL_PARAM_BLD_free(bld);
581
582     return ret;
583 }
584
585 static int test_fromdata_dh_fips186_4(void)
586 {
587     int ret = 0;
588     int gindex = 0, pcounter = 0, hindex = 0;
589     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
590     EVP_PKEY *pk = NULL;
591     size_t len;
592     BIGNUM *pub = NULL, *priv = NULL;
593     BIGNUM *pub_out = NULL, *priv_out = NULL;
594     BIGNUM *p = NULL, *q = NULL, *g = NULL, *j = NULL;
595     OSSL_PARAM_BLD *bld = NULL;
596     OSSL_PARAM *fromdata_params = NULL;
597     char name_out[80];
598     unsigned char seed_out[32];
599
600     /*
601      * DH key data was generated using the following:
602      * openssl genpkey -algorithm DH
603      *                 -pkeyopt group:ffdhe2048 -pkeyopt priv_len:224 -text
604      */
605     static const unsigned char priv_data[] = {
606        0x88, 0x85, 0xe7, 0x9f, 0xee, 0x6d, 0xc5, 0x7c, 0x78, 0xaf, 0x63, 0x5d,
607        0x38, 0x2a, 0xd0, 0xed, 0x56, 0x4b, 0x47, 0x21, 0x2b, 0xfa, 0x55, 0xfa,
608        0x87, 0xe8, 0xa9, 0x7b,
609     };
610     static const unsigned char pub_data[] = {
611        0xd6, 0x2d, 0x77, 0xe0, 0xd3, 0x7d, 0xf8, 0xeb, 0x98, 0x50, 0xa1, 0x82,
612        0x22, 0x65, 0xd5, 0xd9, 0xfe, 0xc9, 0x3f, 0xbe, 0x16, 0x83, 0xbd, 0x33,
613        0xe9, 0xc6, 0x93, 0xcf, 0x08, 0xaf, 0x83, 0xfa, 0x80, 0x8a, 0x6c, 0x64,
614        0xdf, 0x70, 0x64, 0xd5, 0x0a, 0x7c, 0x5a, 0x72, 0xda, 0x66, 0xe6, 0xf9,
615        0xf5, 0x31, 0x21, 0x92, 0xb0, 0x60, 0x1a, 0xb5, 0xd3, 0xf0, 0xa5, 0xfa,
616        0x48, 0x95, 0x2e, 0x38, 0xd9, 0xc5, 0xe6, 0xda, 0xfb, 0x6c, 0x03, 0x9d,
617        0x4b, 0x69, 0xb7, 0x95, 0xe4, 0x5c, 0xc0, 0x93, 0x4f, 0x48, 0xd9, 0x7e,
618        0x06, 0x22, 0xb2, 0xde, 0xf3, 0x79, 0x24, 0xed, 0xe1, 0xd1, 0x4a, 0x57,
619        0xf1, 0x40, 0x86, 0x70, 0x42, 0x25, 0xc5, 0x27, 0x68, 0xc9, 0xfa, 0xe5,
620        0x8e, 0x62, 0x7e, 0xff, 0x49, 0x6c, 0x5b, 0xb5, 0xba, 0xf9, 0xef, 0x9a,
621        0x1a, 0x10, 0xd4, 0x81, 0x53, 0xcf, 0x83, 0x04, 0x18, 0x1c, 0xe1, 0xdb,
622        0xe1, 0x65, 0xa9, 0x7f, 0xe1, 0x33, 0xeb, 0xc3, 0x4f, 0xe3, 0xb7, 0x22,
623        0xf7, 0x1c, 0x09, 0x4f, 0xed, 0xc6, 0x07, 0x8e, 0x78, 0x05, 0x8f, 0x7c,
624        0x96, 0xd9, 0x12, 0xe0, 0x81, 0x74, 0x1a, 0xe9, 0x13, 0xc0, 0x20, 0x82,
625        0x65, 0xbb, 0x42, 0x3b, 0xed, 0x08, 0x6a, 0x84, 0x4f, 0xea, 0x77, 0x14,
626        0x32, 0xf9, 0xed, 0xc2, 0x12, 0xd6, 0xc5, 0xc6, 0xb3, 0xe5, 0xf2, 0x6e,
627        0xf6, 0x16, 0x7f, 0x37, 0xde, 0xbc, 0x09, 0xc7, 0x06, 0x6b, 0x12, 0xbc,
628        0xad, 0x2d, 0x49, 0x25, 0xd5, 0xdc, 0xf4, 0x18, 0x14, 0xd2, 0xf0, 0xf1,
629        0x1d, 0x1f, 0x3a, 0xaa, 0x15, 0x55, 0xbb, 0x0d, 0x7f, 0xbe, 0x67, 0xa1,
630        0xa7, 0xf0, 0xaa, 0xb3, 0xfb, 0x41, 0x82, 0x39, 0x49, 0x93, 0xbc, 0xa8,
631        0xee, 0x72, 0x13, 0x45, 0x65, 0x15, 0x42, 0x17, 0xaa, 0xd8, 0xab, 0xcf,
632        0x33, 0x42, 0x83, 0x42
633     };
634     static const char group_name[] = "ffdhe2048";
635     static const long priv_len = 224;
636
637
638     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
639         || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
640         || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
641         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
642                                                       OSSL_PKEY_PARAM_GROUP_NAME,
643                                                       group_name, 0))
644         || !TEST_true(OSSL_PARAM_BLD_push_long(bld, OSSL_PKEY_PARAM_DH_PRIV_LEN,
645                                                priv_len))
646         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY, pub))
647         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, priv))
648         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
649         goto err;
650
651     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL)))
652         goto err;
653
654     if (!TEST_true(EVP_PKEY_fromdata_init(ctx))
655         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
656                                         fromdata_params))
657         || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
658         || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
659         || !TEST_int_eq(EVP_PKEY_size(pk), 256)
660         || !TEST_false(EVP_PKEY_missing_parameters(pk)))
661         goto err;
662
663     if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
664                                                   name_out, sizeof(name_out),
665                                                   &len))
666         || !TEST_str_eq(name_out, group_name)
667         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
668                                             &pub_out))
669         || !TEST_BN_eq(pub, pub_out)
670         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
671                                             &priv_out))
672         || !TEST_BN_eq(priv, priv_out)
673         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
674         || !TEST_BN_eq(&ossl_bignum_ffdhe2048_p, p)
675         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
676         || !TEST_ptr(q)
677         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
678         || !TEST_BN_eq(&ossl_bignum_const_2, g)
679         || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
680                                              &j))
681         || !TEST_ptr_null(j)
682         || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
683                                                        OSSL_PKEY_PARAM_FFC_SEED,
684                                                        seed_out,
685                                                        sizeof(seed_out), &len))
686         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
687                                              &gindex))
688         || !TEST_int_eq(gindex, -1)
689         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H, &hindex))
690         || !TEST_int_eq(hindex, 0)
691         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
692                                              &pcounter))
693         || !TEST_int_eq(pcounter, -1))
694         goto err;
695
696     if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
697         goto err;
698
699     if (!TEST_true(EVP_PKEY_check(key_ctx))
700         || !TEST_true(EVP_PKEY_public_check(key_ctx))
701         || !TEST_true(EVP_PKEY_private_check(key_ctx))
702         || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
703         goto err;
704
705     ret = test_print_key_using_pem("DH", pk)
706           && test_print_key_using_encoder("DH", pk);
707 err:
708     BN_free(p);
709     BN_free(q);
710     BN_free(g);
711     BN_free(j);
712     BN_free(pub);
713     BN_free(priv);
714     BN_free(pub_out);
715     BN_free(priv_out);
716     EVP_PKEY_free(pk);
717     EVP_PKEY_CTX_free(ctx);
718     EVP_PKEY_CTX_free(key_ctx);
719     OSSL_PARAM_BLD_free_params(fromdata_params);
720     OSSL_PARAM_BLD_free(bld);
721
722     return ret;
723 }
724
725 #endif
726
727
728
729 #ifndef OPENSSL_NO_EC
730 /* Array indexes used in test_fromdata_ecx */
731 # define PRIV_KEY        0
732 # define PUB_KEY         1
733
734 # define X25519_IDX      0
735 # define X448_IDX        1
736 # define ED25519_IDX     2
737 # define ED448_IDX       3
738
739 /*
740  * tst uses indexes 0 ... (3 * 4 - 1)
741  * For the 4 ECX key types (X25519_IDX..ED448_IDX)
742  * 0..3  = public + private key.
743  * 4..7  = private key (This will generate the public key from the private key)
744  * 8..11 = public key
745  */
746 static int test_fromdata_ecx(int tst)
747 {
748     int ret = 0;
749     EVP_PKEY_CTX *ctx = NULL, *ctx2 = NULL;
750     EVP_PKEY *pk = NULL, *copy_pk = NULL;
751     const char *alg = NULL;
752     size_t len;
753     unsigned char out_pub[ED448_KEYLEN];
754     unsigned char out_priv[ED448_KEYLEN];
755     OSSL_PARAM params[3] = { OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END };
756
757     /* ED448_KEYLEN > X448_KEYLEN > X25519_KEYLEN == ED25519_KEYLEN */
758     static unsigned char key_numbers[4][2][ED448_KEYLEN] = {
759         /* X25519: Keys from RFC 7748 6.1 */
760         {
761             /* Private Key */
762             {
763                 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d, 0x3c, 0x16,
764                 0xc1, 0x72, 0x51, 0xb2, 0x66, 0x45, 0xdf, 0x4c, 0x2f, 0x87,
765                 0xeb, 0xc0, 0x99, 0x2a, 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9,
766                 0x2c, 0x2a
767             },
768             /* Public Key */
769             {
770                 0x85, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54, 0x74, 0x8b,
771                 0x7d, 0xdc, 0xb4, 0x3e, 0xf7, 0x5a, 0x0d, 0xbf, 0x3a, 0x0d,
772                 0x26, 0x38, 0x1a, 0xf4, 0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b,
773                 0x4e, 0x6a
774             }
775         },
776         /* X448: Keys from RFC 7748 6.2 */
777         {
778             /* Private Key */
779             {
780                 0x9a, 0x8f, 0x49, 0x25, 0xd1, 0x51, 0x9f, 0x57, 0x75, 0xcf,
781                 0x46, 0xb0, 0x4b, 0x58, 0x00, 0xd4, 0xee, 0x9e, 0xe8, 0xba,
782                 0xe8, 0xbc, 0x55, 0x65, 0xd4, 0x98, 0xc2, 0x8d, 0xd9, 0xc9,
783                 0xba, 0xf5, 0x74, 0xa9, 0x41, 0x97, 0x44, 0x89, 0x73, 0x91,
784                 0x00, 0x63, 0x82, 0xa6, 0xf1, 0x27, 0xab, 0x1d, 0x9a, 0xc2,
785                 0xd8, 0xc0, 0xa5, 0x98, 0x72, 0x6b
786             },
787             /* Public Key */
788             {
789                 0x9b, 0x08, 0xf7, 0xcc, 0x31, 0xb7, 0xe3, 0xe6, 0x7d, 0x22,
790                 0xd5, 0xae, 0xa1, 0x21, 0x07, 0x4a, 0x27, 0x3b, 0xd2, 0xb8,
791                 0x3d, 0xe0, 0x9c, 0x63, 0xfa, 0xa7, 0x3d, 0x2c, 0x22, 0xc5,
792                 0xd9, 0xbb, 0xc8, 0x36, 0x64, 0x72, 0x41, 0xd9, 0x53, 0xd4,
793                 0x0c, 0x5b, 0x12, 0xda, 0x88, 0x12, 0x0d, 0x53, 0x17, 0x7f,
794                 0x80, 0xe5, 0x32, 0xc4, 0x1f, 0xa0
795             }
796         },
797         /* ED25519: Keys from RFC 8032 */
798         {
799             /* Private Key */
800             {
801                 0x9d, 0x61, 0xb1, 0x9d, 0xef, 0xfd, 0x5a, 0x60, 0xba, 0x84,
802                 0x4a, 0xf4, 0x92, 0xec, 0x2c, 0xc4, 0x44, 0x49, 0xc5, 0x69,
803                 0x7b, 0x32, 0x69, 0x19, 0x70, 0x3b, 0xac, 0x03, 0x1c, 0xae,
804                 0x7f, 0x60
805             },
806             /* Public Key */
807             {
808                 0xd7, 0x5a, 0x98, 0x01, 0x82, 0xb1, 0x0a, 0xb7, 0xd5, 0x4b,
809                 0xfe, 0xd3, 0xc9, 0x64, 0x07, 0x3a, 0x0e, 0xe1, 0x72, 0xf3,
810                 0xda, 0xa6, 0x23, 0x25, 0xaf, 0x02, 0x1a, 0x68, 0xf7, 0x07,
811                 0x51, 0x1a
812             }
813         },
814         /* ED448: Keys from RFC 8032 */
815         {
816             /* Private Key */
817             {
818                 0x6c, 0x82, 0xa5, 0x62, 0xcb, 0x80, 0x8d, 0x10, 0xd6, 0x32,
819                 0xbe, 0x89, 0xc8, 0x51, 0x3e, 0xbf, 0x6c, 0x92, 0x9f, 0x34,
820                 0xdd, 0xfa, 0x8c, 0x9f, 0x63, 0xc9, 0x96, 0x0e, 0xf6, 0xe3,
821                 0x48, 0xa3, 0x52, 0x8c, 0x8a, 0x3f, 0xcc, 0x2f, 0x04, 0x4e,
822                 0x39, 0xa3, 0xfc, 0x5b, 0x94, 0x49, 0x2f, 0x8f, 0x03, 0x2e,
823                 0x75, 0x49, 0xa2, 0x00, 0x98, 0xf9, 0x5b
824             },
825             /* Public Key */
826             {
827                 0x5f, 0xd7, 0x44, 0x9b, 0x59, 0xb4, 0x61, 0xfd, 0x2c, 0xe7,
828                 0x87, 0xec, 0x61, 0x6a, 0xd4, 0x6a, 0x1d, 0xa1, 0x34, 0x24,
829                 0x85, 0xa7, 0x0e, 0x1f, 0x8a, 0x0e, 0xa7, 0x5d, 0x80, 0xe9,
830                 0x67, 0x78, 0xed, 0xf1, 0x24, 0x76, 0x9b, 0x46, 0xc7, 0x06,
831                 0x1b, 0xd6, 0x78, 0x3d, 0xf1, 0xe5, 0x0f, 0x6c, 0xd1, 0xfa,
832                 0x1a, 0xbe, 0xaf, 0xe8, 0x25, 0x61, 0x80
833             }
834         }
835     };
836     OSSL_PARAM x25519_fromdata_params[] = {
837         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
838                                 key_numbers[X25519_IDX][PRIV_KEY],
839                                 X25519_KEYLEN),
840         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
841                                 key_numbers[X25519_IDX][PUB_KEY],
842                                 X25519_KEYLEN),
843         OSSL_PARAM_END
844     };
845     OSSL_PARAM x448_fromdata_params[] = {
846         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
847                                 key_numbers[X448_IDX][PRIV_KEY],
848                                 X448_KEYLEN),
849         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
850                                 key_numbers[X448_IDX][PUB_KEY],
851                                 X448_KEYLEN),
852         OSSL_PARAM_END
853     };
854     OSSL_PARAM ed25519_fromdata_params[] = {
855         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
856                                 key_numbers[ED25519_IDX][PRIV_KEY],
857                                 ED25519_KEYLEN),
858         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
859                                 key_numbers[ED25519_IDX][PUB_KEY],
860                                 ED25519_KEYLEN),
861         OSSL_PARAM_END
862     };
863     OSSL_PARAM ed448_fromdata_params[] = {
864         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
865                                 key_numbers[ED448_IDX][PRIV_KEY],
866                                 ED448_KEYLEN),
867         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
868                                 key_numbers[ED448_IDX][PUB_KEY],
869                                 ED448_KEYLEN),
870         OSSL_PARAM_END
871     };
872     OSSL_PARAM *fromdata_params = NULL;
873     int bits = 0, security_bits = 0, size = 0;
874     OSSL_PARAM *orig_fromdata_params = NULL;
875
876     switch (tst & 3) {
877     case X25519_IDX:
878         fromdata_params = x25519_fromdata_params;
879         bits = X25519_BITS;
880         security_bits = X25519_SECURITY_BITS;
881         size = X25519_KEYLEN;
882         alg = "X25519";
883         break;
884
885     case X448_IDX:
886         fromdata_params = x448_fromdata_params;
887         bits = X448_BITS;
888         security_bits = X448_SECURITY_BITS;
889         size = X448_KEYLEN;
890         alg = "X448";
891         break;
892
893     case ED25519_IDX:
894         fromdata_params = ed25519_fromdata_params;
895         bits = ED25519_BITS;
896         security_bits = ED25519_SECURITY_BITS;
897         size = ED25519_KEYLEN;
898         alg = "ED25519";
899         break;
900
901     case ED448_IDX:
902         fromdata_params = ed448_fromdata_params;
903         bits = ED448_BITS;
904         security_bits = ED448_SECURITY_BITS;
905         size = ED448_KEYLEN;
906         alg = "ED448";
907         break;
908     default:
909         goto err;
910     }
911
912     ctx = EVP_PKEY_CTX_new_from_name(NULL, alg, NULL);
913     if (!TEST_ptr(ctx))
914         goto err;
915
916     orig_fromdata_params = fromdata_params;
917     if (tst > 7) {
918         /* public key only */
919         fromdata_params++;
920     } else if (tst > 3) {
921         /* private key only */
922         params[0] = fromdata_params[0];
923         params[1] = fromdata_params[2];
924         fromdata_params = params;
925     }
926
927     if (!TEST_true(EVP_PKEY_fromdata_init(ctx))
928         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
929                                         fromdata_params))
930         || !TEST_int_eq(EVP_PKEY_bits(pk), bits)
931         || !TEST_int_eq(EVP_PKEY_security_bits(pk), security_bits)
932         || !TEST_int_eq(EVP_PKEY_size(pk), size)
933         || !TEST_false(EVP_PKEY_missing_parameters(pk)))
934         goto err;
935
936     if (!TEST_ptr(ctx2 = EVP_PKEY_CTX_new_from_pkey(NULL, pk, NULL)))
937         goto err;
938     if (tst <= 7) {
939         if (!TEST_true(EVP_PKEY_check(ctx2)))
940             goto err;
941         if (!TEST_true(EVP_PKEY_get_octet_string_param(
942                            pk, orig_fromdata_params[PRIV_KEY].key,
943                            out_priv, sizeof(out_priv), &len))
944             || !TEST_mem_eq(out_priv, len,
945                             orig_fromdata_params[PRIV_KEY].data,
946                             orig_fromdata_params[PRIV_KEY].data_size)
947             || !TEST_true(EVP_PKEY_get_octet_string_param(
948                               pk, orig_fromdata_params[PUB_KEY].key,
949                               out_pub, sizeof(out_pub), &len))
950             || !TEST_mem_eq(out_pub, len,
951                             orig_fromdata_params[PUB_KEY].data,
952                             orig_fromdata_params[PUB_KEY].data_size))
953             goto err;
954     } else {
955         /* The private key check should fail if there is only a public key */
956         if (!TEST_true(EVP_PKEY_public_check(ctx2))
957             || !TEST_false(EVP_PKEY_private_check(ctx2))
958             || !TEST_false(EVP_PKEY_check(ctx2)))
959             goto err;
960     }
961
962     if (!TEST_ptr(copy_pk = EVP_PKEY_new())
963            /* This should succeed because there are no parameters to copy */
964         || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
965         goto err;
966
967     if (tst > 7)
968         ret = test_print_key_using_encoder_public(alg, pk);
969     else
970         ret = test_print_key_using_pem(alg, pk)
971               && test_print_key_using_encoder(alg, pk);
972
973 err:
974     EVP_PKEY_free(pk);
975     EVP_PKEY_free(copy_pk);
976     EVP_PKEY_CTX_free(ctx);
977     EVP_PKEY_CTX_free(ctx2);
978
979     return ret;
980 }
981
982 #define CURVE_NAME 2
983
984 static int test_fromdata_ec(void)
985 {
986     int ret = 0;
987     EVP_PKEY_CTX *ctx = NULL;
988     EVP_PKEY *pk = NULL, *copy_pk = NULL;
989     OSSL_PARAM_BLD *bld = NULL;
990     BIGNUM *ec_priv_bn = NULL;
991     BIGNUM *bn_priv = NULL;
992     OSSL_PARAM *fromdata_params = NULL;
993     const char *alg = "EC";
994     const char *curve = "prime256v1";
995     /* UNCOMPRESSED FORMAT */
996     static const unsigned char ec_pub_keydata[] = {
997        POINT_CONVERSION_UNCOMPRESSED,
998        0x1b, 0x93, 0x67, 0x55, 0x1c, 0x55, 0x9f, 0x63,
999        0xd1, 0x22, 0xa4, 0xd8, 0xd1, 0x0a, 0x60, 0x6d,
1000        0x02, 0xa5, 0x77, 0x57, 0xc8, 0xa3, 0x47, 0x73,
1001        0x3a, 0x6a, 0x08, 0x28, 0x39, 0xbd, 0xc9, 0xd2,
1002        0x80, 0xec, 0xe9, 0xa7, 0x08, 0x29, 0x71, 0x2f,
1003        0xc9, 0x56, 0x82, 0xee, 0x9a, 0x85, 0x0f, 0x6d,
1004        0x7f, 0x59, 0x5f, 0x8c, 0xd1, 0x96, 0x0b, 0xdf,
1005        0x29, 0x3e, 0x49, 0x07, 0x88, 0x3f, 0x9a, 0x29
1006     };
1007     static const unsigned char ec_priv_keydata[] = {
1008         0x33, 0xd0, 0x43, 0x83, 0xa9, 0x89, 0x56, 0x03,
1009         0xd2, 0xd7, 0xfe, 0x6b, 0x01, 0x6f, 0xe4, 0x59,
1010         0xcc, 0x0d, 0x9a, 0x24, 0x6c, 0x86, 0x1b, 0x2e,
1011         0xdc, 0x4b, 0x4d, 0x35, 0x43, 0xe1, 0x1b, 0xad
1012     };
1013     const int compressed_sz = 1 + (sizeof(ec_pub_keydata) - 1) / 2;
1014     unsigned char out_pub[sizeof(ec_pub_keydata)];
1015     char out_curve_name[80];
1016     const OSSL_PARAM *gettable = NULL;
1017     size_t len;
1018
1019
1020     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new()))
1021         goto err;
1022     if (!TEST_ptr(ec_priv_bn = BN_bin2bn(ec_priv_keydata,
1023                                          sizeof(ec_priv_keydata), NULL)))
1024         goto err;
1025
1026     if (OSSL_PARAM_BLD_push_utf8_string(bld, OSSL_PKEY_PARAM_GROUP_NAME,
1027                                         curve, 0) <= 0)
1028         goto err;
1029     if (OSSL_PARAM_BLD_push_octet_string(bld, OSSL_PKEY_PARAM_PUB_KEY,
1030                                          ec_pub_keydata,
1031                                          sizeof(ec_pub_keydata)) <= 0)
1032         goto err;
1033     if (OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, ec_priv_bn) <= 0)
1034         goto err;
1035     if (!TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
1036         goto err;
1037     ctx = EVP_PKEY_CTX_new_from_name(NULL, alg, NULL);
1038     if (!TEST_ptr(ctx))
1039         goto err;
1040
1041     if (!TEST_true(EVP_PKEY_fromdata_init(ctx))
1042         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
1043                                         fromdata_params))
1044         || !TEST_int_eq(EVP_PKEY_bits(pk), 256)
1045         || !TEST_int_eq(EVP_PKEY_security_bits(pk), 128)
1046         || !TEST_int_eq(EVP_PKEY_size(pk), 2 + 35 * 2)
1047         || !TEST_false(EVP_PKEY_missing_parameters(pk)))
1048         goto err;
1049
1050     if (!TEST_ptr(copy_pk = EVP_PKEY_new())
1051         || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
1052         goto err;
1053
1054     if (!TEST_ptr(gettable = EVP_PKEY_gettable_params(pk))
1055         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_GROUP_NAME))
1056         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_PUB_KEY))
1057         || !TEST_ptr(OSSL_PARAM_locate_const(gettable, OSSL_PKEY_PARAM_PRIV_KEY)))
1058         goto err;
1059
1060     if (!EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
1061                                         out_curve_name, sizeof(out_curve_name),
1062                                         &len)
1063         || !TEST_str_eq(out_curve_name, curve)
1064         || !EVP_PKEY_get_octet_string_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
1065                                             out_pub, sizeof(out_pub), &len)
1066         || !TEST_true(out_pub[0] == (POINT_CONVERSION_COMPRESSED + 1))
1067         || !TEST_mem_eq(out_pub + 1, len - 1,
1068                         ec_pub_keydata + 1, compressed_sz - 1)
1069         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
1070                                             &bn_priv))
1071         || !TEST_BN_eq(ec_priv_bn, bn_priv))
1072         goto err;
1073
1074     ret = test_print_key_using_pem(alg, pk)
1075           && test_print_key_using_encoder(alg, pk);
1076 err:
1077     BN_free(bn_priv);
1078     BN_free(ec_priv_bn);
1079     OSSL_PARAM_BLD_free_params(fromdata_params);
1080     OSSL_PARAM_BLD_free(bld);
1081     EVP_PKEY_free(pk);
1082     EVP_PKEY_free(copy_pk);
1083     EVP_PKEY_CTX_free(ctx);
1084     return ret;
1085 }
1086
1087 static int test_ec_dup_no_operation(void)
1088 {
1089     int ret = 0;
1090     EVP_PKEY_CTX *pctx = NULL, *ctx = NULL, *kctx = NULL;
1091     EVP_PKEY *param = NULL, *pkey = NULL;
1092
1093     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL))
1094         || !TEST_int_gt(EVP_PKEY_paramgen_init(pctx), 0)
1095         || !TEST_int_gt(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
1096                         NID_X9_62_prime256v1), 0)
1097         || !TEST_int_gt(EVP_PKEY_paramgen(pctx, &param), 0)
1098         || !TEST_ptr(param))
1099         goto err;
1100
1101     EVP_PKEY_CTX_free(pctx);
1102     pctx = NULL;
1103
1104     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_pkey(NULL, param, NULL))
1105         || !TEST_ptr(kctx = EVP_PKEY_CTX_dup(ctx))
1106         || !TEST_int_gt(EVP_PKEY_keygen_init(kctx), 0)
1107         || !TEST_int_gt(EVP_PKEY_keygen(kctx, &pkey), 0))
1108         goto err;
1109     ret = 1;
1110 err:
1111     EVP_PKEY_free(pkey);
1112     EVP_PKEY_free(param);
1113     EVP_PKEY_CTX_free(ctx);
1114     EVP_PKEY_CTX_free(kctx);
1115     EVP_PKEY_CTX_free(pctx);
1116     return ret;
1117 }
1118
1119 /* Test that keygen doesn't support EVP_PKEY_CTX_dup */
1120 static int test_ec_dup_keygen_operation(void)
1121 {
1122     int ret = 0;
1123     EVP_PKEY_CTX *pctx = NULL, *ctx = NULL, *kctx = NULL;
1124     EVP_PKEY *param = NULL, *pkey = NULL;
1125
1126     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL))
1127         || !TEST_int_gt(EVP_PKEY_paramgen_init(pctx), 0)
1128         || !TEST_int_gt(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
1129                         NID_X9_62_prime256v1), 0)
1130         || !TEST_int_gt(EVP_PKEY_paramgen(pctx, &param), 0)
1131         || !TEST_ptr(param))
1132         goto err;
1133
1134     EVP_PKEY_CTX_free(pctx);
1135     pctx = NULL;
1136
1137     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_pkey(NULL, param, NULL))
1138         || !TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
1139         || !TEST_ptr_null(kctx = EVP_PKEY_CTX_dup(ctx)))
1140         goto err;
1141     ret = 1;
1142 err:
1143     EVP_PKEY_free(pkey);
1144     EVP_PKEY_free(param);
1145     EVP_PKEY_CTX_free(ctx);
1146     EVP_PKEY_CTX_free(kctx);
1147     EVP_PKEY_CTX_free(pctx);
1148     return ret;
1149 }
1150
1151 #endif /* OPENSSL_NO_EC */
1152
1153 #ifndef OPENSSL_NO_DSA
1154 static int test_fromdata_dsa_fips186_4(void)
1155 {
1156     int ret = 0;
1157     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
1158     EVP_PKEY *pk = NULL, *copy_pk = NULL;
1159     BIGNUM *pub = NULL, *priv = NULL;
1160     BIGNUM *p = NULL, *q = NULL, *g = NULL;
1161     BIGNUM *pub_out = NULL, *priv_out = NULL;
1162     BIGNUM *p_out = NULL, *q_out = NULL, *g_out = NULL, *j_out = NULL;
1163     int gindex_out = 0, pcounter_out = 0, hindex_out = 0;
1164     char name_out[80];
1165     unsigned char seed_out[32];
1166     size_t len;
1167     OSSL_PARAM_BLD *bld = NULL;
1168     OSSL_PARAM *fromdata_params = NULL;
1169
1170     /*
1171      * DSA parameter data was generated using the following:
1172      * openssl genpkey -genparam -algorithm DSA -pkeyopt pbits:2048 \
1173      *                 -pkeyopt qbits:256 -pkeyopt type:0 \
1174      *                 -pkeyopt gindex:1 -out dsa_params.pem -text
1175      */
1176     static const unsigned char p_data[] = {
1177         0x00, 0xa0, 0xb7, 0x02, 0xc4, 0xac, 0xa6, 0x42, 0xab, 0xf2, 0x34, 0x0b,
1178         0x22, 0x47, 0x1f, 0x33, 0xcf, 0xd5, 0x04, 0xe4, 0x3e, 0xec, 0xa1, 0x21,
1179         0xc8, 0x41, 0x2b, 0xef, 0xb8, 0x1f, 0x0b, 0x5b, 0x88, 0x8b, 0x67, 0xf8,
1180         0x68, 0x6d, 0x7c, 0x4d, 0x96, 0x5f, 0x3c, 0x66, 0xef, 0x58, 0x34, 0xd7,
1181         0xf6, 0xa2, 0x1b, 0xad, 0xc8, 0x12, 0x52, 0xb8, 0xe8, 0x2a, 0x63, 0xcc,
1182         0xea, 0xe7, 0x4e, 0xc8, 0x34, 0x4c, 0x58, 0x59, 0x0a, 0xc2, 0x4a, 0xe4,
1183         0xb4, 0x64, 0x20, 0xf4, 0xf6, 0x0a, 0xcf, 0x86, 0x01, 0x6c, 0x7f, 0x23,
1184         0x4a, 0x51, 0x07, 0x99, 0x42, 0x28, 0x7a, 0xff, 0x18, 0x67, 0x52, 0x64,
1185         0xf2, 0x9a, 0x62, 0x30, 0xc3, 0x00, 0xde, 0x23, 0xe9, 0x11, 0x95, 0x7e,
1186         0xd1, 0x3d, 0x8d, 0xb4, 0x0e, 0x9f, 0x9e, 0xb1, 0x30, 0x03, 0xf0, 0x73,
1187         0xa8, 0x40, 0x48, 0x42, 0x7b, 0x60, 0xa0, 0xc4, 0xf2, 0x3b, 0x2d, 0x0a,
1188         0x0c, 0xb8, 0x19, 0xfb, 0xb4, 0xf8, 0xe0, 0x2a, 0xc7, 0xf1, 0xc0, 0xc6,
1189         0x86, 0x14, 0x60, 0x12, 0x0f, 0xc0, 0xde, 0x4a, 0x67, 0xec, 0xc7, 0xde,
1190         0x76, 0x21, 0x1a, 0x55, 0x7f, 0x86, 0xc3, 0x97, 0x98, 0xce, 0xf5, 0xcd,
1191         0xf0, 0xe7, 0x12, 0xd6, 0x93, 0xee, 0x1b, 0x9b, 0x61, 0xef, 0x05, 0x8c,
1192         0x45, 0x46, 0xd9, 0x64, 0x6f, 0xbe, 0x27, 0xaa, 0x67, 0x01, 0xcc, 0x71,
1193         0xb1, 0x60, 0xce, 0x21, 0xd8, 0x51, 0x17, 0x27, 0x0d, 0x90, 0x3d, 0x18,
1194         0x7c, 0x87, 0x15, 0x8e, 0x48, 0x4c, 0x6c, 0xc5, 0x72, 0xeb, 0xb7, 0x56,
1195         0xf5, 0x6b, 0x60, 0x8f, 0xc2, 0xfd, 0x3f, 0x46, 0x5c, 0x00, 0x91, 0x85,
1196         0x79, 0x45, 0x5b, 0x1c, 0x82, 0xc4, 0x87, 0x50, 0x79, 0xba, 0xcc, 0x1c,
1197         0x32, 0x7e, 0x2e, 0xb8, 0x2e, 0xc5, 0x4e, 0xd1, 0x9b, 0xdb, 0x66, 0x79,
1198         0x7c, 0xfe, 0xaf, 0x6a, 0x05
1199     };
1200     static const unsigned char q_data[] = {
1201         0xa8, 0xcd, 0xf4, 0x33, 0x7b, 0x13, 0x0a, 0x24, 0xc1, 0xde, 0x4a, 0x04,
1202         0x7b, 0x4b, 0x71, 0x51, 0x32, 0xe9, 0x47, 0x74, 0xbd, 0x0c, 0x21, 0x40,
1203         0x84, 0x12, 0x0a, 0x17, 0x73, 0xdb, 0x29, 0xc7
1204     };
1205     static const unsigned char g_data[] = {
1206         0x6c, 0xc6, 0xa4, 0x3e, 0x61, 0x84, 0xc1, 0xff, 0x6f, 0x4a, 0x1a, 0x6b,
1207         0xb0, 0x24, 0x4b, 0xd2, 0x92, 0x5b, 0x29, 0x5c, 0x61, 0xb8, 0xc9, 0x2b,
1208         0xd6, 0xf7, 0x59, 0xfd, 0xd8, 0x70, 0x66, 0x77, 0xfc, 0xc1, 0xa4, 0xd4,
1209         0xb0, 0x1e, 0xd5, 0xbf, 0x59, 0x98, 0xb3, 0x66, 0x8b, 0xf4, 0x2e, 0xe6,
1210         0x12, 0x3e, 0xcc, 0xf8, 0x02, 0xb8, 0xc6, 0xc3, 0x47, 0xd2, 0xf5, 0xaa,
1211         0x0c, 0x5f, 0x51, 0xf5, 0xd0, 0x4c, 0x55, 0x3d, 0x07, 0x73, 0xa6, 0x57,
1212         0xce, 0x5a, 0xad, 0x42, 0x0c, 0x13, 0x0f, 0xe2, 0x31, 0x25, 0x8e, 0x72,
1213         0x12, 0x73, 0x10, 0xdb, 0x7f, 0x79, 0xeb, 0x59, 0xfc, 0xfe, 0xf7, 0x0c,
1214         0x1a, 0x81, 0x53, 0x96, 0x22, 0xb8, 0xe7, 0x58, 0xd8, 0x67, 0x80, 0x60,
1215         0xad, 0x8b, 0x55, 0x1c, 0x91, 0xf0, 0x72, 0x9a, 0x7e, 0xad, 0x37, 0xf1,
1216         0x77, 0x18, 0x96, 0x8a, 0x68, 0x70, 0xfc, 0x71, 0xa9, 0xa2, 0xe8, 0x35,
1217         0x27, 0x78, 0xf2, 0xef, 0x59, 0x36, 0x6d, 0x7c, 0xb6, 0x98, 0xd8, 0x1e,
1218         0xfa, 0x25, 0x73, 0x97, 0x45, 0x58, 0xe3, 0xae, 0xbd, 0x52, 0x54, 0x05,
1219         0xd8, 0x26, 0x26, 0xba, 0xba, 0x05, 0xb5, 0xe9, 0xe5, 0x76, 0xae, 0x25,
1220         0xdd, 0xfc, 0x10, 0x89, 0x5a, 0xa9, 0xee, 0x59, 0xc5, 0x79, 0x8b, 0xeb,
1221         0x1e, 0x2c, 0x61, 0xab, 0x0d, 0xd1, 0x10, 0x04, 0x91, 0x32, 0x77, 0x4a,
1222         0xa6, 0x64, 0x53, 0xda, 0x4c, 0xd7, 0x3a, 0x29, 0xd4, 0xf3, 0x82, 0x25,
1223         0x1d, 0x6f, 0x4a, 0x7f, 0xd3, 0x08, 0x3b, 0x42, 0x30, 0x10, 0xd8, 0xd0,
1224         0x97, 0x3a, 0xeb, 0x92, 0x63, 0xec, 0x93, 0x2b, 0x6f, 0x32, 0xd8, 0xcd,
1225         0x80, 0xd3, 0xc0, 0x4c, 0x03, 0xd5, 0xca, 0xbc, 0x8f, 0xc7, 0x43, 0x53,
1226         0x64, 0x66, 0x1c, 0x82, 0x2d, 0xfb, 0xff, 0x39, 0xba, 0xd6, 0x42, 0x62,
1227         0x02, 0x6f, 0x96, 0x36
1228     };
1229     static const unsigned char seed_data[] = {
1230         0x64, 0x46, 0x07, 0x32, 0x8d, 0x70, 0x9c, 0xb3, 0x8a, 0x35, 0xde, 0x62,
1231         0x00, 0xf2, 0x6d, 0x52, 0x37, 0x4d, 0xb3, 0x84, 0xe1, 0x9d, 0x41, 0x04,
1232         0xda, 0x7b, 0xdc, 0x0d, 0x8b, 0x5e, 0xe0, 0x84
1233     };
1234     const int gindex = 1;
1235     const int pcounter = 53;
1236     /*
1237      * The keypair was generated using
1238      * openssl genpkey -paramfile dsa_params.pem --pkeyopt pcounter:53 \
1239      *                 -pkeyopt gindex:1 \
1240      *                 -pkeyopt hexseed:644607328d709cb38a35de6200f26d -text
1241      */
1242     static const unsigned char priv_data[] = {
1243         0x00, 0x8f, 0xc5, 0x9e, 0xd0, 0xf7, 0x2a, 0x0b, 0x66, 0xf1, 0x32, 0x73,
1244         0xae, 0xf6, 0xd9, 0xd4, 0xdb, 0x2d, 0x96, 0x55, 0x89, 0xff, 0xef, 0xa8,
1245         0x5f, 0x47, 0x8f, 0xca, 0x02, 0x8a, 0xe1, 0x35, 0x90
1246     };
1247     static const unsigned char pub_data[] = {
1248         0x44, 0x19, 0xc9, 0x46, 0x45, 0x57, 0xc1, 0xa9, 0xd8, 0x30, 0x99, 0x29,
1249         0x6a, 0x4b, 0x63, 0x71, 0x69, 0x96, 0x35, 0x17, 0xb2, 0x62, 0x9b, 0x80,
1250         0x0a, 0x95, 0x9d, 0x6a, 0xc0, 0x32, 0x0d, 0x07, 0x5f, 0x19, 0x44, 0x02,
1251         0xf1, 0xbd, 0xce, 0xdf, 0x10, 0xf8, 0x02, 0x5d, 0x7d, 0x98, 0x8a, 0x73,
1252         0x89, 0x00, 0xb6, 0x24, 0xd6, 0x33, 0xe7, 0xcf, 0x8b, 0x49, 0x2a, 0xaf,
1253         0x13, 0x1c, 0xb2, 0x52, 0x15, 0xfd, 0x9b, 0xd5, 0x40, 0x4a, 0x1a, 0xda,
1254         0x29, 0x4c, 0x92, 0x7e, 0x66, 0x06, 0xdb, 0x61, 0x86, 0xac, 0xb5, 0xda,
1255         0x3c, 0x7d, 0x73, 0x7e, 0x54, 0x32, 0x68, 0xa5, 0x02, 0xbc, 0x59, 0x47,
1256         0x84, 0xd3, 0x87, 0x71, 0x5f, 0xeb, 0x43, 0x45, 0x24, 0xd3, 0xec, 0x08,
1257         0x52, 0xc2, 0x89, 0x2d, 0x9c, 0x1a, 0xcc, 0x91, 0x65, 0x5d, 0xa3, 0xa1,
1258         0x35, 0x31, 0x10, 0x1c, 0x3a, 0xa8, 0x4d, 0x18, 0xd5, 0x06, 0xaf, 0xb2,
1259         0xec, 0x5c, 0x89, 0x9e, 0x90, 0x86, 0x10, 0x01, 0xeb, 0x51, 0xd5, 0x1b,
1260         0x9c, 0xcb, 0x66, 0x07, 0x3f, 0xc4, 0x6e, 0x0a, 0x1b, 0x73, 0xa0, 0x4b,
1261         0x5f, 0x4d, 0xab, 0x35, 0x28, 0xfa, 0xda, 0x3a, 0x0c, 0x08, 0xe8, 0xf3,
1262         0xef, 0x42, 0x67, 0xbc, 0x21, 0xf2, 0xc2, 0xb8, 0xff, 0x1a, 0x81, 0x05,
1263         0x68, 0x73, 0x62, 0xdf, 0xd7, 0xab, 0x0f, 0x22, 0x89, 0x57, 0x96, 0xd4,
1264         0x93, 0xaf, 0xa1, 0x21, 0xa3, 0x48, 0xe9, 0xf0, 0x97, 0x47, 0xa0, 0x27,
1265         0xba, 0x87, 0xb8, 0x15, 0x5f, 0xff, 0x2c, 0x50, 0x41, 0xf1, 0x7e, 0xc6,
1266         0x81, 0xc4, 0x51, 0xf1, 0xfd, 0xd6, 0x86, 0xf7, 0x69, 0x97, 0xf1, 0x49,
1267         0xc9, 0xf9, 0xf4, 0x9b, 0xf4, 0xe8, 0x85, 0xa7, 0xbd, 0x36, 0x55, 0x4a,
1268         0x3d, 0xe8, 0x65, 0x09, 0x7b, 0xb7, 0x12, 0x64, 0xd2, 0x0a, 0x53, 0x60,
1269         0x48, 0xd1, 0x8a, 0xbd
1270     };
1271
1272     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
1273         || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
1274         || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
1275         || !TEST_ptr(p = BN_bin2bn(p_data, sizeof(p_data), NULL))
1276         || !TEST_ptr(q = BN_bin2bn(q_data, sizeof(q_data), NULL))
1277         || !TEST_ptr(g = BN_bin2bn(g_data, sizeof(g_data), NULL))
1278
1279         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
1280         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
1281         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
1282         || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
1283                                                        OSSL_PKEY_PARAM_FFC_SEED,
1284                                                        seed_data,
1285                                                        sizeof(seed_data)))
1286         || !TEST_true(OSSL_PARAM_BLD_push_int(bld, OSSL_PKEY_PARAM_FFC_GINDEX,
1287                                               gindex))
1288         || !TEST_true(OSSL_PARAM_BLD_push_int(bld,
1289                                               OSSL_PKEY_PARAM_FFC_PCOUNTER,
1290                                               pcounter))
1291         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
1292                                              pub))
1293         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
1294                                              priv))
1295         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
1296         goto err;
1297
1298     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL)))
1299         goto err;
1300
1301     if (!TEST_true(EVP_PKEY_fromdata_init(ctx))
1302         || !TEST_true(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
1303                                         fromdata_params))
1304         || !TEST_int_eq(EVP_PKEY_bits(pk), 2048)
1305         || !TEST_int_eq(EVP_PKEY_security_bits(pk), 112)
1306         || !TEST_int_eq(EVP_PKEY_size(pk), 2 + 2 * (3 + sizeof(q_data)))
1307         || !TEST_false(EVP_PKEY_missing_parameters(pk)))
1308         goto err;
1309
1310     if (!TEST_false(EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
1311                                                    name_out, sizeof(name_out),
1312                                                    &len))
1313         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
1314                                             &pub_out))
1315         || !TEST_BN_eq(pub, pub_out)
1316         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
1317                                             &priv_out))
1318         || !TEST_BN_eq(priv, priv_out)
1319         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p_out))
1320         || !TEST_BN_eq(p, p_out)
1321         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q_out))
1322         || !TEST_BN_eq(q, q_out)
1323         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g_out))
1324         || !TEST_BN_eq(g, g_out)
1325         || !TEST_false(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_COFACTOR,
1326                                              &j_out))
1327         || !TEST_ptr_null(j_out)
1328         || !TEST_true(EVP_PKEY_get_octet_string_param(pk,
1329                                                       OSSL_PKEY_PARAM_FFC_SEED,
1330                                                       seed_out, sizeof(seed_out),
1331                                                       &len))
1332         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
1333                                              &gindex_out))
1334         || !TEST_int_eq(gindex, gindex_out)
1335         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H,
1336                                              &hindex_out))
1337         || !TEST_int_eq(hindex_out, 0)
1338         || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_PCOUNTER,
1339                                              &pcounter_out))
1340         || !TEST_int_eq(pcounter, pcounter_out))
1341         goto err;
1342
1343     if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
1344         goto err;
1345
1346     if (!TEST_true(EVP_PKEY_check(key_ctx))
1347         || !TEST_true(EVP_PKEY_public_check(key_ctx))
1348         || !TEST_true(EVP_PKEY_private_check(key_ctx))
1349         || !TEST_true(EVP_PKEY_pairwise_check(key_ctx)))
1350         goto err;
1351
1352     if (!TEST_ptr(copy_pk = EVP_PKEY_new())
1353         || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
1354         goto err;
1355
1356     ret = test_print_key_using_pem("DSA", pk)
1357           && test_print_key_using_encoder("DSA", pk);
1358  err:
1359     OSSL_PARAM_BLD_free_params(fromdata_params);
1360     OSSL_PARAM_BLD_free(bld);
1361     BN_free(p);
1362     BN_free(q);
1363     BN_free(g);
1364     BN_free(pub);
1365     BN_free(priv);
1366     BN_free(p_out);
1367     BN_free(q_out);
1368     BN_free(g_out);
1369     BN_free(pub_out);
1370     BN_free(priv_out);
1371     BN_free(j_out);
1372     EVP_PKEY_free(pk);
1373     EVP_PKEY_free(copy_pk);
1374     EVP_PKEY_CTX_free(ctx);
1375     EVP_PKEY_CTX_free(key_ctx);
1376
1377     return ret;
1378 }
1379
1380 static int test_check_dsa(void)
1381 {
1382     int ret = 0;
1383     EVP_PKEY_CTX *ctx = NULL;
1384
1385     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL))
1386         || !TEST_false(EVP_PKEY_check(ctx))
1387         || !TEST_false(EVP_PKEY_public_check(ctx))
1388         || !TEST_false(EVP_PKEY_private_check(ctx))
1389         || !TEST_false(EVP_PKEY_pairwise_check(ctx)))
1390        goto err;
1391
1392     ret = 1;
1393  err:
1394     EVP_PKEY_CTX_free(ctx);
1395
1396     return ret;
1397 }
1398 #endif /* OPENSSL_NO_DSA */
1399
1400
1401 int setup_tests(void)
1402 {
1403     if (!test_skip_common_options()) {
1404         TEST_error("Error parsing test options\n");
1405         return 0;
1406     }
1407
1408     if (!TEST_ptr(datadir = test_get_argument(0)))
1409         return 0;
1410
1411     ADD_TEST(test_evp_pkey_get_bn_param_large);
1412     ADD_TEST(test_fromdata_rsa);
1413 #ifndef OPENSSL_NO_DH
1414     ADD_TEST(test_fromdata_dh_fips186_4);
1415     ADD_TEST(test_fromdata_dh_named_group);
1416 #endif
1417 #ifndef OPENSSL_NO_DSA
1418     ADD_TEST(test_check_dsa);
1419     ADD_TEST(test_fromdata_dsa_fips186_4);
1420 #endif
1421 #ifndef OPENSSL_NO_EC
1422     ADD_ALL_TESTS(test_fromdata_ecx, 4 * 3);
1423     ADD_TEST(test_fromdata_ec);
1424     ADD_TEST(test_ec_dup_no_operation);
1425     ADD_TEST(test_ec_dup_keygen_operation);
1426 #endif
1427     return 1;
1428 }