Home | History | Annotate | Line # | Download | only in test
      1 /*
      2  * Copyright 2019-2025 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 <openssl/sha.h>
     18 #include "crypto/ecx.h"
     19 #include "crypto/evp.h" /* For the internal API */
     20 #include "crypto/bn_dh.h" /* _bignum_ffdhe2048_p */
     21 #include "internal/nelem.h"
     22 #include "testutil.h"
     23 
     24 static char *datadir = NULL;
     25 
     26 /*
     27  * Do not change the order of the following defines unless you also
     28  * update the for loop bounds used inside test_print_key_using_encoder() and
     29  * test_print_key_using_encoder_public().
     30  */
     31 #define PRIV_TEXT 0
     32 #define PRIV_PEM 1
     33 #define PRIV_DER 2
     34 #define PUB_TEXT 3
     35 #define PUB_PEM 4
     36 #define PUB_DER 5
     37 
     38 static void stripcr(char *buf, size_t *len)
     39 {
     40     size_t i;
     41     char *curr, *writ;
     42 
     43     for (i = *len, curr = buf, writ = buf; i > 0; i--, curr++) {
     44         if (*curr == '\r') {
     45             (*len)--;
     46             continue;
     47         }
     48         if (curr != writ)
     49             *writ = *curr;
     50         writ++;
     51     }
     52 }
     53 
     54 static int compare_with_file(const char *alg, int type, BIO *membio)
     55 {
     56     char filename[80];
     57     BIO *file = NULL;
     58     char buf[4096];
     59     char *memdata, *fullfile = NULL;
     60     const char *suffix;
     61     size_t readbytes;
     62     int ret = 0;
     63     int len;
     64     size_t slen;
     65 
     66     switch (type) {
     67     case PRIV_TEXT:
     68         suffix = "priv.txt";
     69         break;
     70 
     71     case PRIV_PEM:
     72         suffix = "priv.pem";
     73         break;
     74 
     75     case PRIV_DER:
     76         suffix = "priv.der";
     77         break;
     78 
     79     case PUB_TEXT:
     80         suffix = "pub.txt";
     81         break;
     82 
     83     case PUB_PEM:
     84         suffix = "pub.pem";
     85         break;
     86 
     87     case PUB_DER:
     88         suffix = "pub.der";
     89         break;
     90 
     91     default:
     92         TEST_error("Invalid file type");
     93         goto err;
     94     }
     95 
     96     BIO_snprintf(filename, sizeof(filename), "%s.%s", alg, suffix);
     97     fullfile = test_mk_file_path(datadir, filename);
     98     if (!TEST_ptr(fullfile))
     99         goto err;
    100 
    101     file = BIO_new_file(fullfile, "rb");
    102     if (!TEST_ptr(file))
    103         goto err;
    104 
    105     if (!TEST_true(BIO_read_ex(file, buf, sizeof(buf), &readbytes))
    106         || !TEST_true(BIO_eof(file))
    107         || !TEST_size_t_lt(readbytes, sizeof(buf)))
    108         goto err;
    109 
    110     len = BIO_get_mem_data(membio, &memdata);
    111     if (!TEST_int_gt(len, 0))
    112         goto err;
    113 
    114     slen = len;
    115     if (type != PRIV_DER && type != PUB_DER) {
    116         stripcr(memdata, &slen);
    117         stripcr(buf, &readbytes);
    118     }
    119 
    120     if (!TEST_mem_eq(memdata, slen, buf, readbytes))
    121         goto err;
    122 
    123     ret = 1;
    124 err:
    125     OPENSSL_free(fullfile);
    126     (void)BIO_reset(membio);
    127     BIO_free(file);
    128     return ret;
    129 }
    130 
    131 static int pass_cb(char *buf, int size, int rwflag, void *u)
    132 {
    133     return 0;
    134 }
    135 
    136 static int pass_cb_error(char *buf, int size, int rwflag, void *u)
    137 {
    138     return -1;
    139 }
    140 
    141 static int test_print_key_using_pem(const char *alg, const EVP_PKEY *pk)
    142 {
    143     BIO *membio = BIO_new(BIO_s_mem());
    144     int ret = 0;
    145 
    146     if (!TEST_ptr(membio))
    147         goto err;
    148 
    149     if (/* Output Encrypted private key in PEM form */
    150         !TEST_true(PEM_write_bio_PrivateKey(bio_out, pk, EVP_aes_256_cbc(),
    151             (unsigned char *)"pass", 4,
    152             NULL, NULL))
    153         /* Output zero-length passphrase encrypted private key in PEM form */
    154         || !TEST_true(PEM_write_bio_PKCS8PrivateKey(bio_out, pk,
    155             EVP_aes_256_cbc(),
    156             (const char *)~0, 0,
    157             NULL, NULL))
    158         || !TEST_true(PEM_write_bio_PKCS8PrivateKey(bio_out, pk,
    159             EVP_aes_256_cbc(),
    160             NULL, 0, NULL, ""))
    161         || !TEST_true(PEM_write_bio_PKCS8PrivateKey(bio_out, pk,
    162             EVP_aes_256_cbc(),
    163             NULL, 0, pass_cb, NULL))
    164         || !TEST_false(PEM_write_bio_PKCS8PrivateKey(bio_out, pk,
    165             EVP_aes_256_cbc(),
    166             NULL, 0, pass_cb_error,
    167             NULL))
    168 #ifndef OPENSSL_NO_DES
    169         || !TEST_true(PEM_write_bio_PKCS8PrivateKey_nid(
    170             bio_out, pk, NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
    171             (const char *)~0, 0, NULL, NULL))
    172         || !TEST_true(PEM_write_bio_PKCS8PrivateKey_nid(
    173             bio_out, pk, NID_pbe_WithSHA1And3_Key_TripleDES_CBC, NULL, 0,
    174             NULL, ""))
    175         || !TEST_true(PEM_write_bio_PKCS8PrivateKey_nid(
    176             bio_out, pk, NID_pbe_WithSHA1And3_Key_TripleDES_CBC, NULL, 0,
    177             pass_cb, NULL))
    178         || !TEST_false(PEM_write_bio_PKCS8PrivateKey_nid(
    179             bio_out, pk, NID_pbe_WithSHA1And3_Key_TripleDES_CBC, NULL, 0,
    180             pass_cb_error, NULL))
    181 #endif
    182         /* Private key in text form */
    183         || !TEST_int_gt(EVP_PKEY_print_private(membio, pk, 0, NULL), 0)
    184         || !TEST_true(compare_with_file(alg, PRIV_TEXT, membio))
    185         /* Public key in PEM form */
    186         || !TEST_true(PEM_write_bio_PUBKEY(membio, pk))
    187         || !TEST_true(compare_with_file(alg, PUB_PEM, membio))
    188         /* Unencrypted private key in PEM form */
    189         || !TEST_true(PEM_write_bio_PrivateKey(membio, pk,
    190             NULL, NULL, 0, NULL, NULL))
    191         || !TEST_true(compare_with_file(alg, PRIV_PEM, membio))
    192         /* NULL key */
    193         || !TEST_false(PEM_write_bio_PrivateKey(membio, NULL,
    194             NULL, NULL, 0, NULL, NULL))
    195         || !TEST_false(PEM_write_bio_PrivateKey_traditional(membio, NULL,
    196             NULL, NULL, 0, NULL, NULL)))
    197         goto err;
    198 
    199     ret = 1;
    200 err:
    201     BIO_free(membio);
    202     return ret;
    203 }
    204 
    205 static int test_print_key_type_using_encoder(const char *alg, int type,
    206     const EVP_PKEY *pk)
    207 {
    208     const char *output_type, *output_structure;
    209     int selection;
    210     OSSL_ENCODER_CTX *ctx = NULL;
    211     BIO *membio = BIO_new(BIO_s_mem());
    212     int ret = 0;
    213 
    214     switch (type) {
    215     case PRIV_TEXT:
    216         output_type = "TEXT";
    217         output_structure = NULL;
    218         selection = OSSL_KEYMGMT_SELECT_KEYPAIR
    219             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
    220         break;
    221 
    222     case PRIV_PEM:
    223         output_type = "PEM";
    224         output_structure = "PrivateKeyInfo";
    225         selection = OSSL_KEYMGMT_SELECT_KEYPAIR
    226             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
    227         break;
    228 
    229     case PRIV_DER:
    230         output_type = "DER";
    231         output_structure = "PrivateKeyInfo";
    232         selection = OSSL_KEYMGMT_SELECT_KEYPAIR
    233             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
    234         break;
    235 
    236     case PUB_TEXT:
    237         output_type = "TEXT";
    238         output_structure = NULL;
    239         selection = OSSL_KEYMGMT_SELECT_PUBLIC_KEY
    240             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
    241         break;
    242 
    243     case PUB_PEM:
    244         output_type = "PEM";
    245         output_structure = "SubjectPublicKeyInfo";
    246         selection = OSSL_KEYMGMT_SELECT_PUBLIC_KEY
    247             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
    248         break;
    249 
    250     case PUB_DER:
    251         output_type = "DER";
    252         output_structure = "SubjectPublicKeyInfo";
    253         selection = OSSL_KEYMGMT_SELECT_PUBLIC_KEY
    254             | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS;
    255         break;
    256 
    257     default:
    258         TEST_error("Invalid encoding type");
    259         goto err;
    260     }
    261 
    262     if (!TEST_ptr(membio))
    263         goto err;
    264 
    265     /* Make a context, it's valid for several prints */
    266     TEST_note("Setting up a OSSL_ENCODER context with passphrase");
    267     if (!TEST_ptr(ctx = OSSL_ENCODER_CTX_new_for_pkey(pk, selection,
    268                       output_type,
    269                       output_structure,
    270                       NULL))
    271         /* Check that this operation is supported */
    272         || !TEST_int_ne(OSSL_ENCODER_CTX_get_num_encoders(ctx), 0))
    273         goto err;
    274 
    275     /* Use no cipher.  This should give us an unencrypted PEM */
    276     TEST_note("Testing with no encryption");
    277     if (!TEST_true(OSSL_ENCODER_to_bio(ctx, membio))
    278         || !TEST_true(compare_with_file(alg, type, membio)))
    279         goto err;
    280 
    281     if (type == PRIV_PEM) {
    282         /* Set a passphrase to be used later */
    283         if (!TEST_true(OSSL_ENCODER_CTX_set_passphrase(ctx,
    284                 (unsigned char *)"pass",
    285                 4)))
    286             goto err;
    287 
    288         /* Use a valid cipher name */
    289         TEST_note("Displaying PEM encrypted with AES-256-CBC");
    290         if (!TEST_true(OSSL_ENCODER_CTX_set_cipher(ctx, "AES-256-CBC", NULL))
    291             || !TEST_true(OSSL_ENCODER_to_bio(ctx, bio_out)))
    292             goto err;
    293 
    294         /* Use an invalid cipher name, which should generate no output */
    295         TEST_note("NOT Displaying PEM encrypted with (invalid) FOO");
    296         if (!TEST_false(OSSL_ENCODER_CTX_set_cipher(ctx, "FOO", NULL))
    297             || !TEST_false(OSSL_ENCODER_to_bio(ctx, bio_out)))
    298             goto err;
    299 
    300         /* Clear the cipher.  This should give us an unencrypted PEM again */
    301         TEST_note("Testing with encryption cleared (no encryption)");
    302         if (!TEST_true(OSSL_ENCODER_CTX_set_cipher(ctx, NULL, NULL))
    303             || !TEST_true(OSSL_ENCODER_to_bio(ctx, membio))
    304             || !TEST_true(compare_with_file(alg, type, membio)))
    305             goto err;
    306     }
    307     ret = 1;
    308 err:
    309     BIO_free(membio);
    310     OSSL_ENCODER_CTX_free(ctx);
    311     return ret;
    312 }
    313 
    314 static int test_print_key_using_encoder(const char *alg, const EVP_PKEY *pk)
    315 {
    316     int i;
    317     int ret = 1;
    318 
    319     for (i = PRIV_TEXT; i <= PUB_DER; i++)
    320         ret = ret && test_print_key_type_using_encoder(alg, i, pk);
    321 
    322     return ret;
    323 }
    324 
    325 #ifndef OPENSSL_NO_ECX
    326 static int test_print_key_using_encoder_public(const char *alg,
    327     const EVP_PKEY *pk)
    328 {
    329     int i;
    330     int ret = 1;
    331 
    332     for (i = PUB_TEXT; i <= PUB_DER; i++)
    333         ret = ret && test_print_key_type_using_encoder(alg, i, pk);
    334 
    335     return ret;
    336 }
    337 #endif
    338 
    339 /* Array indexes used in test_fromdata_rsa */
    340 #define N 0
    341 #define E 1
    342 #define D 2
    343 #define P 3
    344 #define Q 4
    345 #define DP 5
    346 #define DQ 6
    347 #define QINV 7
    348 
    349 static int test_fromdata_rsa(void)
    350 {
    351     int ret = 0, i;
    352     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
    353     EVP_PKEY *pk = NULL, *copy_pk = NULL, *dup_pk = NULL;
    354     /*
    355      * 32-bit RSA key, extracted from this command,
    356      * executed with OpenSSL 1.0.2:
    357      *
    358      * openssl genrsa 32 | openssl rsa -text
    359      */
    360     static unsigned long key_numbers[] = {
    361         0xbc747fc5, /* N */
    362         0x10001, /* E */
    363         0x7b133399, /* D */
    364         0xe963, /* P */
    365         0xceb7, /* Q */
    366         0x8599, /* DP */
    367         0xbd87, /* DQ */
    368         0xcc3b, /* QINV */
    369     };
    370     OSSL_PARAM fromdata_params[] = {
    371         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_N, &key_numbers[N]),
    372         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_E, &key_numbers[E]),
    373         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_D, &key_numbers[D]),
    374         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_FACTOR1, &key_numbers[P]),
    375         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_FACTOR2, &key_numbers[Q]),
    376         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_EXPONENT1, &key_numbers[DP]),
    377         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_EXPONENT2, &key_numbers[DQ]),
    378         OSSL_PARAM_ulong(OSSL_PKEY_PARAM_RSA_COEFFICIENT1, &key_numbers[QINV]),
    379         OSSL_PARAM_END
    380     };
    381     BIGNUM *bn = BN_new();
    382     BIGNUM *bn_from = BN_new();
    383 
    384     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL)))
    385         goto err;
    386 
    387     if (!TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
    388         || !TEST_int_eq(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
    389                             fromdata_params),
    390             1))
    391         goto err;
    392 
    393     for (;;) {
    394         ret = 0;
    395         if (!TEST_int_eq(EVP_PKEY_get_bits(pk), 32)
    396             || !TEST_int_eq(EVP_PKEY_get_security_bits(pk), 8)
    397             || !TEST_int_eq(EVP_PKEY_get_size(pk), 4)
    398             || !TEST_false(EVP_PKEY_missing_parameters(pk)))
    399             goto err;
    400 
    401         EVP_PKEY_CTX_free(key_ctx);
    402         if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
    403             goto err;
    404 
    405         if (!TEST_int_gt(EVP_PKEY_check(key_ctx), 0)
    406             || !TEST_int_gt(EVP_PKEY_public_check(key_ctx), 0)
    407             || !TEST_int_gt(EVP_PKEY_private_check(key_ctx), 0)
    408             || !TEST_int_gt(EVP_PKEY_pairwise_check(key_ctx), 0))
    409             goto err;
    410 
    411         /* EVP_PKEY_copy_parameters() should fail for RSA */
    412         if (!TEST_ptr(copy_pk = EVP_PKEY_new())
    413             || !TEST_false(EVP_PKEY_copy_parameters(copy_pk, pk)))
    414             goto err;
    415         EVP_PKEY_free(copy_pk);
    416         copy_pk = NULL;
    417 
    418         ret = test_print_key_using_pem("RSA", pk)
    419             && test_print_key_using_encoder("RSA", pk);
    420 
    421         if (!ret || dup_pk != NULL)
    422             break;
    423 
    424         if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
    425             goto err;
    426         ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
    427         EVP_PKEY_free(pk);
    428         pk = dup_pk;
    429         if (!ret)
    430             goto err;
    431     }
    432 err:
    433     /* for better diagnostics always compare key params */
    434     for (i = 0; fromdata_params[i].key != NULL; ++i) {
    435         if (!TEST_true(BN_set_word(bn_from, key_numbers[i]))
    436             || !TEST_true(EVP_PKEY_get_bn_param(pk, fromdata_params[i].key,
    437                 &bn))
    438             || !TEST_BN_eq(bn, bn_from))
    439             ret = 0;
    440     }
    441     BN_free(bn_from);
    442     BN_free(bn);
    443     EVP_PKEY_free(pk);
    444     EVP_PKEY_free(copy_pk);
    445     EVP_PKEY_CTX_free(key_ctx);
    446     EVP_PKEY_CTX_free(ctx);
    447 
    448     return ret;
    449 }
    450 
    451 struct check_data {
    452     const char *pname;
    453     BIGNUM *comparebn;
    454 };
    455 
    456 static int do_fromdata_rsa_derive(OSSL_PARAM *fromdata_params,
    457     struct check_data check[],
    458     int expected_nbits, int expected_sbits,
    459     int expected_ksize)
    460 {
    461     const OSSL_PARAM *check_param = NULL;
    462     BIGNUM *check_bn = NULL;
    463     OSSL_PARAM *todata_params = NULL;
    464     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
    465     EVP_PKEY *pk = NULL, *copy_pk = NULL, *dup_pk = NULL;
    466     int i;
    467     int ret = 0;
    468 
    469     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL))
    470         || !TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
    471         || !TEST_int_eq(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
    472                             fromdata_params),
    473             1))
    474         goto err;
    475 
    476     /*
    477      * get the generated key parameters back and validate that the
    478      * exponents/coeffs are correct
    479      */
    480     if (!TEST_int_eq(EVP_PKEY_todata(pk, EVP_PKEY_KEYPAIR, &todata_params), 1))
    481         goto err;
    482 
    483     for (i = 0; check[i].pname != NULL; i++) {
    484         if (!TEST_ptr(check_param = OSSL_PARAM_locate_const(todata_params,
    485                           check[i].pname)))
    486             goto err;
    487         if (!TEST_int_eq(OSSL_PARAM_get_BN(check_param, &check_bn), 1))
    488             goto err;
    489         if (!TEST_BN_eq(check_bn, check[i].comparebn)) {
    490             TEST_info("Data mismatch for parameter %s", check[i].pname);
    491             goto err;
    492         }
    493         BN_free(check_bn);
    494         check_bn = NULL;
    495     }
    496 
    497     for (;;) {
    498         if (!TEST_int_eq(EVP_PKEY_get_bits(pk), expected_nbits)
    499             || !TEST_int_eq(EVP_PKEY_get_security_bits(pk), expected_sbits)
    500             || !TEST_int_eq(EVP_PKEY_get_size(pk), expected_ksize)
    501             || !TEST_false(EVP_PKEY_missing_parameters(pk)))
    502             goto err;
    503 
    504         EVP_PKEY_CTX_free(key_ctx);
    505         if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
    506             goto err;
    507 
    508         if (!TEST_int_gt(EVP_PKEY_check(key_ctx), 0)
    509             || !TEST_int_gt(EVP_PKEY_public_check(key_ctx), 0)
    510             || !TEST_int_gt(EVP_PKEY_private_check(key_ctx), 0)
    511             || !TEST_int_gt(EVP_PKEY_pairwise_check(key_ctx), 0))
    512             goto err;
    513 
    514         /* EVP_PKEY_copy_parameters() should fail for RSA */
    515         if (!TEST_ptr(copy_pk = EVP_PKEY_new())
    516             || !TEST_false(EVP_PKEY_copy_parameters(copy_pk, pk)))
    517             goto err;
    518         EVP_PKEY_free(copy_pk);
    519         copy_pk = NULL;
    520 
    521         if (dup_pk != NULL)
    522             break;
    523 
    524         if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
    525             goto err;
    526         if (!TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1)) {
    527             EVP_PKEY_free(dup_pk);
    528             goto err;
    529         }
    530         EVP_PKEY_free(pk);
    531         pk = dup_pk;
    532     }
    533     ret = 1;
    534 err:
    535     BN_free(check_bn);
    536     EVP_PKEY_free(pk);
    537     EVP_PKEY_CTX_free(ctx);
    538     EVP_PKEY_CTX_free(key_ctx);
    539     OSSL_PARAM_free(fromdata_params);
    540     OSSL_PARAM_free(todata_params);
    541     return ret;
    542 }
    543 
    544 static int test_fromdata_rsa_derive_from_pq_sp800(void)
    545 {
    546     OSSL_PARAM_BLD *bld = NULL;
    547     BIGNUM *n = NULL, *e = NULL, *d = NULL, *p = NULL, *q = NULL;
    548     BIGNUM *dmp1 = NULL, *dmq1 = NULL, *iqmp = NULL;
    549     OSSL_PARAM *fromdata_params = NULL;
    550     struct check_data cdata[4];
    551     int ret = 0;
    552     /*
    553      * 512-bit RSA key, extracted from this command,
    554      * openssl genrsa 512 | openssl rsa -text
    555      * Note: When generating a key with EVP_PKEY_fromdata, and using
    556      * crt derivation, openssl requires a minimum of 512 bits of n data,
    557      * and 2048 bits in the FIPS case
    558      */
    559     static unsigned char n_data[] = { 0x00, 0xc7, 0x06, 0xd8, 0x6b, 0x3c, 0x4f, 0xb7, 0x95, 0x42, 0x44, 0x90,
    560         0xbd, 0xef, 0xf3, 0xc4, 0xb5, 0xa8, 0x55, 0x9e, 0x33, 0xa3, 0x04, 0x3a,
    561         0x90, 0xe5, 0x13, 0xff, 0x87, 0x69, 0x15, 0xa4, 0x8a, 0x17, 0x10, 0xcc,
    562         0xdf, 0xf9, 0xc5, 0x0f, 0xf1, 0x12, 0xff, 0x12, 0x11, 0xe5, 0x6b, 0x5c,
    563         0x83, 0xd9, 0x43, 0xd1, 0x8a, 0x7e, 0xa6, 0x60, 0x07, 0x2e, 0xbb, 0x03,
    564         0x17, 0x2d, 0xec, 0x17, 0x87 };
    565     static unsigned char e_data[] = { 0x01, 0x00, 0x01 };
    566     static unsigned char d_data[] = { 0x1e, 0x5e, 0x5d, 0x07, 0x7f, 0xdc, 0x6a, 0x16, 0xcc, 0x55, 0xca, 0x00,
    567         0x31, 0x6c, 0xf0, 0xc7, 0x07, 0x38, 0x89, 0x3b, 0x37, 0xd4, 0x9d, 0x5b,
    568         0x1e, 0x99, 0x3e, 0x94, 0x5a, 0xe4, 0x82, 0x86, 0x8a, 0x78, 0x34, 0x09,
    569         0x37, 0xd5, 0xe7, 0xb4, 0xef, 0x5f, 0x83, 0x94, 0xff, 0xe5, 0x36, 0x79,
    570         0x10, 0x0c, 0x38, 0xc5, 0x3a, 0x33, 0xa6, 0x7c, 0x3c, 0xcc, 0x98, 0xe0,
    571         0xf5, 0xdb, 0xe6, 0x81 };
    572     static unsigned char p_data[] = { 0x00, 0xf6, 0x61, 0x38, 0x0e, 0x1f, 0x82, 0x7c, 0xb8, 0xba, 0x00, 0xd3,
    573         0xac, 0xdc, 0x4e, 0x6b, 0x7e, 0xf7, 0x58, 0xf3, 0xd9, 0xd8, 0x21, 0xed,
    574         0x54, 0xa3, 0x36, 0xd2, 0x2c, 0x5f, 0x06, 0x7d, 0xc5 };
    575     static unsigned char q_data[] = { 0x00, 0xce, 0xcc, 0x4a, 0xa5, 0x4f, 0xd6, 0x73, 0xd0, 0x20, 0xc3, 0x98,
    576         0x64, 0x20, 0x9b, 0xc1, 0x23, 0xd8, 0x5c, 0x82, 0x4f, 0xe8, 0xa5, 0x32,
    577         0xcd, 0x7e, 0x97, 0xb4, 0xde, 0xf6, 0x4c, 0x80, 0xdb };
    578     static unsigned char dmp1_data[] = { 0x00, 0xd1, 0x07, 0xb6, 0x79, 0x34, 0xfe, 0x8e, 0x36, 0x63, 0x88, 0xa4,
    579         0x0e, 0x3a, 0x73, 0x45, 0xfc, 0x58, 0x7a, 0x5d, 0x98, 0xeb, 0x28, 0x0d,
    580         0xa5, 0x0b, 0x3c, 0x4d, 0xa0, 0x5b, 0x96, 0xb4, 0x49 };
    581     static unsigned char dmq1_data[] = { 0x5b, 0x47, 0x02, 0xdf, 0xaa, 0xb8, 0xae, 0x8f, 0xbc, 0x16, 0x79, 0x6a,
    582         0x20, 0x96, 0x7f, 0x0e, 0x92, 0x4e, 0x6a, 0xda, 0x58, 0x86, 0xaa, 0x40,
    583         0xd7, 0xd2, 0xa0, 0x6c, 0x15, 0x6c, 0xb9, 0x27 };
    584     static unsigned char iqmp_data[] = { 0x00, 0xa0, 0xd6, 0xf0, 0xe8, 0x17, 0x9e, 0xe7, 0xe6, 0x99, 0x12, 0xd6,
    585         0xd9, 0x43, 0xcf, 0xed, 0x37, 0x29, 0xf5, 0x6c, 0x3e, 0xc1, 0x7f, 0x2e,
    586         0x31, 0x3f, 0x64, 0x34, 0x66, 0x68, 0x5c, 0x22, 0x08 };
    587 
    588     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
    589         || !TEST_ptr(n = BN_bin2bn(n_data, sizeof(n_data), NULL))
    590         || !TEST_ptr(e = BN_bin2bn(e_data, sizeof(e_data), NULL))
    591         || !TEST_ptr(d = BN_bin2bn(d_data, sizeof(d_data), NULL))
    592         || !TEST_ptr(p = BN_bin2bn(p_data, sizeof(p_data), NULL))
    593         || !TEST_ptr(q = BN_bin2bn(q_data, sizeof(q_data), NULL))
    594         || !TEST_ptr(dmp1 = BN_bin2bn(dmp1_data, sizeof(dmp1_data), NULL))
    595         || !TEST_ptr(dmq1 = BN_bin2bn(dmq1_data, sizeof(dmq1_data), NULL))
    596         || !TEST_ptr(iqmp = BN_bin2bn(iqmp_data, sizeof(iqmp_data), NULL))
    597         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n))
    598         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E, e))
    599         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D, d))
    600         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_FACTOR1,
    601             p))
    602         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_FACTOR2,
    603             q))
    604         || !TEST_true(OSSL_PARAM_BLD_push_int(bld,
    605             OSSL_PKEY_PARAM_RSA_DERIVE_FROM_PQ, 1))
    606         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
    607         goto err;
    608 
    609     cdata[0].pname = OSSL_PKEY_PARAM_RSA_EXPONENT1;
    610     cdata[0].comparebn = dmp1;
    611     cdata[1].pname = OSSL_PKEY_PARAM_RSA_EXPONENT2;
    612     cdata[1].comparebn = dmq1;
    613     cdata[2].pname = OSSL_PKEY_PARAM_RSA_COEFFICIENT1;
    614     cdata[2].comparebn = iqmp;
    615     cdata[3].pname = NULL;
    616     cdata[3].comparebn = NULL;
    617 
    618     ret = do_fromdata_rsa_derive(fromdata_params, cdata, 512, 56, 64);
    619 
    620 err:
    621     BN_free(n);
    622     BN_free(e);
    623     BN_free(d);
    624     BN_free(p);
    625     BN_free(q);
    626     BN_free(dmp1);
    627     BN_free(dmq1);
    628     BN_free(iqmp);
    629     OSSL_PARAM_BLD_free(bld);
    630     return ret;
    631 }
    632 
    633 static int test_fromdata_rsa_derive_from_pq_multiprime(void)
    634 {
    635     OSSL_PARAM_BLD *bld = NULL;
    636     BIGNUM *n = NULL, *e = NULL, *d = NULL;
    637     BIGNUM *p = NULL, *q = NULL, *p2 = NULL;
    638     BIGNUM *dmp1 = NULL, *dmq1 = NULL, *iqmp = NULL;
    639     BIGNUM *exp3 = NULL, *coeff2 = NULL;
    640     OSSL_PARAM *fromdata_params = NULL;
    641     struct check_data cdata[12];
    642     int ret = 0;
    643     /*
    644      * multiprime RSA key,  extracted from this command,
    645      * openssl genrsa -primes 3 | openssl rsa -text
    646      * Note: When generating a key with EVP_PKEY_fromdata,  and using
    647      * crt derivation,  openssl requires a minimum of 512 bits of n data,
    648      * and 2048 bits in the FIPS case
    649      */
    650     static unsigned char n_data[] = { 0x00, 0x95, 0x78, 0x21, 0xe0, 0xca, 0x94, 0x6c, 0x0b, 0x86, 0x2a, 0x01,
    651         0xde, 0xd9, 0xab, 0xee, 0x88, 0x4a, 0x27, 0x4f, 0xcc, 0x5f, 0xf1, 0x71,
    652         0xe1, 0x0b, 0xc3, 0xd1, 0x88, 0x76, 0xf0, 0x83, 0x03, 0x93, 0x7e, 0x39,
    653         0xfa, 0x47, 0x89, 0x34, 0x27, 0x18, 0x19, 0x97, 0xfc, 0xd4, 0xfe, 0xe5,
    654         0x8a, 0xa9, 0x11, 0x83, 0xb5, 0x15, 0x4a, 0x29, 0xa6, 0xa6, 0xd0, 0x6e,
    655         0x0c, 0x7f, 0x61, 0x8f, 0x7e, 0x7c, 0xfb, 0xfc, 0x04, 0x8b, 0xca, 0x44,
    656         0xf8, 0x59, 0x0b, 0x22, 0x6f, 0x3f, 0x92, 0x23, 0x98, 0xb5, 0xc8, 0xf7,
    657         0xff, 0xf7, 0xac, 0x6b, 0x36, 0xb3, 0xaf, 0x39, 0xde, 0x66, 0x38, 0x51,
    658         0x9f, 0xbe, 0xe2, 0xfc, 0xe4, 0x6f, 0x1a, 0x0f, 0x7a, 0xde, 0x7f, 0x0f,
    659         0x4e, 0xbc, 0xed, 0xa2, 0x99, 0xc5, 0xd1, 0xbf, 0x8f, 0xba, 0x92, 0x91,
    660         0xe4, 0x00, 0x91, 0xbb, 0x67, 0x36, 0x7d, 0x00, 0x50, 0xda, 0x28, 0x38,
    661         0xdc, 0x9f, 0xfe, 0x3f, 0x24, 0x5a, 0x0d, 0xe1, 0x8d, 0xe9, 0x45, 0x2c,
    662         0xd7, 0xf2, 0x67, 0x8c, 0x0c, 0x6e, 0xdb, 0xc8, 0x8b, 0x6b, 0x38, 0x30,
    663         0x21, 0x94, 0xc0, 0xe3, 0xd7, 0xe0, 0x23, 0xd3, 0xd4, 0xfa, 0xdb, 0xb9,
    664         0xfe, 0x1a, 0xcc, 0xc9, 0x79, 0x19, 0x35, 0x18, 0x42, 0x30, 0xc4, 0xb5,
    665         0x92, 0x33, 0x1e, 0xd4, 0xc4, 0xc0, 0x9d, 0x55, 0x37, 0xd4, 0xef, 0x54,
    666         0x71, 0x81, 0x09, 0x15, 0xdb, 0x11, 0x38, 0x6b, 0x35, 0x93, 0x11, 0xdc,
    667         0xb1, 0x6c, 0xd6, 0xa4, 0x37, 0x84, 0xf3, 0xb2, 0x2f, 0x1b, 0xd6, 0x05,
    668         0x9f, 0x0e, 0x5c, 0x98, 0x29, 0x2f, 0x95, 0xb6, 0x55, 0xbd, 0x24, 0x44,
    669         0xc5, 0xc8, 0xa2, 0x76, 0x1e, 0xf8, 0x82, 0x8a, 0xdf, 0x34, 0x72, 0x7e,
    670         0xdd, 0x65, 0x4b, 0xfc, 0x6c, 0x1c, 0x96, 0x70, 0xe2, 0x69, 0xb5, 0x12,
    671         0x1b, 0x59, 0x67, 0x14, 0x9d };
    672     static unsigned char e_data[] = { 0x01, 0x00, 0x01 };
    673     static unsigned char d_data[] = { 0x64, 0x57, 0x4d, 0x86, 0xf6, 0xf8, 0x44, 0xc0, 0x47, 0xc5, 0x13, 0x94,
    674         0x63, 0x54, 0x84, 0xc1, 0x81, 0xe6, 0x7a, 0x2f, 0x9d, 0x89, 0x1d, 0x06,
    675         0x13, 0x3b, 0xd6, 0x02, 0x62, 0xb6, 0x7b, 0x7d, 0x7f, 0x1a, 0x92, 0x19,
    676         0x6e, 0xc4, 0xb0, 0xfa, 0x3d, 0xb7, 0x90, 0xcc, 0xee, 0xc0, 0x5f, 0xa0,
    677         0x82, 0x77, 0x7b, 0x8f, 0xa9, 0x47, 0x2c, 0x46, 0xf0, 0x5d, 0xa4, 0x43,
    678         0x47, 0x90, 0x5b, 0x20, 0x73, 0x0f, 0x46, 0xd4, 0x56, 0x73, 0xe7, 0x71,
    679         0x41, 0x75, 0xb4, 0x1c, 0x32, 0xf5, 0x0c, 0x68, 0x8c, 0x40, 0xea, 0x1c,
    680         0x30, 0x12, 0xa2, 0x65, 0x02, 0x27, 0x98, 0x4e, 0x0a, 0xbf, 0x2b, 0x72,
    681         0xb2, 0x5c, 0xe3, 0xbe, 0x3e, 0xc7, 0xdb, 0x9b, 0xa2, 0x4a, 0x90, 0xc0,
    682         0xa7, 0xb0, 0x00, 0xf1, 0x6a, 0xff, 0xa3, 0x77, 0xf7, 0x71, 0xa2, 0x41,
    683         0xe9, 0x6e, 0x7c, 0x38, 0x24, 0x46, 0xd5, 0x5c, 0x49, 0x2a, 0xe6, 0xee,
    684         0x27, 0x4b, 0x2e, 0x6f, 0x16, 0x54, 0x2d, 0x37, 0x36, 0x01, 0x39, 0x2b,
    685         0x23, 0x4b, 0xb4, 0x65, 0x25, 0x4d, 0x7f, 0x72, 0x20, 0x7f, 0x5d, 0xec,
    686         0x50, 0xba, 0xbb, 0xaa, 0x9c, 0x3c, 0x1d, 0xa1, 0x40, 0x2c, 0x6a, 0x8b,
    687         0x5f, 0x2e, 0xe0, 0xa6, 0xf7, 0x9e, 0x03, 0xb5, 0x44, 0x5f, 0x74, 0xc7,
    688         0x9f, 0x89, 0x2b, 0x71, 0x2f, 0x66, 0x9f, 0x03, 0x6c, 0x96, 0xd0, 0x23,
    689         0x36, 0x4d, 0xa1, 0xf0, 0x82, 0xcc, 0x43, 0xe7, 0x08, 0x93, 0x40, 0x18,
    690         0xc0, 0x39, 0x73, 0x83, 0xe2, 0xec, 0x9b, 0x81, 0x9d, 0x4c, 0x86, 0xaa,
    691         0x59, 0xa8, 0x67, 0x1c, 0x80, 0xdc, 0x6f, 0x7f, 0x23, 0x6b, 0x7d, 0x2c,
    692         0x56, 0x99, 0xa0, 0x89, 0x7e, 0xdb, 0x8b, 0x7a, 0xaa, 0x03, 0x8e, 0x8e,
    693         0x8e, 0x3a, 0x58, 0xb4, 0x03, 0x6b, 0x65, 0xfa, 0x92, 0x0a, 0x96, 0x93,
    694         0xa6, 0x07, 0x60, 0x01 };
    695     static unsigned char p_data[] = { 0x06, 0x55, 0x7f, 0xbd, 0xfd, 0xa8, 0x4c, 0x94, 0x5e, 0x10, 0x8a, 0x54,
    696         0x37, 0xf3, 0x64, 0x37, 0x3a, 0xca, 0x18, 0x1b, 0xdd, 0x71, 0xa5, 0x94,
    697         0xc9, 0x31, 0x59, 0xa5, 0x89, 0xe9, 0xc4, 0xba, 0x55, 0x90, 0x6d, 0x9c,
    698         0xcc, 0x52, 0x5d, 0x44, 0xa8, 0xbc, 0x2b, 0x3b, 0x8c, 0xbd, 0x96, 0xfa,
    699         0xcd, 0x54, 0x63, 0xe3, 0xc8, 0xfe, 0x5e, 0xc6, 0x73, 0x98, 0x14, 0x7a,
    700         0x54, 0x0e, 0xe7, 0x75, 0x49, 0x93, 0x20, 0x33, 0x17, 0xa9, 0x34, 0xa8,
    701         0xee, 0xaf, 0x3a, 0xcc, 0xf5, 0x69, 0xfc, 0x30, 0x1a, 0xdf, 0x49, 0x61,
    702         0xa4, 0xd1 };
    703     static unsigned char p2_data[] = { 0x03, 0xe2, 0x41, 0x3d, 0xb1, 0xdd, 0xad, 0xd7, 0x3b, 0xf8, 0xab, 0x32,
    704         0x27, 0x8b, 0xac, 0x95, 0xc0, 0x1a, 0x3f, 0x80, 0x8e, 0x21, 0xa9, 0xb8,
    705         0xa2, 0xed, 0xcf, 0x97, 0x5c, 0x61, 0x10, 0x94, 0x1b, 0xd0, 0xbe, 0x88,
    706         0xc2, 0xa7, 0x20, 0xe5, 0xa5, 0xc2, 0x7a, 0x7e, 0xf0, 0xd1, 0xe4, 0x13,
    707         0x75, 0xb9, 0x62, 0x90, 0xf1, 0xc3, 0x5b, 0x8c, 0xe9, 0xa9, 0x5b, 0xb7,
    708         0x6d, 0xdc, 0xcd, 0x12, 0xea, 0x97, 0x05, 0x04, 0x25, 0x2a, 0x93, 0xd1,
    709         0x4e, 0x05, 0x1a, 0x50, 0xa2, 0x67, 0xb8, 0x4b, 0x09, 0x15, 0x65, 0x6c,
    710         0x66, 0x2d };
    711     static unsigned char q_data[] = { 0x06, 0x13, 0x74, 0x6e, 0xde, 0x7c, 0x33, 0xc2, 0xe7, 0x05, 0x2c, 0xeb,
    712         0x25, 0x7d, 0x4a, 0x07, 0x7e, 0x03, 0xcf, 0x6a, 0x23, 0x36, 0x25, 0x23,
    713         0xf6, 0x5d, 0xde, 0xa3, 0x0f, 0x82, 0xe6, 0x4b, 0xec, 0x39, 0xbf, 0x37,
    714         0x1f, 0x4f, 0x56, 0x1e, 0xd8, 0x62, 0x32, 0x5c, 0xf5, 0x37, 0x75, 0x20,
    715         0xe2, 0x7e, 0x56, 0x82, 0xc6, 0x35, 0xd3, 0x4d, 0xfa, 0x6c, 0xc3, 0x93,
    716         0xf0, 0x60, 0x53, 0x78, 0x95, 0xee, 0xf9, 0x8b, 0x2c, 0xaf, 0xb1, 0x47,
    717         0x5c, 0x29, 0x0d, 0x2a, 0x47, 0x7f, 0xd0, 0x7a, 0x4e, 0x26, 0x7b, 0x47,
    718         0xfb, 0x61 };
    719     static unsigned char dmp1_data[] = { 0x01, 0x13, 0x3a, 0x1f, 0x91, 0x92, 0xa3, 0x8c, 0xfb, 0x7a, 0x6b, 0x40,
    720         0x68, 0x4e, 0xd3, 0xcf, 0xdc, 0x16, 0xb9, 0x88, 0xe1, 0x49, 0x8d, 0x05,
    721         0x78, 0x30, 0xfc, 0x3a, 0x70, 0xf2, 0x51, 0x06, 0x1f, 0xc7, 0xe8, 0x13,
    722         0x19, 0x4b, 0x51, 0xb1, 0x79, 0xc2, 0x96, 0xc4, 0x00, 0xdb, 0x9d, 0x68,
    723         0xec, 0xb9, 0x4a, 0x4b, 0x3b, 0xae, 0x91, 0x7f, 0xb5, 0xd7, 0x36, 0x82,
    724         0x9d, 0x09, 0xfa, 0x97, 0x99, 0xe9, 0x73, 0x29, 0xb8, 0xf6, 0x6b, 0x8d,
    725         0xd1, 0x15, 0xc5, 0x31, 0x4c, 0xe6, 0xb4, 0x7b, 0xa5, 0xd4, 0x08, 0xac,
    726         0x9e, 0x41 };
    727     static unsigned char dmq1_data[] = { 0x05, 0xcd, 0x33, 0xc2, 0xdd, 0x3b, 0xb8, 0xec, 0xe4, 0x4c, 0x03, 0xcc,
    728         0xef, 0xba, 0x07, 0x22, 0xca, 0x47, 0x77, 0x18, 0x40, 0x50, 0xe5, 0xfb,
    729         0xc5, 0xb5, 0x71, 0xed, 0x3e, 0xd5, 0x5d, 0x72, 0xa7, 0x37, 0xa8, 0x86,
    730         0x48, 0xa6, 0x27, 0x74, 0x42, 0x66, 0xd8, 0xf1, 0xfb, 0xcf, 0x1d, 0x4e,
    731         0xee, 0x15, 0x76, 0x23, 0x5e, 0x81, 0x6c, 0xa7, 0x2b, 0x74, 0x08, 0xf7,
    732         0x4c, 0x71, 0x9d, 0xa2, 0x29, 0x7f, 0xca, 0xd5, 0x02, 0x31, 0x2c, 0x54,
    733         0x18, 0x02, 0xb6, 0xa8, 0x65, 0x26, 0xfc, 0xf8, 0x9b, 0x80, 0x90, 0xfc,
    734         0x75, 0x61 };
    735     static unsigned char iqmp_data[] = { 0x05, 0x78, 0xf8, 0xdd, 0x1c, 0x6f, 0x3d, 0xaf, 0x53, 0x84, 0x32, 0xa9,
    736         0x35, 0x52, 0xf3, 0xd0, 0x4d, 0xf8, 0x09, 0x85, 0x3d, 0x72, 0x20, 0x8b,
    737         0x47, 0xba, 0xc8, 0xce, 0xac, 0xd9, 0x76, 0x90, 0x05, 0x88, 0x63, 0x8a,
    738         0x10, 0x2b, 0xcd, 0xd3, 0xbe, 0x8c, 0x16, 0x60, 0x6a, 0xfd, 0xce, 0xc7,
    739         0x9f, 0xfa, 0xbb, 0xe3, 0xa6, 0xde, 0xc2, 0x8f, 0x1d, 0x25, 0xdc, 0x41,
    740         0xcb, 0xa4, 0xeb, 0x76, 0xc9, 0xdc, 0x8e, 0x49, 0x0e, 0xe4, 0x7c, 0xd2,
    741         0xd5, 0x6e, 0x26, 0x3c, 0x0b, 0xd3, 0xc5, 0x20, 0x4e, 0x4b, 0xb6, 0xf7,
    742         0xae, 0xef };
    743     static unsigned char exp3_data[] = { 0x02, 0x7d, 0x16, 0x24, 0xfc, 0x35, 0xf9, 0xd0, 0xb3, 0x02, 0xf2, 0x5f,
    744         0xde, 0xeb, 0x27, 0x19, 0x85, 0xd0, 0xcb, 0xe4, 0x0a, 0x2f, 0x13, 0xdb,
    745         0xd5, 0xba, 0xe0, 0x8c, 0x32, 0x8b, 0x97, 0xdd, 0xef, 0xbc, 0xe0, 0x7a,
    746         0x2d, 0x90, 0x7e, 0x09, 0xe9, 0x1f, 0x26, 0xf2, 0xf4, 0x48, 0xea, 0x06,
    747         0x76, 0x26, 0xe6, 0x3b, 0xce, 0x4e, 0xc9, 0xf9, 0x0f, 0x38, 0x90, 0x26,
    748         0x87, 0x65, 0x36, 0x9a, 0xea, 0x6a, 0xfe, 0xb1, 0xdb, 0x46, 0xdf, 0x14,
    749         0xfd, 0x13, 0x53, 0xfb, 0x5b, 0x35, 0x6e, 0xe7, 0xd5, 0xd8, 0x39, 0xf7,
    750         0x2d, 0xb9 };
    751     static unsigned char coeff2_data[] = { 0x01, 0xba, 0x66, 0x0a, 0xa2, 0x86, 0xc0, 0x57, 0x7f, 0x4e, 0x68, 0xb1,
    752         0x86, 0x63, 0x23, 0x5b, 0x0e, 0xeb, 0x93, 0x42, 0xd1, 0xaa, 0x15, 0x13,
    753         0xcc, 0x29, 0x71, 0x8a, 0xb0, 0xe0, 0xc9, 0x67, 0xde, 0x1a, 0x7c, 0x1a,
    754         0xef, 0xa7, 0x08, 0x85, 0xb3, 0xae, 0x98, 0x99, 0xde, 0xaf, 0x09, 0x38,
    755         0xfc, 0x46, 0x29, 0x5f, 0x4f, 0x7e, 0x01, 0x6c, 0x50, 0x13, 0x95, 0x91,
    756         0x4c, 0x0f, 0x00, 0xba, 0xca, 0x40, 0xa3, 0xd0, 0x58, 0xb6, 0x62, 0x4c,
    757         0xd1, 0xb6, 0xd3, 0x29, 0x5d, 0x82, 0xb3, 0x3d, 0x61, 0xbe, 0x5d, 0xf0,
    758         0x4b, 0xf4 };
    759 
    760     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
    761         || !TEST_ptr(n = BN_bin2bn(n_data, sizeof(n_data), NULL))
    762         || !TEST_ptr(e = BN_bin2bn(e_data, sizeof(e_data), NULL))
    763         || !TEST_ptr(d = BN_bin2bn(d_data, sizeof(d_data), NULL))
    764         || !TEST_ptr(p = BN_bin2bn(p_data, sizeof(p_data), NULL))
    765         || !TEST_ptr(q = BN_bin2bn(q_data, sizeof(q_data), NULL))
    766         || !TEST_ptr(p2 = BN_bin2bn(p2_data, sizeof(p2_data), NULL))
    767         || !TEST_ptr(exp3 = BN_bin2bn(exp3_data, sizeof(exp3_data), NULL))
    768         || !TEST_ptr(coeff2 = BN_bin2bn(coeff2_data, sizeof(coeff2_data), NULL))
    769         || !TEST_ptr(dmp1 = BN_bin2bn(dmp1_data, sizeof(dmp1_data), NULL))
    770         || !TEST_ptr(dmq1 = BN_bin2bn(dmq1_data, sizeof(dmq1_data), NULL))
    771         || !TEST_ptr(iqmp = BN_bin2bn(iqmp_data, sizeof(iqmp_data), NULL))
    772         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n))
    773         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E, e))
    774         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D, d))
    775         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_FACTOR1,
    776             p))
    777         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_FACTOR2,
    778             q))
    779         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_FACTOR3,
    780             p2))
    781         || !TEST_true(OSSL_PARAM_BLD_push_int(bld,
    782             OSSL_PKEY_PARAM_RSA_DERIVE_FROM_PQ, 1))
    783         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
    784         goto err;
    785 
    786     cdata[0].pname = OSSL_PKEY_PARAM_RSA_EXPONENT1;
    787     cdata[0].comparebn = dmp1;
    788     cdata[1].pname = OSSL_PKEY_PARAM_RSA_EXPONENT2;
    789     cdata[1].comparebn = dmq1;
    790     cdata[2].pname = OSSL_PKEY_PARAM_RSA_COEFFICIENT1;
    791     cdata[2].comparebn = iqmp;
    792     cdata[3].pname = OSSL_PKEY_PARAM_RSA_EXPONENT3;
    793     cdata[3].comparebn = exp3;
    794     cdata[4].pname = OSSL_PKEY_PARAM_RSA_COEFFICIENT2;
    795     cdata[4].comparebn = coeff2;
    796     cdata[5].pname = OSSL_PKEY_PARAM_RSA_N;
    797     cdata[5].comparebn = n;
    798     cdata[6].pname = OSSL_PKEY_PARAM_RSA_E;
    799     cdata[6].comparebn = e;
    800     cdata[7].pname = OSSL_PKEY_PARAM_RSA_D;
    801     cdata[7].comparebn = d;
    802     cdata[8].pname = OSSL_PKEY_PARAM_RSA_FACTOR1;
    803     cdata[8].comparebn = p;
    804     cdata[9].pname = OSSL_PKEY_PARAM_RSA_FACTOR2;
    805     cdata[9].comparebn = q;
    806     cdata[10].pname = OSSL_PKEY_PARAM_RSA_FACTOR3;
    807     cdata[10].comparebn = p2;
    808     cdata[11].pname = NULL;
    809     cdata[11].comparebn = NULL;
    810 
    811     ret = do_fromdata_rsa_derive(fromdata_params, cdata, 2048, 112, 256);
    812 
    813 err:
    814     BN_free(n);
    815     BN_free(e);
    816     BN_free(d);
    817     BN_free(p);
    818     BN_free(p2);
    819     BN_free(q);
    820     BN_free(dmp1);
    821     BN_free(dmq1);
    822     BN_free(iqmp);
    823     BN_free(exp3);
    824     BN_free(coeff2);
    825     OSSL_PARAM_BLD_free(bld);
    826     return ret;
    827 }
    828 
    829 static int test_evp_pkey_get_bn_param_large(void)
    830 {
    831     int ret = 0;
    832     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
    833     EVP_PKEY *pk = NULL;
    834     OSSL_PARAM_BLD *bld = NULL;
    835     OSSL_PARAM *fromdata_params = NULL;
    836     BIGNUM *n = NULL, *e = NULL, *d = NULL, *n_out = NULL;
    837     /*
    838      * The buffer size chosen here for n_data larger than the buffer used
    839      * internally in EVP_PKEY_get_bn_param.
    840      */
    841     static unsigned char n_data[2050];
    842     static const unsigned char e_data[] = {
    843         0x1, 0x00, 0x01
    844     };
    845     static const unsigned char d_data[] = {
    846         0x99, 0x33, 0x13, 0x7b
    847     };
    848 
    849     /* N is a large buffer */
    850     memset(n_data, 0xCE, sizeof(n_data));
    851 
    852     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
    853         || !TEST_ptr(n = BN_bin2bn(n_data, sizeof(n_data), NULL))
    854         || !TEST_ptr(e = BN_bin2bn(e_data, sizeof(e_data), NULL))
    855         || !TEST_ptr(d = BN_bin2bn(d_data, sizeof(d_data), NULL))
    856         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_N, n))
    857         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_E, e))
    858         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_RSA_D, d))
    859         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld))
    860         || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL))
    861         || !TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
    862         || !TEST_int_eq(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
    863                             fromdata_params),
    864             1)
    865         || !TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, ""))
    866         || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_RSA_N, &n_out))
    867         || !TEST_BN_eq(n, n_out))
    868         goto err;
    869     ret = 1;
    870 err:
    871     BN_free(n_out);
    872     BN_free(n);
    873     BN_free(e);
    874     BN_free(d);
    875     EVP_PKEY_free(pk);
    876     EVP_PKEY_CTX_free(key_ctx);
    877     EVP_PKEY_CTX_free(ctx);
    878     OSSL_PARAM_free(fromdata_params);
    879     OSSL_PARAM_BLD_free(bld);
    880     return ret;
    881 }
    882 
    883 #ifndef OPENSSL_NO_DH
    884 static int test_fromdata_dh_named_group(void)
    885 {
    886     int ret = 0;
    887     int gindex = 0, pcounter = 0, hindex = 0;
    888     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
    889     EVP_PKEY *pk = NULL, *copy_pk = NULL, *dup_pk = NULL;
    890     size_t len;
    891     BIGNUM *pub = NULL, *priv = NULL;
    892     BIGNUM *pub_out = NULL, *priv_out = NULL;
    893     BIGNUM *p = NULL, *q = NULL, *g = NULL, *j = NULL;
    894     OSSL_PARAM *fromdata_params = NULL;
    895     OSSL_PARAM_BLD *bld = NULL;
    896     char name_out[80];
    897     unsigned char seed_out[32];
    898 
    899     /*
    900      * DH key data was generated using the following:
    901      * openssl genpkey -algorithm DH -pkeyopt group:ffdhe2048
    902      *                 -pkeyopt priv_len:224 -text
    903      */
    904     static const unsigned char priv_data[] = {
    905         0x88,
    906         0x85,
    907         0xe7,
    908         0x9f,
    909         0xee,
    910         0x6d,
    911         0xc5,
    912         0x7c,
    913         0x78,
    914         0xaf,
    915         0x63,
    916         0x5d,
    917         0x38,
    918         0x2a,
    919         0xd0,
    920         0xed,
    921         0x56,
    922         0x4b,
    923         0x47,
    924         0x21,
    925         0x2b,
    926         0xfa,
    927         0x55,
    928         0xfa,
    929         0x87,
    930         0xe8,
    931         0xa9,
    932         0x7b,
    933     };
    934     static const unsigned char pub_data[] = {
    935         0x00, 0xd6, 0x2d, 0x77, 0xe0, 0xd3, 0x7d, 0xf8, 0xeb, 0x98, 0x50, 0xa1,
    936         0x82, 0x22, 0x65, 0xd5, 0xd9, 0xfe, 0xc9, 0x3f, 0xbe, 0x16, 0x83, 0xbd,
    937         0x33, 0xe9, 0xc6, 0x93, 0xcf, 0x08, 0xaf, 0x83, 0xfa, 0x80, 0x8a, 0x6c,
    938         0x64, 0xdf, 0x70, 0x64, 0xd5, 0x0a, 0x7c, 0x5a, 0x72, 0xda, 0x66, 0xe6,
    939         0xf9, 0xf5, 0x31, 0x21, 0x92, 0xb0, 0x60, 0x1a, 0xb5, 0xd3, 0xf0, 0xa5,
    940         0xfa, 0x48, 0x95, 0x2e, 0x38, 0xd9, 0xc5, 0xe6, 0xda, 0xfb, 0x6c, 0x03,
    941         0x9d, 0x4b, 0x69, 0xb7, 0x95, 0xe4, 0x5c, 0xc0, 0x93, 0x4f, 0x48, 0xd9,
    942         0x7e, 0x06, 0x22, 0xb2, 0xde, 0xf3, 0x79, 0x24, 0xed, 0xe1, 0xd1, 0x4a,
    943         0x57, 0xf1, 0x40, 0x86, 0x70, 0x42, 0x25, 0xc5, 0x27, 0x68, 0xc9, 0xfa,
    944         0xe5, 0x8e, 0x62, 0x7e, 0xff, 0x49, 0x6c, 0x5b, 0xb5, 0xba, 0xf9, 0xef,
    945         0x9a, 0x1a, 0x10, 0xd4, 0x81, 0x53, 0xcf, 0x83, 0x04, 0x18, 0x1c, 0xe1,
    946         0xdb, 0xe1, 0x65, 0xa9, 0x7f, 0xe1, 0x33, 0xeb, 0xc3, 0x4f, 0xe3, 0xb7,
    947         0x22, 0xf7, 0x1c, 0x09, 0x4f, 0xed, 0xc6, 0x07, 0x8e, 0x78, 0x05, 0x8f,
    948         0x7c, 0x96, 0xd9, 0x12, 0xe0, 0x81, 0x74, 0x1a, 0xe9, 0x13, 0xc0, 0x20,
    949         0x82, 0x65, 0xbb, 0x42, 0x3b, 0xed, 0x08, 0x6a, 0x84, 0x4f, 0xea, 0x77,
    950         0x14, 0x32, 0xf9, 0xed, 0xc2, 0x12, 0xd6, 0xc5, 0xc6, 0xb3, 0xe5, 0xf2,
    951         0x6e, 0xf6, 0x16, 0x7f, 0x37, 0xde, 0xbc, 0x09, 0xc7, 0x06, 0x6b, 0x12,
    952         0xbc, 0xad, 0x2d, 0x49, 0x25, 0xd5, 0xdc, 0xf4, 0x18, 0x14, 0xd2, 0xf0,
    953         0xf1, 0x1d, 0x1f, 0x3a, 0xaa, 0x15, 0x55, 0xbb, 0x0d, 0x7f, 0xbe, 0x67,
    954         0xa1, 0xa7, 0xf0, 0xaa, 0xb3, 0xfb, 0x41, 0x82, 0x39, 0x49, 0x93, 0xbc,
    955         0xa8, 0xee, 0x72, 0x13, 0x45, 0x65, 0x15, 0x42, 0x17, 0xaa, 0xd8, 0xab,
    956         0xcf, 0x33, 0x42, 0x83, 0x42
    957     };
    958     static const char group_name[] = "ffdhe2048";
    959     static const long priv_len = 224;
    960 
    961     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
    962         || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
    963         || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
    964         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
    965             OSSL_PKEY_PARAM_GROUP_NAME,
    966             group_name, 0))
    967         || !TEST_true(OSSL_PARAM_BLD_push_long(bld, OSSL_PKEY_PARAM_DH_PRIV_LEN,
    968             priv_len))
    969         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY, pub))
    970         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, priv))
    971         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
    972         goto err;
    973 
    974     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL)))
    975         goto err;
    976 
    977     if (!TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
    978         || !TEST_int_eq(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
    979                             fromdata_params),
    980             1))
    981         goto err;
    982 
    983     /*
    984      * A few extra checks of EVP_PKEY_get_utf8_string_param() to see that
    985      * it behaves as expected with regards to string length and terminating
    986      * NUL byte.
    987      */
    988     if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk,
    989             OSSL_PKEY_PARAM_GROUP_NAME,
    990             NULL, sizeof(name_out),
    991             &len))
    992         || !TEST_size_t_eq(len, sizeof(group_name) - 1)
    993         /* Just enough space to hold the group name and a terminating NUL */
    994         || !TEST_true(EVP_PKEY_get_utf8_string_param(pk,
    995             OSSL_PKEY_PARAM_GROUP_NAME,
    996             name_out,
    997             sizeof(group_name),
    998             &len))
    999         || !TEST_size_t_eq(len, sizeof(group_name) - 1)
   1000         /* Too small buffer to hold the terminating NUL byte */
   1001         || !TEST_false(EVP_PKEY_get_utf8_string_param(pk,
   1002             OSSL_PKEY_PARAM_GROUP_NAME,
   1003             name_out,
   1004             sizeof(group_name) - 1,
   1005             &len))
   1006         /* Too small buffer to hold the whole group name, even! */
   1007         || !TEST_false(EVP_PKEY_get_utf8_string_param(pk,
   1008             OSSL_PKEY_PARAM_GROUP_NAME,
   1009             name_out,
   1010             sizeof(group_name) - 2,
   1011             &len)))
   1012         goto err;
   1013 
   1014     for (;;) {
   1015         ret = 0;
   1016         if (!TEST_int_eq(EVP_PKEY_get_bits(pk), 2048)
   1017             || !TEST_int_eq(EVP_PKEY_get_security_bits(pk), 112)
   1018             || !TEST_int_eq(EVP_PKEY_get_size(pk), 256)
   1019             || !TEST_false(EVP_PKEY_missing_parameters(pk)))
   1020             goto err;
   1021 
   1022         if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk,
   1023                 OSSL_PKEY_PARAM_GROUP_NAME,
   1024                 name_out,
   1025                 sizeof(name_out),
   1026                 &len))
   1027             || !TEST_str_eq(name_out, group_name)
   1028             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
   1029                 &pub_out))
   1030 
   1031             || !TEST_BN_eq(pub, pub_out)
   1032             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
   1033                 &priv_out))
   1034             || !TEST_BN_eq(priv, priv_out)
   1035             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
   1036             || !TEST_BN_eq(&ossl_bignum_ffdhe2048_p, p)
   1037             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
   1038             || !TEST_ptr(q)
   1039             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
   1040             || !TEST_BN_eq(&ossl_bignum_const_2, g)
   1041             || !TEST_false(EVP_PKEY_get_bn_param(pk,
   1042                 OSSL_PKEY_PARAM_FFC_COFACTOR,
   1043                 &j))
   1044             || !TEST_ptr_null(j)
   1045             || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
   1046                 OSSL_PKEY_PARAM_FFC_SEED,
   1047                 seed_out,
   1048                 sizeof(seed_out),
   1049                 &len))
   1050             || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_GINDEX,
   1051                 &gindex))
   1052             || !TEST_int_eq(gindex, -1)
   1053             || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H,
   1054                 &hindex))
   1055             || !TEST_int_eq(hindex, 0)
   1056             || !TEST_true(EVP_PKEY_get_int_param(pk,
   1057                 OSSL_PKEY_PARAM_FFC_PCOUNTER,
   1058                 &pcounter))
   1059             || !TEST_int_eq(pcounter, -1))
   1060             goto err;
   1061         BN_free(p);
   1062         p = NULL;
   1063         BN_free(q);
   1064         q = NULL;
   1065         BN_free(g);
   1066         g = NULL;
   1067         BN_free(j);
   1068         j = NULL;
   1069         BN_free(pub_out);
   1070         pub_out = NULL;
   1071         BN_free(priv_out);
   1072         priv_out = NULL;
   1073 
   1074         if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
   1075             goto err;
   1076 
   1077         if (!TEST_int_gt(EVP_PKEY_check(key_ctx), 0)
   1078             || !TEST_int_gt(EVP_PKEY_public_check(key_ctx), 0)
   1079             || !TEST_int_gt(EVP_PKEY_private_check(key_ctx), 0)
   1080             || !TEST_int_gt(EVP_PKEY_pairwise_check(key_ctx), 0))
   1081             goto err;
   1082         EVP_PKEY_CTX_free(key_ctx);
   1083         key_ctx = NULL;
   1084 
   1085         if (!TEST_ptr(copy_pk = EVP_PKEY_new())
   1086             || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
   1087             goto err;
   1088         EVP_PKEY_free(copy_pk);
   1089         copy_pk = NULL;
   1090 
   1091         ret = test_print_key_using_pem("DH", pk)
   1092             && test_print_key_using_encoder("DH", pk);
   1093 
   1094         if (!ret || dup_pk != NULL)
   1095             break;
   1096 
   1097         if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
   1098             goto err;
   1099         ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
   1100         EVP_PKEY_free(pk);
   1101         pk = dup_pk;
   1102         if (!ret)
   1103             goto err;
   1104     }
   1105 err:
   1106     BN_free(p);
   1107     BN_free(q);
   1108     BN_free(g);
   1109     BN_free(j);
   1110     BN_free(pub);
   1111     BN_free(priv);
   1112     BN_free(pub_out);
   1113     BN_free(priv_out);
   1114     EVP_PKEY_free(copy_pk);
   1115     EVP_PKEY_free(pk);
   1116     EVP_PKEY_CTX_free(ctx);
   1117     EVP_PKEY_CTX_free(key_ctx);
   1118     OSSL_PARAM_free(fromdata_params);
   1119     OSSL_PARAM_BLD_free(bld);
   1120 
   1121     return ret;
   1122 }
   1123 
   1124 static int test_fromdata_dh_fips186_4(void)
   1125 {
   1126     int ret = 0;
   1127     int gindex = 0, pcounter = 0, hindex = 0;
   1128     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
   1129     EVP_PKEY *pk = NULL, *dup_pk = NULL;
   1130     size_t len;
   1131     BIGNUM *pub = NULL, *priv = NULL;
   1132     BIGNUM *pub_out = NULL, *priv_out = NULL;
   1133     BIGNUM *p = NULL, *q = NULL, *g = NULL, *j = NULL;
   1134     OSSL_PARAM_BLD *bld = NULL;
   1135     OSSL_PARAM *fromdata_params = NULL;
   1136     char name_out[80];
   1137     unsigned char seed_out[32];
   1138 
   1139     /*
   1140      * DH key data was generated using the following:
   1141      * openssl genpkey -algorithm DH
   1142      *                 -pkeyopt group:ffdhe2048 -pkeyopt priv_len:224 -text
   1143      */
   1144     static const unsigned char priv_data[] = {
   1145         0x88,
   1146         0x85,
   1147         0xe7,
   1148         0x9f,
   1149         0xee,
   1150         0x6d,
   1151         0xc5,
   1152         0x7c,
   1153         0x78,
   1154         0xaf,
   1155         0x63,
   1156         0x5d,
   1157         0x38,
   1158         0x2a,
   1159         0xd0,
   1160         0xed,
   1161         0x56,
   1162         0x4b,
   1163         0x47,
   1164         0x21,
   1165         0x2b,
   1166         0xfa,
   1167         0x55,
   1168         0xfa,
   1169         0x87,
   1170         0xe8,
   1171         0xa9,
   1172         0x7b,
   1173     };
   1174     static const unsigned char pub_data[] = {
   1175         0xd6, 0x2d, 0x77, 0xe0, 0xd3, 0x7d, 0xf8, 0xeb, 0x98, 0x50, 0xa1, 0x82,
   1176         0x22, 0x65, 0xd5, 0xd9, 0xfe, 0xc9, 0x3f, 0xbe, 0x16, 0x83, 0xbd, 0x33,
   1177         0xe9, 0xc6, 0x93, 0xcf, 0x08, 0xaf, 0x83, 0xfa, 0x80, 0x8a, 0x6c, 0x64,
   1178         0xdf, 0x70, 0x64, 0xd5, 0x0a, 0x7c, 0x5a, 0x72, 0xda, 0x66, 0xe6, 0xf9,
   1179         0xf5, 0x31, 0x21, 0x92, 0xb0, 0x60, 0x1a, 0xb5, 0xd3, 0xf0, 0xa5, 0xfa,
   1180         0x48, 0x95, 0x2e, 0x38, 0xd9, 0xc5, 0xe6, 0xda, 0xfb, 0x6c, 0x03, 0x9d,
   1181         0x4b, 0x69, 0xb7, 0x95, 0xe4, 0x5c, 0xc0, 0x93, 0x4f, 0x48, 0xd9, 0x7e,
   1182         0x06, 0x22, 0xb2, 0xde, 0xf3, 0x79, 0x24, 0xed, 0xe1, 0xd1, 0x4a, 0x57,
   1183         0xf1, 0x40, 0x86, 0x70, 0x42, 0x25, 0xc5, 0x27, 0x68, 0xc9, 0xfa, 0xe5,
   1184         0x8e, 0x62, 0x7e, 0xff, 0x49, 0x6c, 0x5b, 0xb5, 0xba, 0xf9, 0xef, 0x9a,
   1185         0x1a, 0x10, 0xd4, 0x81, 0x53, 0xcf, 0x83, 0x04, 0x18, 0x1c, 0xe1, 0xdb,
   1186         0xe1, 0x65, 0xa9, 0x7f, 0xe1, 0x33, 0xeb, 0xc3, 0x4f, 0xe3, 0xb7, 0x22,
   1187         0xf7, 0x1c, 0x09, 0x4f, 0xed, 0xc6, 0x07, 0x8e, 0x78, 0x05, 0x8f, 0x7c,
   1188         0x96, 0xd9, 0x12, 0xe0, 0x81, 0x74, 0x1a, 0xe9, 0x13, 0xc0, 0x20, 0x82,
   1189         0x65, 0xbb, 0x42, 0x3b, 0xed, 0x08, 0x6a, 0x84, 0x4f, 0xea, 0x77, 0x14,
   1190         0x32, 0xf9, 0xed, 0xc2, 0x12, 0xd6, 0xc5, 0xc6, 0xb3, 0xe5, 0xf2, 0x6e,
   1191         0xf6, 0x16, 0x7f, 0x37, 0xde, 0xbc, 0x09, 0xc7, 0x06, 0x6b, 0x12, 0xbc,
   1192         0xad, 0x2d, 0x49, 0x25, 0xd5, 0xdc, 0xf4, 0x18, 0x14, 0xd2, 0xf0, 0xf1,
   1193         0x1d, 0x1f, 0x3a, 0xaa, 0x15, 0x55, 0xbb, 0x0d, 0x7f, 0xbe, 0x67, 0xa1,
   1194         0xa7, 0xf0, 0xaa, 0xb3, 0xfb, 0x41, 0x82, 0x39, 0x49, 0x93, 0xbc, 0xa8,
   1195         0xee, 0x72, 0x13, 0x45, 0x65, 0x15, 0x42, 0x17, 0xaa, 0xd8, 0xab, 0xcf,
   1196         0x33, 0x42, 0x83, 0x42
   1197     };
   1198     static const char group_name[] = "ffdhe2048";
   1199     static const long priv_len = 224;
   1200 
   1201     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
   1202         || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
   1203         || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
   1204         || !TEST_true(OSSL_PARAM_BLD_push_utf8_string(bld,
   1205             OSSL_PKEY_PARAM_GROUP_NAME,
   1206             group_name, 0))
   1207         || !TEST_true(OSSL_PARAM_BLD_push_long(bld, OSSL_PKEY_PARAM_DH_PRIV_LEN,
   1208             priv_len))
   1209         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY, pub))
   1210         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, priv))
   1211         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
   1212         goto err;
   1213 
   1214     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL)))
   1215         goto err;
   1216 
   1217     if (!TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
   1218         || !TEST_int_eq(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
   1219                             fromdata_params),
   1220             1))
   1221         goto err;
   1222 
   1223     for (;;) {
   1224         ret = 0;
   1225         if (!TEST_int_eq(EVP_PKEY_get_bits(pk), 2048)
   1226             || !TEST_int_eq(EVP_PKEY_get_security_bits(pk), 112)
   1227             || !TEST_int_eq(EVP_PKEY_get_size(pk), 256)
   1228             || !TEST_false(EVP_PKEY_missing_parameters(pk)))
   1229             goto err;
   1230 
   1231         if (!TEST_true(EVP_PKEY_get_utf8_string_param(pk,
   1232                 OSSL_PKEY_PARAM_GROUP_NAME,
   1233                 name_out,
   1234                 sizeof(name_out),
   1235                 &len))
   1236             || !TEST_str_eq(name_out, group_name)
   1237             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
   1238                 &pub_out))
   1239             || !TEST_BN_eq(pub, pub_out)
   1240             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
   1241                 &priv_out))
   1242             || !TEST_BN_eq(priv, priv_out)
   1243             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P, &p))
   1244             || !TEST_BN_eq(&ossl_bignum_ffdhe2048_p, p)
   1245             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q, &q))
   1246             || !TEST_ptr(q)
   1247             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G, &g))
   1248             || !TEST_BN_eq(&ossl_bignum_const_2, g)
   1249             || !TEST_false(EVP_PKEY_get_bn_param(pk,
   1250                 OSSL_PKEY_PARAM_FFC_COFACTOR,
   1251                 &j))
   1252             || !TEST_ptr_null(j)
   1253             || !TEST_false(EVP_PKEY_get_octet_string_param(pk,
   1254                 OSSL_PKEY_PARAM_FFC_SEED,
   1255                 seed_out,
   1256                 sizeof(seed_out),
   1257                 &len))
   1258             || !TEST_true(EVP_PKEY_get_int_param(pk,
   1259                 OSSL_PKEY_PARAM_FFC_GINDEX,
   1260                 &gindex))
   1261             || !TEST_int_eq(gindex, -1)
   1262             || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H,
   1263                 &hindex))
   1264             || !TEST_int_eq(hindex, 0)
   1265             || !TEST_true(EVP_PKEY_get_int_param(pk,
   1266                 OSSL_PKEY_PARAM_FFC_PCOUNTER,
   1267                 &pcounter))
   1268             || !TEST_int_eq(pcounter, -1))
   1269             goto err;
   1270         BN_free(p);
   1271         p = NULL;
   1272         BN_free(q);
   1273         q = NULL;
   1274         BN_free(g);
   1275         g = NULL;
   1276         BN_free(j);
   1277         j = NULL;
   1278         BN_free(pub_out);
   1279         pub_out = NULL;
   1280         BN_free(priv_out);
   1281         priv_out = NULL;
   1282 
   1283         if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
   1284             goto err;
   1285 
   1286         if (!TEST_int_gt(EVP_PKEY_check(key_ctx), 0)
   1287             || !TEST_int_gt(EVP_PKEY_public_check(key_ctx), 0)
   1288             || !TEST_int_gt(EVP_PKEY_private_check(key_ctx), 0)
   1289             || !TEST_int_gt(EVP_PKEY_pairwise_check(key_ctx), 0))
   1290             goto err;
   1291         EVP_PKEY_CTX_free(key_ctx);
   1292         key_ctx = NULL;
   1293 
   1294         ret = test_print_key_using_pem("DH", pk)
   1295             && test_print_key_using_encoder("DH", pk);
   1296 
   1297         if (!ret || dup_pk != NULL)
   1298             break;
   1299 
   1300         if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
   1301             goto err;
   1302         ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
   1303         EVP_PKEY_free(pk);
   1304         pk = dup_pk;
   1305         if (!ret)
   1306             goto err;
   1307     }
   1308 err:
   1309     BN_free(p);
   1310     BN_free(q);
   1311     BN_free(g);
   1312     BN_free(j);
   1313     BN_free(pub);
   1314     BN_free(priv);
   1315     BN_free(pub_out);
   1316     BN_free(priv_out);
   1317     EVP_PKEY_free(pk);
   1318     EVP_PKEY_CTX_free(ctx);
   1319     EVP_PKEY_CTX_free(key_ctx);
   1320     OSSL_PARAM_free(fromdata_params);
   1321     OSSL_PARAM_BLD_free(bld);
   1322 
   1323     return ret;
   1324 }
   1325 
   1326 #endif
   1327 
   1328 #ifndef OPENSSL_NO_EC
   1329 #ifndef OPENSSL_NO_ECX
   1330 /* Array indexes used in test_fromdata_ecx */
   1331 #define PRIV_KEY 0
   1332 #define PUB_KEY 1
   1333 
   1334 #define X25519_IDX 0
   1335 #define X448_IDX 1
   1336 #define ED25519_IDX 2
   1337 #define ED448_IDX 3
   1338 
   1339 /*
   1340  * tst uses indexes 0 ... (3 * 4 - 1)
   1341  * For the 4 ECX key types (X25519_IDX..ED448_IDX)
   1342  * 0..3  = public + private key.
   1343  * 4..7  = private key (This will generate the public key from the private key)
   1344  * 8..11 = public key
   1345  */
   1346 static int test_fromdata_ecx(int tst)
   1347 {
   1348     int ret = 0;
   1349     EVP_PKEY_CTX *ctx = NULL, *ctx2 = NULL;
   1350     EVP_PKEY *pk = NULL, *copy_pk = NULL, *dup_pk = NULL;
   1351     const char *alg = NULL;
   1352     size_t len;
   1353     unsigned char out_pub[ED448_KEYLEN];
   1354     unsigned char out_priv[ED448_KEYLEN];
   1355     OSSL_PARAM params[3] = { OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END };
   1356 
   1357     /* ED448_KEYLEN > X448_KEYLEN > X25519_KEYLEN == ED25519_KEYLEN */
   1358     static unsigned char key_numbers[4][2][ED448_KEYLEN] = {
   1359         /* X25519: Keys from RFC 7748 6.1 */
   1360         {
   1361             /* Private Key */
   1362             {
   1363                 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d, 0x3c, 0x16,
   1364                 0xc1, 0x72, 0x51, 0xb2, 0x66, 0x45, 0xdf, 0x4c, 0x2f, 0x87,
   1365                 0xeb, 0xc0, 0x99, 0x2a, 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9,
   1366                 0x2c, 0x2a },
   1367             /* Public Key */
   1368             {
   1369                 0x85, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54, 0x74, 0x8b,
   1370                 0x7d, 0xdc, 0xb4, 0x3e, 0xf7, 0x5a, 0x0d, 0xbf, 0x3a, 0x0d,
   1371                 0x26, 0x38, 0x1a, 0xf4, 0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b,
   1372                 0x4e, 0x6a } },
   1373         /* X448: Keys from RFC 7748 6.2 */
   1374         {
   1375             /* Private Key */
   1376             {
   1377                 0x9a, 0x8f, 0x49, 0x25, 0xd1, 0x51, 0x9f, 0x57, 0x75, 0xcf,
   1378                 0x46, 0xb0, 0x4b, 0x58, 0x00, 0xd4, 0xee, 0x9e, 0xe8, 0xba,
   1379                 0xe8, 0xbc, 0x55, 0x65, 0xd4, 0x98, 0xc2, 0x8d, 0xd9, 0xc9,
   1380                 0xba, 0xf5, 0x74, 0xa9, 0x41, 0x97, 0x44, 0x89, 0x73, 0x91,
   1381                 0x00, 0x63, 0x82, 0xa6, 0xf1, 0x27, 0xab, 0x1d, 0x9a, 0xc2,
   1382                 0xd8, 0xc0, 0xa5, 0x98, 0x72, 0x6b },
   1383             /* Public Key */
   1384             {
   1385                 0x9b, 0x08, 0xf7, 0xcc, 0x31, 0xb7, 0xe3, 0xe6, 0x7d, 0x22,
   1386                 0xd5, 0xae, 0xa1, 0x21, 0x07, 0x4a, 0x27, 0x3b, 0xd2, 0xb8,
   1387                 0x3d, 0xe0, 0x9c, 0x63, 0xfa, 0xa7, 0x3d, 0x2c, 0x22, 0xc5,
   1388                 0xd9, 0xbb, 0xc8, 0x36, 0x64, 0x72, 0x41, 0xd9, 0x53, 0xd4,
   1389                 0x0c, 0x5b, 0x12, 0xda, 0x88, 0x12, 0x0d, 0x53, 0x17, 0x7f,
   1390                 0x80, 0xe5, 0x32, 0xc4, 0x1f, 0xa0 } },
   1391         /* ED25519: Keys from RFC 8032 */
   1392         {
   1393             /* Private Key */
   1394             {
   1395                 0x9d, 0x61, 0xb1, 0x9d, 0xef, 0xfd, 0x5a, 0x60, 0xba, 0x84,
   1396                 0x4a, 0xf4, 0x92, 0xec, 0x2c, 0xc4, 0x44, 0x49, 0xc5, 0x69,
   1397                 0x7b, 0x32, 0x69, 0x19, 0x70, 0x3b, 0xac, 0x03, 0x1c, 0xae,
   1398                 0x7f, 0x60 },
   1399             /* Public Key */
   1400             {
   1401                 0xd7, 0x5a, 0x98, 0x01, 0x82, 0xb1, 0x0a, 0xb7, 0xd5, 0x4b,
   1402                 0xfe, 0xd3, 0xc9, 0x64, 0x07, 0x3a, 0x0e, 0xe1, 0x72, 0xf3,
   1403                 0xda, 0xa6, 0x23, 0x25, 0xaf, 0x02, 0x1a, 0x68, 0xf7, 0x07,
   1404                 0x51, 0x1a } },
   1405         /* ED448: Keys from RFC 8032 */
   1406         {
   1407             /* Private Key */
   1408             {
   1409                 0x6c, 0x82, 0xa5, 0x62, 0xcb, 0x80, 0x8d, 0x10, 0xd6, 0x32,
   1410                 0xbe, 0x89, 0xc8, 0x51, 0x3e, 0xbf, 0x6c, 0x92, 0x9f, 0x34,
   1411                 0xdd, 0xfa, 0x8c, 0x9f, 0x63, 0xc9, 0x96, 0x0e, 0xf6, 0xe3,
   1412                 0x48, 0xa3, 0x52, 0x8c, 0x8a, 0x3f, 0xcc, 0x2f, 0x04, 0x4e,
   1413                 0x39, 0xa3, 0xfc, 0x5b, 0x94, 0x49, 0x2f, 0x8f, 0x03, 0x2e,
   1414                 0x75, 0x49, 0xa2, 0x00, 0x98, 0xf9, 0x5b },
   1415             /* Public Key */
   1416             {
   1417                 0x5f, 0xd7, 0x44, 0x9b, 0x59, 0xb4, 0x61, 0xfd, 0x2c, 0xe7,
   1418                 0x87, 0xec, 0x61, 0x6a, 0xd4, 0x6a, 0x1d, 0xa1, 0x34, 0x24,
   1419                 0x85, 0xa7, 0x0e, 0x1f, 0x8a, 0x0e, 0xa7, 0x5d, 0x80, 0xe9,
   1420                 0x67, 0x78, 0xed, 0xf1, 0x24, 0x76, 0x9b, 0x46, 0xc7, 0x06,
   1421                 0x1b, 0xd6, 0x78, 0x3d, 0xf1, 0xe5, 0x0f, 0x6c, 0xd1, 0xfa,
   1422                 0x1a, 0xbe, 0xaf, 0xe8, 0x25, 0x61, 0x80 } }
   1423     };
   1424     OSSL_PARAM x25519_fromdata_params[] = {
   1425         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
   1426             key_numbers[X25519_IDX][PRIV_KEY],
   1427             X25519_KEYLEN),
   1428         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
   1429             key_numbers[X25519_IDX][PUB_KEY],
   1430             X25519_KEYLEN),
   1431         OSSL_PARAM_END
   1432     };
   1433     OSSL_PARAM x448_fromdata_params[] = {
   1434         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
   1435             key_numbers[X448_IDX][PRIV_KEY],
   1436             X448_KEYLEN),
   1437         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
   1438             key_numbers[X448_IDX][PUB_KEY],
   1439             X448_KEYLEN),
   1440         OSSL_PARAM_END
   1441     };
   1442     OSSL_PARAM ed25519_fromdata_params[] = {
   1443         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
   1444             key_numbers[ED25519_IDX][PRIV_KEY],
   1445             ED25519_KEYLEN),
   1446         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
   1447             key_numbers[ED25519_IDX][PUB_KEY],
   1448             ED25519_KEYLEN),
   1449         OSSL_PARAM_END
   1450     };
   1451     OSSL_PARAM ed448_fromdata_params[] = {
   1452         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY,
   1453             key_numbers[ED448_IDX][PRIV_KEY],
   1454             ED448_KEYLEN),
   1455         OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY,
   1456             key_numbers[ED448_IDX][PUB_KEY],
   1457             ED448_KEYLEN),
   1458         OSSL_PARAM_END
   1459     };
   1460     OSSL_PARAM *fromdata_params = NULL;
   1461     int bits = 0, security_bits = 0, size = 0;
   1462     OSSL_PARAM *orig_fromdata_params = NULL;
   1463 
   1464     switch (tst & 3) {
   1465     case X25519_IDX:
   1466         fromdata_params = x25519_fromdata_params;
   1467         bits = X25519_BITS;
   1468         security_bits = X25519_SECURITY_BITS;
   1469         size = X25519_KEYLEN;
   1470         alg = "X25519";
   1471         break;
   1472 
   1473     case X448_IDX:
   1474         fromdata_params = x448_fromdata_params;
   1475         bits = X448_BITS;
   1476         security_bits = X448_SECURITY_BITS;
   1477         size = X448_KEYLEN;
   1478         alg = "X448";
   1479         break;
   1480 
   1481     case ED25519_IDX:
   1482         fromdata_params = ed25519_fromdata_params;
   1483         bits = ED25519_BITS;
   1484         security_bits = ED25519_SECURITY_BITS;
   1485         size = ED25519_SIGSIZE;
   1486         alg = "ED25519";
   1487         break;
   1488 
   1489     case ED448_IDX:
   1490         fromdata_params = ed448_fromdata_params;
   1491         bits = ED448_BITS;
   1492         security_bits = ED448_SECURITY_BITS;
   1493         size = ED448_SIGSIZE;
   1494         alg = "ED448";
   1495         break;
   1496     default:
   1497         goto err;
   1498     }
   1499 
   1500     ctx = EVP_PKEY_CTX_new_from_name(NULL, alg, NULL);
   1501     if (!TEST_ptr(ctx))
   1502         goto err;
   1503 
   1504     orig_fromdata_params = fromdata_params;
   1505     if (tst > 7) {
   1506         /* public key only */
   1507         fromdata_params++;
   1508     } else if (tst > 3) {
   1509         /* private key only */
   1510         params[0] = fromdata_params[0];
   1511         params[1] = fromdata_params[2];
   1512         fromdata_params = params;
   1513     }
   1514 
   1515     if (!TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
   1516         || !TEST_int_eq(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
   1517                             fromdata_params),
   1518             1))
   1519         goto err;
   1520 
   1521     for (;;) {
   1522         ret = 0;
   1523         if (!TEST_int_eq(EVP_PKEY_get_bits(pk), bits)
   1524             || !TEST_int_eq(EVP_PKEY_get_security_bits(pk), security_bits)
   1525             || !TEST_int_eq(EVP_PKEY_get_size(pk), size)
   1526             || !TEST_false(EVP_PKEY_missing_parameters(pk)))
   1527             goto err;
   1528 
   1529         if (!TEST_ptr(ctx2 = EVP_PKEY_CTX_new_from_pkey(NULL, pk, NULL)))
   1530             goto err;
   1531         if (tst <= 7) {
   1532             if (!TEST_int_gt(EVP_PKEY_check(ctx2), 0))
   1533                 goto err;
   1534             if (!TEST_true(EVP_PKEY_get_octet_string_param(
   1535                     pk, orig_fromdata_params[PRIV_KEY].key,
   1536                     out_priv, sizeof(out_priv), &len))
   1537                 || !TEST_mem_eq(out_priv, len,
   1538                     orig_fromdata_params[PRIV_KEY].data,
   1539                     orig_fromdata_params[PRIV_KEY].data_size)
   1540                 || !TEST_true(EVP_PKEY_get_octet_string_param(
   1541                     pk, orig_fromdata_params[PUB_KEY].key,
   1542                     out_pub, sizeof(out_pub), &len))
   1543                 || !TEST_mem_eq(out_pub, len,
   1544                     orig_fromdata_params[PUB_KEY].data,
   1545                     orig_fromdata_params[PUB_KEY].data_size))
   1546                 goto err;
   1547         } else {
   1548             /* The private key check should fail if there is only a public key */
   1549             if (!TEST_int_gt(EVP_PKEY_public_check(ctx2), 0)
   1550                 || !TEST_int_le(EVP_PKEY_private_check(ctx2), 0)
   1551                 || !TEST_int_le(EVP_PKEY_check(ctx2), 0))
   1552                 goto err;
   1553         }
   1554         EVP_PKEY_CTX_free(ctx2);
   1555         ctx2 = NULL;
   1556 
   1557         if (!TEST_ptr(copy_pk = EVP_PKEY_new())
   1558             /* This should succeed because there are no parameters to copy */
   1559             || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
   1560             goto err;
   1561         if (!TEST_ptr(ctx2 = EVP_PKEY_CTX_new_from_pkey(NULL, copy_pk, NULL))
   1562             /* This should fail because copy_pk has no pubkey */
   1563             || !TEST_int_le(EVP_PKEY_public_check(ctx2), 0))
   1564             goto err;
   1565         EVP_PKEY_CTX_free(ctx2);
   1566         ctx2 = NULL;
   1567         EVP_PKEY_free(copy_pk);
   1568         copy_pk = NULL;
   1569 
   1570         if (tst > 7)
   1571             ret = test_print_key_using_encoder_public(alg, pk);
   1572         else
   1573             ret = test_print_key_using_pem(alg, pk)
   1574                 && test_print_key_using_encoder(alg, pk);
   1575 
   1576         if (!ret || dup_pk != NULL)
   1577             break;
   1578 
   1579         if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
   1580             goto err;
   1581         ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
   1582         EVP_PKEY_free(pk);
   1583         pk = dup_pk;
   1584         if (!ret)
   1585             goto err;
   1586     }
   1587 
   1588 err:
   1589     EVP_PKEY_free(pk);
   1590     EVP_PKEY_free(copy_pk);
   1591     EVP_PKEY_CTX_free(ctx);
   1592     EVP_PKEY_CTX_free(ctx2);
   1593 
   1594     return ret;
   1595 }
   1596 #endif /* OPENSSL_NO_ECX */
   1597 
   1598 static int test_fromdata_ec(void)
   1599 {
   1600     int ret = 0;
   1601     EVP_PKEY_CTX *ctx = NULL;
   1602     EVP_PKEY *pk = NULL, *copy_pk = NULL, *dup_pk = NULL;
   1603     OSSL_PARAM_BLD *bld = NULL;
   1604     BIGNUM *ec_priv_bn = NULL;
   1605     BIGNUM *bn_priv = NULL;
   1606     OSSL_PARAM *fromdata_params = NULL;
   1607     const char *alg = "EC";
   1608     const char *curve = "prime256v1";
   1609     const char bad_curve[] = "nonexistent-curve";
   1610     OSSL_PARAM nokey_params[2] = {
   1611         OSSL_PARAM_END,
   1612         OSSL_PARAM_END
   1613     };
   1614     /* UNCOMPRESSED FORMAT */
   1615     static const unsigned char ec_pub_keydata[] = {
   1616         POINT_CONVERSION_UNCOMPRESSED,
   1617         0x1b, 0x93, 0x67, 0x55, 0x1c, 0x55, 0x9f, 0x63,
   1618         0xd1, 0x22, 0xa4, 0xd8, 0xd1, 0x0a, 0x60, 0x6d,
   1619         0x02, 0xa5, 0x77, 0x57, 0xc8, 0xa3, 0x47, 0x73,
   1620         0x3a, 0x6a, 0x08, 0x28, 0x39, 0xbd, 0xc9, 0xd2,
   1621         0x80, 0xec, 0xe9, 0xa7, 0x08, 0x29, 0x71, 0x2f,
   1622         0xc9, 0x56, 0x82, 0xee, 0x9a, 0x85, 0x0f, 0x6d,
   1623         0x7f, 0x59, 0x5f, 0x8c, 0xd1, 0x96, 0x0b, 0xdf,
   1624         0x29, 0x3e, 0x49, 0x07, 0x88, 0x3f, 0x9a, 0x29
   1625     };
   1626     /* SAME BUT COMPRESSED FORMAT */
   1627     static const unsigned char ec_pub_keydata_compressed[] = {
   1628         POINT_CONVERSION_COMPRESSED + 1,
   1629         0x1b, 0x93, 0x67, 0x55, 0x1c, 0x55, 0x9f, 0x63,
   1630         0xd1, 0x22, 0xa4, 0xd8, 0xd1, 0x0a, 0x60, 0x6d,
   1631         0x02, 0xa5, 0x77, 0x57, 0xc8, 0xa3, 0x47, 0x73,
   1632         0x3a, 0x6a, 0x08, 0x28, 0x39, 0xbd, 0xc9, 0xd2
   1633     };
   1634     static const unsigned char ec_priv_keydata[] = {
   1635         0x33, 0xd0, 0x43, 0x83, 0xa9, 0x89, 0x56, 0x03,
   1636         0xd2, 0xd7, 0xfe, 0x6b, 0x01, 0x6f, 0xe4, 0x59,
   1637         0xcc, 0x0d, 0x9a, 0x24, 0x6c, 0x86, 0x1b, 0x2e,
   1638         0xdc, 0x4b, 0x4d, 0x35, 0x43, 0xe1, 0x1b, 0xad
   1639     };
   1640     unsigned char out_pub[sizeof(ec_pub_keydata)];
   1641     char out_curve_name[80];
   1642     const OSSL_PARAM *gettable = NULL;
   1643     size_t len;
   1644     EC_GROUP *group = NULL;
   1645     BIGNUM *group_a = NULL;
   1646     BIGNUM *group_b = NULL;
   1647     BIGNUM *group_p = NULL;
   1648     BIGNUM *a = NULL;
   1649     BIGNUM *b = NULL;
   1650     BIGNUM *p = NULL;
   1651 
   1652     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new()))
   1653         goto err;
   1654     if (!TEST_ptr(ec_priv_bn = BN_bin2bn(ec_priv_keydata,
   1655                       sizeof(ec_priv_keydata), NULL)))
   1656         goto err;
   1657 
   1658     if (OSSL_PARAM_BLD_push_utf8_string(bld, OSSL_PKEY_PARAM_GROUP_NAME,
   1659             curve, 0)
   1660         <= 0)
   1661         goto err;
   1662     /*
   1663      * We intentionally provide the input point in compressed format,
   1664      * and avoid setting `OSSL_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT`.
   1665      *
   1666      * Later on we check what format is used when exporting the
   1667      * `OSSL_PKEY_PARAM_PUB_KEY` and expect to default to uncompressed
   1668      * format.
   1669      */
   1670     if (OSSL_PARAM_BLD_push_octet_string(bld, OSSL_PKEY_PARAM_PUB_KEY,
   1671             ec_pub_keydata_compressed,
   1672             sizeof(ec_pub_keydata_compressed))
   1673         <= 0)
   1674         goto err;
   1675     if (OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY, ec_priv_bn) <= 0)
   1676         goto err;
   1677     if (!TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
   1678         goto err;
   1679     ctx = EVP_PKEY_CTX_new_from_name(NULL, alg, NULL);
   1680     if (!TEST_ptr(ctx))
   1681         goto err;
   1682 
   1683     /* try importing parameters with bad curve first */
   1684     nokey_params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME,
   1685         (char *)bad_curve, sizeof(bad_curve));
   1686     if (!TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
   1687         || !TEST_int_eq(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEY_PARAMETERS,
   1688                             nokey_params),
   1689             0)
   1690         || !TEST_ptr_null(pk))
   1691         goto err;
   1692 
   1693     if (!TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
   1694         || !TEST_int_eq(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
   1695                             fromdata_params),
   1696             1))
   1697         goto err;
   1698 
   1699     for (;;) {
   1700         ret = 0;
   1701         if (!TEST_int_eq(EVP_PKEY_get_bits(pk), 256)
   1702             || !TEST_int_eq(EVP_PKEY_get_security_bits(pk), 128)
   1703             || !TEST_int_eq(EVP_PKEY_get_size(pk), 2 + 35 * 2)
   1704             || !TEST_false(EVP_PKEY_missing_parameters(pk)))
   1705             goto err;
   1706 
   1707         if (!TEST_ptr(copy_pk = EVP_PKEY_new())
   1708             || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
   1709             goto err;
   1710         EVP_PKEY_free(copy_pk);
   1711         copy_pk = NULL;
   1712 
   1713         if (!TEST_ptr(gettable = EVP_PKEY_gettable_params(pk))
   1714             || !TEST_ptr(OSSL_PARAM_locate_const(gettable,
   1715                 OSSL_PKEY_PARAM_GROUP_NAME))
   1716             || !TEST_ptr(OSSL_PARAM_locate_const(gettable,
   1717                 OSSL_PKEY_PARAM_PUB_KEY))
   1718             || !TEST_ptr(OSSL_PARAM_locate_const(gettable,
   1719                 OSSL_PKEY_PARAM_PRIV_KEY)))
   1720             goto err;
   1721 
   1722         if (!TEST_ptr(group = EC_GROUP_new_by_curve_name(OBJ_sn2nid(curve)))
   1723             || !TEST_ptr(group_p = BN_new())
   1724             || !TEST_ptr(group_a = BN_new())
   1725             || !TEST_ptr(group_b = BN_new())
   1726             || !TEST_true(EC_GROUP_get_curve(group, group_p, group_a, group_b, NULL)))
   1727             goto err;
   1728 
   1729         if (!TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_EC_A, &a))
   1730             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_EC_B, &b))
   1731             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_EC_P, &p)))
   1732             goto err;
   1733 
   1734         if (!TEST_BN_eq(group_p, p) || !TEST_BN_eq(group_a, a)
   1735             || !TEST_BN_eq(group_b, b))
   1736             goto err;
   1737 
   1738         EC_GROUP_free(group);
   1739         group = NULL;
   1740         BN_free(group_p);
   1741         group_p = NULL;
   1742         BN_free(group_a);
   1743         group_a = NULL;
   1744         BN_free(group_b);
   1745         group_b = NULL;
   1746 
   1747         if (!EVP_PKEY_get_utf8_string_param(pk, OSSL_PKEY_PARAM_GROUP_NAME,
   1748                 out_curve_name,
   1749                 sizeof(out_curve_name),
   1750                 &len)
   1751             || !TEST_str_eq(out_curve_name, curve)
   1752             || !EVP_PKEY_get_octet_string_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
   1753                 out_pub, sizeof(out_pub), &len)
   1754 
   1755             /*
   1756              * Our providers use uncompressed format by default if
   1757              * `OSSL_PKEY_PARAM_EC_POINT_CONVERSION_FORMAT` was not
   1758              * explicitly set, irrespective of the format used for the
   1759              * input point given as a param to create this key.
   1760              */
   1761             || !TEST_true(out_pub[0] == POINT_CONVERSION_UNCOMPRESSED)
   1762             || !TEST_mem_eq(out_pub + 1, len - 1,
   1763                 ec_pub_keydata + 1, sizeof(ec_pub_keydata) - 1)
   1764 
   1765             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
   1766                 &bn_priv))
   1767             || !TEST_BN_eq(ec_priv_bn, bn_priv))
   1768             goto err;
   1769         BN_free(bn_priv);
   1770         bn_priv = NULL;
   1771 
   1772         ret = test_print_key_using_pem(alg, pk)
   1773             && test_print_key_using_encoder(alg, pk);
   1774 
   1775         if (!ret || dup_pk != NULL)
   1776             break;
   1777 
   1778         if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
   1779             goto err;
   1780         ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
   1781         EVP_PKEY_free(pk);
   1782         pk = dup_pk;
   1783         if (!ret)
   1784             goto err;
   1785     }
   1786 
   1787 err:
   1788     EC_GROUP_free(group);
   1789     BN_free(group_a);
   1790     BN_free(group_b);
   1791     BN_free(group_p);
   1792     BN_free(a);
   1793     BN_free(b);
   1794     BN_free(p);
   1795     BN_free(bn_priv);
   1796     BN_free(ec_priv_bn);
   1797     OSSL_PARAM_free(fromdata_params);
   1798     OSSL_PARAM_BLD_free(bld);
   1799     EVP_PKEY_free(pk);
   1800     EVP_PKEY_free(copy_pk);
   1801     EVP_PKEY_CTX_free(ctx);
   1802     return ret;
   1803 }
   1804 
   1805 static int test_ec_dup_no_operation(void)
   1806 {
   1807     int ret = 0;
   1808     EVP_PKEY_CTX *pctx = NULL, *ctx = NULL, *kctx = NULL;
   1809     EVP_PKEY *param = NULL, *pkey = NULL;
   1810 
   1811     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL))
   1812         || !TEST_int_gt(EVP_PKEY_paramgen_init(pctx), 0)
   1813         || !TEST_int_gt(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
   1814                             NID_X9_62_prime256v1),
   1815             0)
   1816         || !TEST_int_gt(EVP_PKEY_paramgen(pctx, &param), 0)
   1817         || !TEST_ptr(param))
   1818         goto err;
   1819 
   1820     EVP_PKEY_CTX_free(pctx);
   1821     pctx = NULL;
   1822 
   1823     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_pkey(NULL, param, NULL))
   1824         || !TEST_ptr(kctx = EVP_PKEY_CTX_dup(ctx))
   1825         || !TEST_int_gt(EVP_PKEY_keygen_init(kctx), 0)
   1826         || !TEST_int_gt(EVP_PKEY_keygen(kctx, &pkey), 0))
   1827         goto err;
   1828     ret = 1;
   1829 err:
   1830     EVP_PKEY_free(pkey);
   1831     EVP_PKEY_free(param);
   1832     EVP_PKEY_CTX_free(ctx);
   1833     EVP_PKEY_CTX_free(kctx);
   1834     EVP_PKEY_CTX_free(pctx);
   1835     return ret;
   1836 }
   1837 
   1838 /* Test that keygen doesn't support EVP_PKEY_CTX_dup */
   1839 static int test_ec_dup_keygen_operation(void)
   1840 {
   1841     int ret = 0;
   1842     EVP_PKEY_CTX *pctx = NULL, *ctx = NULL, *kctx = NULL;
   1843     EVP_PKEY *param = NULL, *pkey = NULL;
   1844 
   1845     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL))
   1846         || !TEST_int_gt(EVP_PKEY_paramgen_init(pctx), 0)
   1847         || !TEST_int_gt(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
   1848                             NID_X9_62_prime256v1),
   1849             0)
   1850         || !TEST_int_gt(EVP_PKEY_paramgen(pctx, &param), 0)
   1851         || !TEST_ptr(param))
   1852         goto err;
   1853 
   1854     EVP_PKEY_CTX_free(pctx);
   1855     pctx = NULL;
   1856 
   1857     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_pkey(NULL, param, NULL))
   1858         || !TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
   1859         || !TEST_ptr_null(kctx = EVP_PKEY_CTX_dup(ctx)))
   1860         goto err;
   1861     ret = 1;
   1862 err:
   1863     EVP_PKEY_free(pkey);
   1864     EVP_PKEY_free(param);
   1865     EVP_PKEY_CTX_free(ctx);
   1866     EVP_PKEY_CTX_free(kctx);
   1867     EVP_PKEY_CTX_free(pctx);
   1868     return ret;
   1869 }
   1870 
   1871 #endif /* OPENSSL_NO_EC */
   1872 
   1873 #ifndef OPENSSL_NO_DSA
   1874 static int test_fromdata_dsa_fips186_4(void)
   1875 {
   1876     int ret = 0;
   1877     EVP_PKEY_CTX *ctx = NULL, *key_ctx = NULL;
   1878     EVP_PKEY *pk = NULL, *copy_pk = NULL, *dup_pk = NULL;
   1879     BIGNUM *pub = NULL, *priv = NULL;
   1880     BIGNUM *p = NULL, *q = NULL, *g = NULL;
   1881     BIGNUM *pub_out = NULL, *priv_out = NULL;
   1882     BIGNUM *p_out = NULL, *q_out = NULL, *g_out = NULL, *j_out = NULL;
   1883     int gindex_out = 0, pcounter_out = 0, hindex_out = 0;
   1884     char name_out[80];
   1885     unsigned char seed_out[32];
   1886     size_t len;
   1887     OSSL_PARAM_BLD *bld = NULL;
   1888     OSSL_PARAM *fromdata_params = NULL;
   1889 
   1890     /*
   1891      * DSA parameter data was generated using the following:
   1892      * openssl genpkey -genparam -algorithm DSA -pkeyopt pbits:2048 \
   1893      *                 -pkeyopt qbits:256 -pkeyopt type:0 \
   1894      *                 -pkeyopt gindex:1 -out dsa_params.pem -text
   1895      */
   1896     static const unsigned char p_data[] = {
   1897         0x00, 0xa0, 0xb7, 0x02, 0xc4, 0xac, 0xa6, 0x42, 0xab, 0xf2, 0x34, 0x0b,
   1898         0x22, 0x47, 0x1f, 0x33, 0xcf, 0xd5, 0x04, 0xe4, 0x3e, 0xec, 0xa1, 0x21,
   1899         0xc8, 0x41, 0x2b, 0xef, 0xb8, 0x1f, 0x0b, 0x5b, 0x88, 0x8b, 0x67, 0xf8,
   1900         0x68, 0x6d, 0x7c, 0x4d, 0x96, 0x5f, 0x3c, 0x66, 0xef, 0x58, 0x34, 0xd7,
   1901         0xf6, 0xa2, 0x1b, 0xad, 0xc8, 0x12, 0x52, 0xb8, 0xe8, 0x2a, 0x63, 0xcc,
   1902         0xea, 0xe7, 0x4e, 0xc8, 0x34, 0x4c, 0x58, 0x59, 0x0a, 0xc2, 0x4a, 0xe4,
   1903         0xb4, 0x64, 0x20, 0xf4, 0xf6, 0x0a, 0xcf, 0x86, 0x01, 0x6c, 0x7f, 0x23,
   1904         0x4a, 0x51, 0x07, 0x99, 0x42, 0x28, 0x7a, 0xff, 0x18, 0x67, 0x52, 0x64,
   1905         0xf2, 0x9a, 0x62, 0x30, 0xc3, 0x00, 0xde, 0x23, 0xe9, 0x11, 0x95, 0x7e,
   1906         0xd1, 0x3d, 0x8d, 0xb4, 0x0e, 0x9f, 0x9e, 0xb1, 0x30, 0x03, 0xf0, 0x73,
   1907         0xa8, 0x40, 0x48, 0x42, 0x7b, 0x60, 0xa0, 0xc4, 0xf2, 0x3b, 0x2d, 0x0a,
   1908         0x0c, 0xb8, 0x19, 0xfb, 0xb4, 0xf8, 0xe0, 0x2a, 0xc7, 0xf1, 0xc0, 0xc6,
   1909         0x86, 0x14, 0x60, 0x12, 0x0f, 0xc0, 0xde, 0x4a, 0x67, 0xec, 0xc7, 0xde,
   1910         0x76, 0x21, 0x1a, 0x55, 0x7f, 0x86, 0xc3, 0x97, 0x98, 0xce, 0xf5, 0xcd,
   1911         0xf0, 0xe7, 0x12, 0xd6, 0x93, 0xee, 0x1b, 0x9b, 0x61, 0xef, 0x05, 0x8c,
   1912         0x45, 0x46, 0xd9, 0x64, 0x6f, 0xbe, 0x27, 0xaa, 0x67, 0x01, 0xcc, 0x71,
   1913         0xb1, 0x60, 0xce, 0x21, 0xd8, 0x51, 0x17, 0x27, 0x0d, 0x90, 0x3d, 0x18,
   1914         0x7c, 0x87, 0x15, 0x8e, 0x48, 0x4c, 0x6c, 0xc5, 0x72, 0xeb, 0xb7, 0x56,
   1915         0xf5, 0x6b, 0x60, 0x8f, 0xc2, 0xfd, 0x3f, 0x46, 0x5c, 0x00, 0x91, 0x85,
   1916         0x79, 0x45, 0x5b, 0x1c, 0x82, 0xc4, 0x87, 0x50, 0x79, 0xba, 0xcc, 0x1c,
   1917         0x32, 0x7e, 0x2e, 0xb8, 0x2e, 0xc5, 0x4e, 0xd1, 0x9b, 0xdb, 0x66, 0x79,
   1918         0x7c, 0xfe, 0xaf, 0x6a, 0x05
   1919     };
   1920     static const unsigned char q_data[] = {
   1921         0xa8, 0xcd, 0xf4, 0x33, 0x7b, 0x13, 0x0a, 0x24, 0xc1, 0xde, 0x4a, 0x04,
   1922         0x7b, 0x4b, 0x71, 0x51, 0x32, 0xe9, 0x47, 0x74, 0xbd, 0x0c, 0x21, 0x40,
   1923         0x84, 0x12, 0x0a, 0x17, 0x73, 0xdb, 0x29, 0xc7
   1924     };
   1925     static const unsigned char g_data[] = {
   1926         0x6c, 0xc6, 0xa4, 0x3e, 0x61, 0x84, 0xc1, 0xff, 0x6f, 0x4a, 0x1a, 0x6b,
   1927         0xb0, 0x24, 0x4b, 0xd2, 0x92, 0x5b, 0x29, 0x5c, 0x61, 0xb8, 0xc9, 0x2b,
   1928         0xd6, 0xf7, 0x59, 0xfd, 0xd8, 0x70, 0x66, 0x77, 0xfc, 0xc1, 0xa4, 0xd4,
   1929         0xb0, 0x1e, 0xd5, 0xbf, 0x59, 0x98, 0xb3, 0x66, 0x8b, 0xf4, 0x2e, 0xe6,
   1930         0x12, 0x3e, 0xcc, 0xf8, 0x02, 0xb8, 0xc6, 0xc3, 0x47, 0xd2, 0xf5, 0xaa,
   1931         0x0c, 0x5f, 0x51, 0xf5, 0xd0, 0x4c, 0x55, 0x3d, 0x07, 0x73, 0xa6, 0x57,
   1932         0xce, 0x5a, 0xad, 0x42, 0x0c, 0x13, 0x0f, 0xe2, 0x31, 0x25, 0x8e, 0x72,
   1933         0x12, 0x73, 0x10, 0xdb, 0x7f, 0x79, 0xeb, 0x59, 0xfc, 0xfe, 0xf7, 0x0c,
   1934         0x1a, 0x81, 0x53, 0x96, 0x22, 0xb8, 0xe7, 0x58, 0xd8, 0x67, 0x80, 0x60,
   1935         0xad, 0x8b, 0x55, 0x1c, 0x91, 0xf0, 0x72, 0x9a, 0x7e, 0xad, 0x37, 0xf1,
   1936         0x77, 0x18, 0x96, 0x8a, 0x68, 0x70, 0xfc, 0x71, 0xa9, 0xa2, 0xe8, 0x35,
   1937         0x27, 0x78, 0xf2, 0xef, 0x59, 0x36, 0x6d, 0x7c, 0xb6, 0x98, 0xd8, 0x1e,
   1938         0xfa, 0x25, 0x73, 0x97, 0x45, 0x58, 0xe3, 0xae, 0xbd, 0x52, 0x54, 0x05,
   1939         0xd8, 0x26, 0x26, 0xba, 0xba, 0x05, 0xb5, 0xe9, 0xe5, 0x76, 0xae, 0x25,
   1940         0xdd, 0xfc, 0x10, 0x89, 0x5a, 0xa9, 0xee, 0x59, 0xc5, 0x79, 0x8b, 0xeb,
   1941         0x1e, 0x2c, 0x61, 0xab, 0x0d, 0xd1, 0x10, 0x04, 0x91, 0x32, 0x77, 0x4a,
   1942         0xa6, 0x64, 0x53, 0xda, 0x4c, 0xd7, 0x3a, 0x29, 0xd4, 0xf3, 0x82, 0x25,
   1943         0x1d, 0x6f, 0x4a, 0x7f, 0xd3, 0x08, 0x3b, 0x42, 0x30, 0x10, 0xd8, 0xd0,
   1944         0x97, 0x3a, 0xeb, 0x92, 0x63, 0xec, 0x93, 0x2b, 0x6f, 0x32, 0xd8, 0xcd,
   1945         0x80, 0xd3, 0xc0, 0x4c, 0x03, 0xd5, 0xca, 0xbc, 0x8f, 0xc7, 0x43, 0x53,
   1946         0x64, 0x66, 0x1c, 0x82, 0x2d, 0xfb, 0xff, 0x39, 0xba, 0xd6, 0x42, 0x62,
   1947         0x02, 0x6f, 0x96, 0x36
   1948     };
   1949     static const unsigned char seed_data[] = {
   1950         0x64, 0x46, 0x07, 0x32, 0x8d, 0x70, 0x9c, 0xb3, 0x8a, 0x35, 0xde, 0x62,
   1951         0x00, 0xf2, 0x6d, 0x52, 0x37, 0x4d, 0xb3, 0x84, 0xe1, 0x9d, 0x41, 0x04,
   1952         0xda, 0x7b, 0xdc, 0x0d, 0x8b, 0x5e, 0xe0, 0x84
   1953     };
   1954     const int gindex = 1;
   1955     const int pcounter = 53;
   1956     /*
   1957      * The keypair was generated using
   1958      * openssl genpkey -paramfile dsa_params.pem --pkeyopt pcounter:53 \
   1959      *                 -pkeyopt gindex:1 \
   1960      *                 -pkeyopt hexseed:644607328d709cb38a35de6200f26d -text
   1961      */
   1962     static const unsigned char priv_data[] = {
   1963         0x00, 0x8f, 0xc5, 0x9e, 0xd0, 0xf7, 0x2a, 0x0b, 0x66, 0xf1, 0x32, 0x73,
   1964         0xae, 0xf6, 0xd9, 0xd4, 0xdb, 0x2d, 0x96, 0x55, 0x89, 0xff, 0xef, 0xa8,
   1965         0x5f, 0x47, 0x8f, 0xca, 0x02, 0x8a, 0xe1, 0x35, 0x90
   1966     };
   1967     static const unsigned char pub_data[] = {
   1968         0x44, 0x19, 0xc9, 0x46, 0x45, 0x57, 0xc1, 0xa9, 0xd8, 0x30, 0x99, 0x29,
   1969         0x6a, 0x4b, 0x63, 0x71, 0x69, 0x96, 0x35, 0x17, 0xb2, 0x62, 0x9b, 0x80,
   1970         0x0a, 0x95, 0x9d, 0x6a, 0xc0, 0x32, 0x0d, 0x07, 0x5f, 0x19, 0x44, 0x02,
   1971         0xf1, 0xbd, 0xce, 0xdf, 0x10, 0xf8, 0x02, 0x5d, 0x7d, 0x98, 0x8a, 0x73,
   1972         0x89, 0x00, 0xb6, 0x24, 0xd6, 0x33, 0xe7, 0xcf, 0x8b, 0x49, 0x2a, 0xaf,
   1973         0x13, 0x1c, 0xb2, 0x52, 0x15, 0xfd, 0x9b, 0xd5, 0x40, 0x4a, 0x1a, 0xda,
   1974         0x29, 0x4c, 0x92, 0x7e, 0x66, 0x06, 0xdb, 0x61, 0x86, 0xac, 0xb5, 0xda,
   1975         0x3c, 0x7d, 0x73, 0x7e, 0x54, 0x32, 0x68, 0xa5, 0x02, 0xbc, 0x59, 0x47,
   1976         0x84, 0xd3, 0x87, 0x71, 0x5f, 0xeb, 0x43, 0x45, 0x24, 0xd3, 0xec, 0x08,
   1977         0x52, 0xc2, 0x89, 0x2d, 0x9c, 0x1a, 0xcc, 0x91, 0x65, 0x5d, 0xa3, 0xa1,
   1978         0x35, 0x31, 0x10, 0x1c, 0x3a, 0xa8, 0x4d, 0x18, 0xd5, 0x06, 0xaf, 0xb2,
   1979         0xec, 0x5c, 0x89, 0x9e, 0x90, 0x86, 0x10, 0x01, 0xeb, 0x51, 0xd5, 0x1b,
   1980         0x9c, 0xcb, 0x66, 0x07, 0x3f, 0xc4, 0x6e, 0x0a, 0x1b, 0x73, 0xa0, 0x4b,
   1981         0x5f, 0x4d, 0xab, 0x35, 0x28, 0xfa, 0xda, 0x3a, 0x0c, 0x08, 0xe8, 0xf3,
   1982         0xef, 0x42, 0x67, 0xbc, 0x21, 0xf2, 0xc2, 0xb8, 0xff, 0x1a, 0x81, 0x05,
   1983         0x68, 0x73, 0x62, 0xdf, 0xd7, 0xab, 0x0f, 0x22, 0x89, 0x57, 0x96, 0xd4,
   1984         0x93, 0xaf, 0xa1, 0x21, 0xa3, 0x48, 0xe9, 0xf0, 0x97, 0x47, 0xa0, 0x27,
   1985         0xba, 0x87, 0xb8, 0x15, 0x5f, 0xff, 0x2c, 0x50, 0x41, 0xf1, 0x7e, 0xc6,
   1986         0x81, 0xc4, 0x51, 0xf1, 0xfd, 0xd6, 0x86, 0xf7, 0x69, 0x97, 0xf1, 0x49,
   1987         0xc9, 0xf9, 0xf4, 0x9b, 0xf4, 0xe8, 0x85, 0xa7, 0xbd, 0x36, 0x55, 0x4a,
   1988         0x3d, 0xe8, 0x65, 0x09, 0x7b, 0xb7, 0x12, 0x64, 0xd2, 0x0a, 0x53, 0x60,
   1989         0x48, 0xd1, 0x8a, 0xbd
   1990     };
   1991 
   1992     if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
   1993         || !TEST_ptr(pub = BN_bin2bn(pub_data, sizeof(pub_data), NULL))
   1994         || !TEST_ptr(priv = BN_bin2bn(priv_data, sizeof(priv_data), NULL))
   1995         || !TEST_ptr(p = BN_bin2bn(p_data, sizeof(p_data), NULL))
   1996         || !TEST_ptr(q = BN_bin2bn(q_data, sizeof(q_data), NULL))
   1997         || !TEST_ptr(g = BN_bin2bn(g_data, sizeof(g_data), NULL))
   1998 
   1999         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_P, p))
   2000         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_Q, q))
   2001         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_FFC_G, g))
   2002         || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
   2003             OSSL_PKEY_PARAM_FFC_SEED,
   2004             seed_data,
   2005             sizeof(seed_data)))
   2006         || !TEST_true(OSSL_PARAM_BLD_push_int(bld, OSSL_PKEY_PARAM_FFC_GINDEX,
   2007             gindex))
   2008         || !TEST_true(OSSL_PARAM_BLD_push_int(bld,
   2009             OSSL_PKEY_PARAM_FFC_PCOUNTER,
   2010             pcounter))
   2011         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PUB_KEY,
   2012             pub))
   2013         || !TEST_true(OSSL_PARAM_BLD_push_BN(bld, OSSL_PKEY_PARAM_PRIV_KEY,
   2014             priv))
   2015         || !TEST_ptr(fromdata_params = OSSL_PARAM_BLD_to_param(bld)))
   2016         goto err;
   2017 
   2018     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL)))
   2019         goto err;
   2020 
   2021     if (!TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
   2022         || !TEST_int_eq(EVP_PKEY_fromdata(ctx, &pk, EVP_PKEY_KEYPAIR,
   2023                             fromdata_params),
   2024             1))
   2025         goto err;
   2026 
   2027     for (;;) {
   2028         ret = 0;
   2029         if (!TEST_int_eq(EVP_PKEY_get_bits(pk), 2048)
   2030             || !TEST_int_eq(EVP_PKEY_get_security_bits(pk), 112)
   2031             || !TEST_int_eq(EVP_PKEY_get_size(pk), 2 + 2 * (3 + sizeof(q_data)))
   2032             || !TEST_false(EVP_PKEY_missing_parameters(pk)))
   2033             goto err;
   2034 
   2035         if (!TEST_false(EVP_PKEY_get_utf8_string_param(pk,
   2036                 OSSL_PKEY_PARAM_GROUP_NAME,
   2037                 name_out,
   2038                 sizeof(name_out),
   2039                 &len))
   2040             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PUB_KEY,
   2041                 &pub_out))
   2042             || !TEST_BN_eq(pub, pub_out)
   2043             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_PRIV_KEY,
   2044                 &priv_out))
   2045             || !TEST_BN_eq(priv, priv_out)
   2046             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_P,
   2047                 &p_out))
   2048             || !TEST_BN_eq(p, p_out)
   2049             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_Q,
   2050                 &q_out))
   2051             || !TEST_BN_eq(q, q_out)
   2052             || !TEST_true(EVP_PKEY_get_bn_param(pk, OSSL_PKEY_PARAM_FFC_G,
   2053                 &g_out))
   2054             || !TEST_BN_eq(g, g_out)
   2055             || !TEST_false(EVP_PKEY_get_bn_param(pk,
   2056                 OSSL_PKEY_PARAM_FFC_COFACTOR,
   2057                 &j_out))
   2058             || !TEST_ptr_null(j_out)
   2059             || !TEST_true(EVP_PKEY_get_octet_string_param(pk,
   2060                 OSSL_PKEY_PARAM_FFC_SEED,
   2061                 seed_out,
   2062                 sizeof(seed_out),
   2063                 &len))
   2064             || !TEST_true(EVP_PKEY_get_int_param(pk,
   2065                 OSSL_PKEY_PARAM_FFC_GINDEX,
   2066                 &gindex_out))
   2067             || !TEST_int_eq(gindex, gindex_out)
   2068             || !TEST_true(EVP_PKEY_get_int_param(pk, OSSL_PKEY_PARAM_FFC_H,
   2069                 &hindex_out))
   2070             || !TEST_int_eq(hindex_out, 0)
   2071             || !TEST_true(EVP_PKEY_get_int_param(pk,
   2072                 OSSL_PKEY_PARAM_FFC_PCOUNTER,
   2073                 &pcounter_out))
   2074             || !TEST_int_eq(pcounter, pcounter_out))
   2075             goto err;
   2076         BN_free(p_out);
   2077         p_out = NULL;
   2078         BN_free(q_out);
   2079         q_out = NULL;
   2080         BN_free(g_out);
   2081         g_out = NULL;
   2082         BN_free(j_out);
   2083         j_out = NULL;
   2084         BN_free(pub_out);
   2085         pub_out = NULL;
   2086         BN_free(priv_out);
   2087         priv_out = NULL;
   2088 
   2089         if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(NULL, pk, "")))
   2090             goto err;
   2091 
   2092         if (!TEST_int_gt(EVP_PKEY_check(key_ctx), 0)
   2093             || !TEST_int_gt(EVP_PKEY_public_check(key_ctx), 0)
   2094             || !TEST_int_gt(EVP_PKEY_private_check(key_ctx), 0)
   2095             || !TEST_int_gt(EVP_PKEY_pairwise_check(key_ctx), 0))
   2096             goto err;
   2097         EVP_PKEY_CTX_free(key_ctx);
   2098         key_ctx = NULL;
   2099 
   2100         if (!TEST_ptr(copy_pk = EVP_PKEY_new())
   2101             || !TEST_true(EVP_PKEY_copy_parameters(copy_pk, pk)))
   2102             goto err;
   2103         EVP_PKEY_free(copy_pk);
   2104         copy_pk = NULL;
   2105 
   2106         ret = test_print_key_using_pem("DSA", pk)
   2107             && test_print_key_using_encoder("DSA", pk);
   2108 
   2109         if (!ret || dup_pk != NULL)
   2110             break;
   2111 
   2112         if (!TEST_ptr(dup_pk = EVP_PKEY_dup(pk)))
   2113             goto err;
   2114         ret = ret && TEST_int_eq(EVP_PKEY_eq(pk, dup_pk), 1);
   2115         EVP_PKEY_free(pk);
   2116         pk = dup_pk;
   2117         if (!ret)
   2118             goto err;
   2119     }
   2120 
   2121 err:
   2122     OSSL_PARAM_free(fromdata_params);
   2123     OSSL_PARAM_BLD_free(bld);
   2124     BN_free(p);
   2125     BN_free(q);
   2126     BN_free(g);
   2127     BN_free(pub);
   2128     BN_free(priv);
   2129     BN_free(p_out);
   2130     BN_free(q_out);
   2131     BN_free(g_out);
   2132     BN_free(pub_out);
   2133     BN_free(priv_out);
   2134     BN_free(j_out);
   2135     EVP_PKEY_free(pk);
   2136     EVP_PKEY_free(copy_pk);
   2137     EVP_PKEY_CTX_free(ctx);
   2138     EVP_PKEY_CTX_free(key_ctx);
   2139 
   2140     return ret;
   2141 }
   2142 
   2143 static int test_check_dsa(void)
   2144 {
   2145     int ret = 0;
   2146     EVP_PKEY_CTX *ctx = NULL;
   2147 
   2148     if (!TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL))
   2149         || !TEST_int_le(EVP_PKEY_check(ctx), 0)
   2150         || !TEST_int_le(EVP_PKEY_public_check(ctx), 0)
   2151         || !TEST_int_le(EVP_PKEY_private_check(ctx), 0)
   2152         || !TEST_int_le(EVP_PKEY_pairwise_check(ctx), 0))
   2153         goto err;
   2154 
   2155     ret = 1;
   2156 err:
   2157     EVP_PKEY_CTX_free(ctx);
   2158 
   2159     return ret;
   2160 }
   2161 #endif /* OPENSSL_NO_DSA */
   2162 
   2163 static OSSL_PARAM *do_construct_hkdf_params(char *digest, char *key,
   2164     size_t keylen, char *salt)
   2165 {
   2166     OSSL_PARAM *params = OPENSSL_malloc(sizeof(OSSL_PARAM) * 5);
   2167     OSSL_PARAM *p = params;
   2168 
   2169     *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, digest, 0);
   2170     *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT,
   2171         salt, strlen(salt));
   2172     *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY,
   2173         (unsigned char *)key, keylen);
   2174     *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_MODE,
   2175         "EXTRACT_ONLY", 0);
   2176     *p = OSSL_PARAM_construct_end();
   2177 
   2178     return params;
   2179 }
   2180 
   2181 static int test_evp_pkey_ctx_dup_kdf(void)
   2182 {
   2183     int ret = 0;
   2184     size_t len = 0, dlen = 0;
   2185     EVP_PKEY_CTX *pctx = NULL, *dctx = NULL;
   2186     OSSL_PARAM *params = NULL;
   2187 
   2188     if (!TEST_ptr(params = do_construct_hkdf_params("sha256", "secret", 6,
   2189                       "salt")))
   2190         goto err;
   2191     if (!TEST_ptr(pctx = EVP_PKEY_CTX_new_from_name(NULL, "HKDF", NULL)))
   2192         goto err;
   2193     if (!TEST_int_eq(EVP_PKEY_derive_init_ex(pctx, params), 1))
   2194         goto err;
   2195     if (!TEST_ptr(dctx = EVP_PKEY_CTX_dup(pctx)))
   2196         goto err;
   2197     if (!TEST_int_eq(EVP_PKEY_derive(pctx, NULL, &len), 1)
   2198         || !TEST_size_t_eq(len, SHA256_DIGEST_LENGTH)
   2199         || !TEST_int_eq(EVP_PKEY_derive(dctx, NULL, &dlen), 1)
   2200         || !TEST_size_t_eq(dlen, SHA256_DIGEST_LENGTH))
   2201         goto err;
   2202     ret = 1;
   2203 err:
   2204     OPENSSL_free(params);
   2205     EVP_PKEY_CTX_free(dctx);
   2206     EVP_PKEY_CTX_free(pctx);
   2207     return ret;
   2208 }
   2209 
   2210 static const char *name_dup_algs[] = {
   2211 #ifndef OPENSSL_NO_ECX
   2212     "ED25519",
   2213 #endif
   2214 #ifndef OPENSSL_NO_ML_KEM
   2215     "ML-KEM-512",
   2216 #endif
   2217 #ifndef OPENSSL_NO_ML_DSA
   2218     "ML-DSA-44",
   2219 #endif
   2220     NULL
   2221 };
   2222 
   2223 static int test_name_dup(int idx)
   2224 {
   2225     const char *alg = name_dup_algs[idx];
   2226     EVP_PKEY *key = NULL;
   2227     EVP_PKEY_CTX *factory = NULL, *ctx = NULL;
   2228     int i, ret = 0;
   2229 
   2230     if (alg == NULL
   2231         || (factory = EVP_PKEY_CTX_new_from_name(NULL, alg, NULL)) == NULL)
   2232         return 1;
   2233     TEST_info("Testing fresh context dup for: %s", alg);
   2234 
   2235     /* Run twice to check that *repeated* use works */
   2236     for (i = 0; i < 2; ++i) {
   2237         EVP_PKEY_CTX_free(ctx);
   2238         EVP_PKEY_free(key);
   2239         key = NULL;
   2240         if (!TEST_ptr(ctx = EVP_PKEY_CTX_dup(factory))
   2241             || !TEST_int_gt(EVP_PKEY_keygen_init(ctx), 0)
   2242             || !TEST_int_gt(EVP_PKEY_keygen(ctx, &key), 0)) {
   2243             ERR_print_errors(bio_err);
   2244             goto end;
   2245         }
   2246     }
   2247     ret = 1;
   2248 
   2249 end:
   2250     EVP_PKEY_CTX_free(factory);
   2251     EVP_PKEY_CTX_free(ctx);
   2252     EVP_PKEY_free(key);
   2253 
   2254     return ret;
   2255 }
   2256 
   2257 int setup_tests(void)
   2258 {
   2259     if (!test_skip_common_options()) {
   2260         TEST_error("Error parsing test options\n");
   2261         return 0;
   2262     }
   2263 
   2264     if (!TEST_ptr(datadir = test_get_argument(0)))
   2265         return 0;
   2266 
   2267     ADD_TEST(test_evp_pkey_ctx_dup_kdf);
   2268     ADD_ALL_TESTS(test_name_dup, OSSL_NELEM(name_dup_algs));
   2269     ADD_TEST(test_evp_pkey_get_bn_param_large);
   2270     ADD_TEST(test_fromdata_rsa);
   2271     ADD_TEST(test_fromdata_rsa_derive_from_pq_sp800);
   2272     ADD_TEST(test_fromdata_rsa_derive_from_pq_multiprime);
   2273 #ifndef OPENSSL_NO_DH
   2274     ADD_TEST(test_fromdata_dh_fips186_4);
   2275     ADD_TEST(test_fromdata_dh_named_group);
   2276 #endif
   2277 #ifndef OPENSSL_NO_DSA
   2278     ADD_TEST(test_check_dsa);
   2279     ADD_TEST(test_fromdata_dsa_fips186_4);
   2280 #endif
   2281 #ifndef OPENSSL_NO_EC
   2282 #ifndef OPENSSL_NO_ECX
   2283     ADD_ALL_TESTS(test_fromdata_ecx, 4 * 3);
   2284 #endif
   2285     ADD_TEST(test_fromdata_ec);
   2286     ADD_TEST(test_ec_dup_no_operation);
   2287     ADD_TEST(test_ec_dup_keygen_operation);
   2288 #endif
   2289     return 1;
   2290 }
   2291