(OpenSSL bug please fix) Re: Need Replacement for Deprecated function.
Viktor Dukhovni
openssl-users at dukhovni.org
Sat Dec 4 05:53:34 UTC 2021
On Fri, Dec 03, 2021 at 07:05:43PM +0000, Jeremy Harris wrote:
> > EVP_PKEY_get_bits() should be equivalent to DH_bits() (for a DH
> > file). I would definitely double-check that you are not mis-loading
> > something.
>
> OK; this was indeed my fault.
Actually, no, not your fault at all. The implementation in libssl is
borked. Please open a ticket.
> One minor docs item:
> https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set0_tmp_dh_pkey.html
>
> says
> "Ownership of the dhpkey value is passed to the SSL_CTX or SSL
> object as a result of this call, and so the caller should not free
> it if the function call is succesful."
Yes, ***if the call is successful**. Unsuccessfull calls should not
ever take ownership or have any side effects other than reporting
failure.
The implementation is:
int SSL_set0_tmp_dh_pkey(SSL *s, EVP_PKEY *dhpkey)
{
if (!ssl_security(s, SSL_SECOP_TMP_DH,
EVP_PKEY_get_security_bits(dhpkey), 0, dhpkey)) {
ERR_raise(ERR_LIB_SSL, SSL_R_DH_KEY_TOO_SMALL);
--Wrong!--> EVP_PKEY_free(dhpkey);
return 0;
}
EVP_PKEY_free(s->cert->dh_tmp);
s->cert->dh_tmp = dhpkey;
return 1;
}
> It's not quite clear what the onwership for a failing call is.
> Experiment shows that an EVP_free() after a fail causes a crash,
> at least for a "dh key too small" error.
This is a booby trap and needs to be fixed. You're not the only
the one to bit by this. This even affects existing code in OpenSSL:
ssl/ssl_conf.c:cmd_DHParameters()
...
if (cctx->ctx != NULL) {
if ((rv = SSL_CTX_set0_tmp_dh_pkey(cctx->ctx, dhpkey)) > 0)
dhpkey = NULL;
}
if (cctx->ssl != NULL) {
if ((rv = SSL_set0_tmp_dh_pkey(cctx->ssl, dhpkey)) > 0)
dhpkey = NULL;
}
end:
EVP_PKEY_free(dhpkey);
BIO_free(in);
return rv > 0;
}
The key is freed when the call fails. This is a bug in:
commit 163f6dc1f70f30de46a68137c36e70cae4d95cd8
Author: Matt Caswell <matt at openssl.org>
Date: Thu Oct 15 16:45:54 2020 +0100
Implement a replacement for SSL_set_tmp_dh()
--
Viktor.
More information about the openssl-users
mailing list