Skip to content

Commit

Permalink
Workaround issue in LibreSSL crashing when enumerating digests/ciphers
Browse files Browse the repository at this point in the history
OpenBSD/LibreSSL reimplemented EVP_get_cipherbyname/EVP_get_digestbyname
and broke calling EVP_get_cipherbynid/EVP_get_digestbyname with an
invalid nid in the process so that it would segfault.

Workaround but doing that NULL check in OpenVPN instead of leaving it
to the library.

Github: see also libressl/openbsd#150

Change-Id: Ia08a9697d0ff41721fb0acf17ccb4cfa23cb3934
Signed-off-by: Arne Schwabe <arne@rfc2549.org>
Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <20240508220540.12554-1-gert@greenie.muc.de>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg28649.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
(cherry picked from commit b3a271b)
  • Loading branch information
schwabe authored and cron2 committed May 13, 2024
1 parent 56fc48e commit 8aed156
Showing 1 changed file with 25 additions and 1 deletion.
26 changes: 25 additions & 1 deletion src/openvpn/crypto_openssl.c
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,19 @@ show_available_ciphers(void)
#else
for (int nid = 0; nid < 10000; ++nid)
{
#if defined(LIBRESSL_VERSION_NUMBER)
/* OpenBSD/LibreSSL reimplemented EVP_get_cipherbyname and broke
* calling EVP_get_cipherbynid with an invalid nid in the process
* so that it would segfault. */
const EVP_CIPHER *cipher = NULL;
const char *name = OBJ_nid2sn(nid);
if (name)
{
cipher = EVP_get_cipherbyname(name);
}
#else /* if defined(LIBRESSL_VERSION_NUMBER) */
const EVP_CIPHER *cipher = EVP_get_cipherbynid(nid);
#endif
/* We cast the const away so we can keep the function prototype
* compatible with EVP_CIPHER_do_all_provided */
collect_ciphers((EVP_CIPHER *) cipher, &cipher_list);
Expand Down Expand Up @@ -440,15 +452,27 @@ show_available_digests(void)
#else
for (int nid = 0; nid < 10000; ++nid)
{
/* OpenBSD/LibreSSL reimplemented EVP_get_digestbyname and broke
* calling EVP_get_digestbynid with an invalid nid in the process
* so that it would segfault. */
#ifdef LIBRESSL_VERSION_NUMBER
const EVP_MD *digest = NULL;
const char *name = OBJ_nid2sn(nid);
if (name)
{
digest = EVP_get_digestbyname(name);
}
#else /* ifdef LIBRESSL_VERSION_NUMBER */
const EVP_MD *digest = EVP_get_digestbynid(nid);
#endif
if (digest)
{
/* We cast the const away so we can keep the function prototype
* compatible with EVP_MD_do_all_provided */
print_digest((EVP_MD *)digest, NULL);
}
}
#endif
#endif /* if OPENSSL_VERSION_NUMBER >= 0x30000000L */
printf("\n");
}

Expand Down

0 comments on commit 8aed156

Please sign in to comment.