boost has a number of LIBRESSL_VERSION_NUMBER code paths that should be removed upstream. In fact, all of these paths can be dropped or weakened once we turn on the OpenSSL TLSv1.3 API (I will start looking into this again after the next bump). I will take this upstream at that point.
For the moment, I'd like us to switch to using the OpenSSL 1.1.1 path for SSL_CTX_get_default_passwd_cb and SSL_CTX_get_default_passwd_cb_userdata. These functions have been available since LibreSSL 2.7.2. Without this patch, the builds of the following ports will break once we make SSL_CTX opaque in libssl. math/rstudio net/i2pd net/icinga/core2 net/libtorrent-rasterbar The same patch is also needed for telephony/resiprocate which uses its bundled version of boost::asio::ssl. The third patch is for databases/mongodb which backports the OpenSSL 1.1.1 code path to its very old bundled version of asio. This went through several bulks with boost 1.72 and 1.73. Index: devel/boost/Makefile =================================================================== RCS file: /cvs/ports/devel/boost/Makefile,v retrieving revision 1.112 diff -u -p -r1.112 Makefile --- devel/boost/Makefile 6 May 2021 11:36:14 -0000 1.112 +++ devel/boost/Makefile 7 May 2021 01:51:49 -0000 @@ -6,6 +6,7 @@ COMMENT-main= free peer-reviewed portabl COMMENT-md= machine-dependent libraries for boost VERSION= 1.73.0 +REVISION= 0 DISTNAME= boost_${VERSION:S/./_/g} PKGNAME-main= boost-${VERSION} PKGNAME-md= boost-md-${VERSION} Index: devel/boost/patches/patch-boost_asio_ssl_impl_context_ipp =================================================================== RCS file: devel/boost/patches/patch-boost_asio_ssl_impl_context_ipp diff -N devel/boost/patches/patch-boost_asio_ssl_impl_context_ipp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ devel/boost/patches/patch-boost_asio_ssl_impl_context_ipp 7 May 2021 03:44:07 -0000 @@ -0,0 +1,86 @@ +$OpenBSD$ + +Use accessors instead of reaching into SSL_CTX. The requisite +accessors have been available since LibreSSL 2.7.2 and are thus +present in all supported versions. + +Index: boost/asio/ssl/impl/context.ipp +--- boost/asio/ssl/impl/context.ipp.orig ++++ boost/asio/ssl/impl/context.ipp +@@ -387,9 +387,7 @@ context::~context() + { + if (handle_) + { +-#if ((OPENSSL_VERSION_NUMBER >= 0x10100000L) \ +- && !defined(LIBRESSL_VERSION_NUMBER)) \ +- || defined(BOOST_ASIO_USE_WOLFSSL) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(BOOST_ASIO_USE_WOLFSSL) + void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) + void* cb_userdata = handle_->default_passwd_callback_userdata; +@@ -400,9 +398,7 @@ context::~context() + static_cast<detail::password_callback_base*>( + cb_userdata); + delete callback; +-#if ((OPENSSL_VERSION_NUMBER >= 0x10100000L) \ +- && !defined(LIBRESSL_VERSION_NUMBER)) \ +- || defined(BOOST_ASIO_USE_WOLFSSL) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(BOOST_ASIO_USE_WOLFSSL) + ::SSL_CTX_set_default_passwd_cb_userdata(handle_, 0); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) + handle_->default_passwd_callback_userdata = 0; +@@ -739,9 +735,7 @@ BOOST_ASIO_SYNC_OP_VOID context::use_certificate_chain + bio_cleanup bio = { make_buffer_bio(chain) }; + if (bio.p) + { +-#if ((OPENSSL_VERSION_NUMBER >= 0x10100000L) \ +- && !defined(LIBRESSL_VERSION_NUMBER)) \ +- || defined(BOOST_ASIO_USE_WOLFSSL) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(BOOST_ASIO_USE_WOLFSSL) + pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); + void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) +@@ -768,9 +762,7 @@ BOOST_ASIO_SYNC_OP_VOID context::use_certificate_chain + BOOST_ASIO_SYNC_OP_VOID_RETURN(ec); + } + +-#if ((OPENSSL_VERSION_NUMBER >= 0x10002000L) \ +- && !defined(LIBRESSL_VERSION_NUMBER)) \ +- || defined(BOOST_ASIO_USE_WOLFSSL) ++#if (OPENSSL_VERSION_NUMBER >= 0x10002000L) || defined(BOOST_ASIO_USE_WOLFSSL) + ::SSL_CTX_clear_chain_certs(handle_); + #else + if (handle_->extra_certs) +@@ -847,9 +839,7 @@ BOOST_ASIO_SYNC_OP_VOID context::use_private_key( + { + ::ERR_clear_error(); + +-#if ((OPENSSL_VERSION_NUMBER >= 0x10100000L) \ +- && !defined(LIBRESSL_VERSION_NUMBER)) \ +- || defined(BOOST_ASIO_USE_WOLFSSL) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(BOOST_ASIO_USE_WOLFSSL) + pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); + void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) +@@ -916,9 +906,7 @@ BOOST_ASIO_SYNC_OP_VOID context::use_rsa_private_key( + { + ::ERR_clear_error(); + +-#if ((OPENSSL_VERSION_NUMBER >= 0x10100000L) \ +- && !defined(LIBRESSL_VERSION_NUMBER)) \ +- || defined(BOOST_ASIO_USE_WOLFSSL) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(BOOST_ASIO_USE_WOLFSSL) + pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); + void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) +@@ -1157,9 +1145,7 @@ int context::verify_callback_function(int preverified, + BOOST_ASIO_SYNC_OP_VOID context::do_set_password_callback( + detail::password_callback_base* callback, boost::system::error_code& ec) + { +-#if ((OPENSSL_VERSION_NUMBER >= 0x10100000L) \ +- && !defined(LIBRESSL_VERSION_NUMBER)) \ +- || defined(BOOST_ASIO_USE_WOLFSSL) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(BOOST_ASIO_USE_WOLFSSL) + void* old_callback = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); + ::SSL_CTX_set_default_passwd_cb_userdata(handle_, callback); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) Index: telephony/resiprocate/Makefile =================================================================== RCS file: /cvs/ports/telephony/resiprocate/Makefile,v retrieving revision 1.2 diff -u -p -r1.2 Makefile --- telephony/resiprocate/Makefile 4 Jun 2020 20:50:39 -0000 1.2 +++ telephony/resiprocate/Makefile 21 Apr 2021 19:01:53 -0000 @@ -6,7 +6,7 @@ COMMENT-return = reSIProcate STUN/TURN c V = 1.12.0 DISTNAME = resiprocate-${V} -REVISION = 0 +REVISION = 1 PKGNAME-main = resiprocate-${V} PKGNAME-repro = resiprocate-repro-${V} PKGNAME-return = resiprocate-return-${V} Index: telephony/resiprocate/patches/patch-contrib_asio_include_asio_ssl_impl_context_ipp =================================================================== RCS file: telephony/resiprocate/patches/patch-contrib_asio_include_asio_ssl_impl_context_ipp diff -N telephony/resiprocate/patches/patch-contrib_asio_include_asio_ssl_impl_context_ipp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ telephony/resiprocate/patches/patch-contrib_asio_include_asio_ssl_impl_context_ipp 7 May 2021 03:41:32 -0000 @@ -0,0 +1,71 @@ +$OpenBSD$ + +Use accessors instead of reaching into structs. LibreSSL 3.4.x will +make SSL_CTX and other structs opaque. + +Index: contrib/asio/include/asio/ssl/impl/context.ipp +--- contrib/asio/include/asio/ssl/impl/context.ipp.orig ++++ contrib/asio/include/asio/ssl/impl/context.ipp +@@ -386,7 +386,7 @@ context::~context() + { + if (handle_) + { +-#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) + void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) + void* cb_userdata = handle_->default_passwd_callback_userdata; +@@ -397,7 +397,7 @@ context::~context() + static_cast<detail::password_callback_base*>( + cb_userdata); + delete callback; +-#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) + ::SSL_CTX_set_default_passwd_cb_userdata(handle_, 0); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) + handle_->default_passwd_callback_userdata = 0; +@@ -734,7 +734,7 @@ ASIO_SYNC_OP_VOID context::use_certificate_chain( + bio_cleanup bio = { make_buffer_bio(chain) }; + if (bio.p) + { +-#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) + pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); + void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) +@@ -761,7 +761,7 @@ ASIO_SYNC_OP_VOID context::use_certificate_chain( + ASIO_SYNC_OP_VOID_RETURN(ec); + } + +-#if (OPENSSL_VERSION_NUMBER >= 0x10002000L) && !defined(LIBRESSL_VERSION_NUMBER) ++#if (OPENSSL_VERSION_NUMBER >= 0x10002000L) + ::SSL_CTX_clear_chain_certs(handle_); + #else + if (handle_->extra_certs) +@@ -838,7 +838,7 @@ ASIO_SYNC_OP_VOID context::use_private_key( + { + ::ERR_clear_error(); + +-#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) + pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); + void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) +@@ -905,7 +905,7 @@ ASIO_SYNC_OP_VOID context::use_rsa_private_key( + { + ::ERR_clear_error(); + +-#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) + pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); + void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) +@@ -1144,7 +1144,7 @@ int context::verify_callback_function(int preverified, + ASIO_SYNC_OP_VOID context::do_set_password_callback( + detail::password_callback_base* callback, asio::error_code& ec) + { +-#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) ++#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) + void* old_callback = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); + ::SSL_CTX_set_default_passwd_cb_userdata(handle_, callback); + #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) Index: databases/mongodb/Makefile =================================================================== RCS file: /cvs/ports/databases/mongodb/Makefile,v retrieving revision 1.40 diff -u -p -r1.40 Makefile --- databases/mongodb/Makefile 23 Feb 2021 19:39:11 -0000 1.40 +++ databases/mongodb/Makefile 22 Apr 2021 13:51:25 -0000 @@ -12,7 +12,7 @@ COMMENT = scalable, high-performance doc DISTNAME = mongodb-src-r3.2.22 PKGNAME = ${DISTNAME:S/src-r//} CATEGORIES = databases -REVISION = 1 +REVISION = 2 HOMEPAGE = https://www.mongodb.com/ Index: databases/mongodb/patches/patch-src_third_party_asio-asio-1-11-0_asio_include_asio_ssl_impl_context_ipp =================================================================== RCS file: databases/mongodb/patches/patch-src_third_party_asio-asio-1-11-0_asio_include_asio_ssl_impl_context_ipp diff -N databases/mongodb/patches/patch-src_third_party_asio-asio-1-11-0_asio_include_asio_ssl_impl_context_ipp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ databases/mongodb/patches/patch-src_third_party_asio-asio-1-11-0_asio_include_asio_ssl_impl_context_ipp 22 Apr 2021 13:51:09 -0000 @@ -0,0 +1,116 @@ +$OpenBSD$ + +Index: src/third_party/asio-asio-1-11-0/asio/include/asio/ssl/impl/context.ipp +--- src/third_party/asio-asio-1-11-0/asio/include/asio/ssl/impl/context.ipp.orig ++++ src/third_party/asio-asio-1-11-0/asio/include/asio/ssl/impl/context.ipp +@@ -192,13 +192,14 @@ context::~context() + { + if (handle_) + { +- if (handle_->default_passwd_callback_userdata) ++ void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); ++ if (cb_userdata) + { + detail::password_callback_base* callback = + static_cast<detail::password_callback_base*>( +- handle_->default_passwd_callback_userdata); ++ cb_userdata); + delete callback; +- handle_->default_passwd_callback_userdata = 0; ++ ::SSL_CTX_set_default_passwd_cb_userdata(handle_, 0); + } + + if (SSL_CTX_get_app_data(handle_)) +@@ -528,10 +529,12 @@ asio::error_code context::use_certificate_chain( + bio_cleanup bio = { make_buffer_bio(chain) }; + if (bio.p) + { ++ pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); ++ void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); + x509_cleanup cert = { + ::PEM_read_bio_X509_AUX(bio.p, 0, +- handle_->default_passwd_callback, +- handle_->default_passwd_callback_userdata) }; ++ callback, ++ cb_userdata) }; + if (!cert.p) + { + ec = asio::error_code(ERR_R_PEM_LIB, +@@ -548,15 +551,11 @@ asio::error_code context::use_certificate_chain( + return ec; + } + +- if (handle_->extra_certs) +- { +- ::sk_X509_pop_free(handle_->extra_certs, X509_free); +- handle_->extra_certs = 0; +- } ++ ::SSL_CTX_clear_chain_certs(handle_); + + while (X509* cacert = ::PEM_read_bio_X509(bio.p, 0, +- handle_->default_passwd_callback, +- handle_->default_passwd_callback_userdata)) ++ callback, ++ cb_userdata)) + { + if (!::SSL_CTX_add_extra_chain_cert(handle_, cacert)) + { +@@ -621,6 +620,9 @@ asio::error_code context::use_private_key( + { + ::ERR_clear_error(); + ++ pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); ++ void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); ++ + bio_cleanup bio = { make_buffer_bio(private_key) }; + if (bio.p) + { +@@ -632,8 +634,8 @@ asio::error_code context::use_private_key( + break; + case context_base::pem: + evp_private_key.p = ::PEM_read_bio_PrivateKey( +- bio.p, 0, handle_->default_passwd_callback, +- handle_->default_passwd_callback_userdata); ++ bio.p, 0, callback, ++ cb_userdata); + break; + default: + { +@@ -680,6 +682,9 @@ asio::error_code context::use_rsa_private_key( + { + ::ERR_clear_error(); + ++ pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); ++ void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); ++ + bio_cleanup bio = { make_buffer_bio(private_key) }; + if (bio.p) + { +@@ -691,8 +696,8 @@ asio::error_code context::use_rsa_private_key( + break; + case context_base::pem: + rsa_private_key.p = ::PEM_read_bio_RSAPrivateKey( +- bio.p, 0, handle_->default_passwd_callback, +- handle_->default_passwd_callback_userdata); ++ bio.p, 0, callback, ++ cb_userdata); + break; + default: + { +@@ -911,11 +916,12 @@ int context::verify_callback_function(int preverified, + asio::error_code context::do_set_password_callback( + detail::password_callback_base* callback, asio::error_code& ec) + { +- if (handle_->default_passwd_callback_userdata) +- delete static_cast<detail::password_callback_base*>( +- handle_->default_passwd_callback_userdata); ++ void* old_callback = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); ++ ::SSL_CTX_set_default_passwd_cb_userdata(handle_, callback); + +- handle_->default_passwd_callback_userdata = callback; ++ if (old_callback) ++ delete static_cast<detail::password_callback_base*>( ++ old_callback); + + SSL_CTX_set_default_passwd_cb(handle_, &context::password_callback_function); +