DH parameter reading in OPENSSL 3

Tomas Mraz tomas at openssl.org
Wed Jul 13 16:06:04 UTC 2022


Hi,

it is somewhat unclear to me why do you consider the migration_guide(7)
useless in this regard. Citing it:

SSL_CTX_set_tmp_dh_callback(), SSL_set_tmp_dh_callback(),
SSL_CTX_set_tmp_dh(), SSL_set_tmp_dh()

These are used to set the Diffie-Hellman (DH) parameters that are to be
used by servers requiring ephemeral DH keys. Instead applications
should consider using the built-in DH parameters that are available by
calling SSL_CTX_set_dh_auto(3) or SSL_set_dh_auto(3). If custom
parameters are necessary then applications can use the alternative
functions SSL_CTX_set0_tmp_dh_pkey(3) and SSL_set0_tmp_dh_pkey(3). 

So basically instead of SSL_CTX_set_tmp_dh() you should use
SSL_CTX_set0_tmp_dh_pkey().

To get an EVP_PKEY instead of DH, you should use
OSSL_DECODER_from_bio() to read the parameters using the decoder. How
to do that you can find out in the OSSL_DECODER_FROM_bio() manual page
- just use the example for the RSA key but replace the
OSSL_KEYMGMT_SELECT_KEYPAIR selector with
OSSL_KEYMGMT_SELECT_ALL_PARAMETERS, replace RSA with DH for the
keytype, and drop the OSSL_DECODER_CTX_set_passphrase call as that is
useless for parameters.

Another even more simple option would be to use
PEM_read_bio_Parameters().

Tomas Mraz

On Wed, 2022-07-13 at 16:35 +0200, Dirk Stöcker wrote:
> Hello,
> 
> when upgrading to openssl3 my code states that some functions are 
> deprecated in openssl 3, but even after reading documentation I was 
> unable to find a non-deprecated replacement.
> 
> Task is to read DH parameters in PEM format from a file and use them
> for 
> the current "context" and if not available choose some defaults.
> 
> if((bio = BIO_new_file("filename", "r")))
> {
>    DH *dh = PEM_read_bio_DHparams(bio, 0, 0, 0);
>    BIO_free(bio);
>    /* if no DH inside, try internal defaults */
>    if(!dh && (bio = BIO_new_mem_buf(dhparam, sizeof(dhparam))))
>    {
>      dh = PEM_read_bio_DHparams(bio, 0, 0, 0);
>      BIO_free(bio);
>    }
>    if(dh)
>    {
>      SSL_CTX_set_tmp_dh(context, dh);
>      DH_free(dh);
>    }
> }
> 
> Now it seems the default can be replaced by
> 
> SSL_CTX_set_dh_auto(context, 1);
> 
> instead of the the internal values but I have no idea how to use 
> OSSL_DECODER to get the parameters and pass them to context. The 
> migrationg guide is really useless and the examples and the openssl 
> source also didn't help much.
> 
> Anybody who can help me? It's probably only a few calls when one
> knows 
> what to do.
> 
> Freedom in Peace

-- 
Tomáš Mráz, OpenSSL



More information about the openssl-users mailing list