Skip to content

Commit

Permalink
Fix LibreSSL compatibility
Browse files Browse the repository at this point in the history
* library initialization
* SSL versions allowed in context
  • Loading branch information
hlysunnaram committed Mar 11, 2018
1 parent 25b8ff1 commit bb1b23e
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 32 deletions.
4 changes: 2 additions & 2 deletions asio/include/asio/ssl/detail/impl/engine.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -203,10 +203,10 @@ const asio::error_code& engine::map_error_code(

// SSL v2 doesn't provide a protocol-level shutdown, so an eof on the
// underlying transport is passed through.
#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
#if (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
if (SSL_version(ssl_) == SSL2_VERSION)
return ec;
#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))

// Otherwise, the peer should have negotiated a proper shutdown.
if ((::SSL_get_shutdown(ssl_) & SSL_RECEIVED_SHUTDOWN) == 0)
Expand Down
18 changes: 9 additions & 9 deletions asio/include/asio/ssl/detail/impl/openssl_init.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class openssl_init_base::do_init
public:
do_init()
{
#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
#if (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
::SSL_library_init();
::SSL_load_error_strings();
::OpenSSL_add_all_algorithms();
Expand All @@ -44,7 +44,7 @@ public:
for (size_t i = 0; i < mutexes_.size(); ++i)
mutexes_[i].reset(new asio::detail::mutex);
::CRYPTO_set_locking_callback(&do_init::openssl_locking_func);
#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
#if (OPENSSL_VERSION_NUMBER < 0x10000000L)
::CRYPTO_set_id_callback(&do_init::openssl_id_func);
#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L)
Expand All @@ -67,15 +67,15 @@ public:
#if (OPENSSL_VERSION_NUMBER < 0x10000000L)
::CRYPTO_set_id_callback(0);
#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L)
#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
#if (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
::CRYPTO_set_locking_callback(0);
::ERR_free_strings();
::EVP_cleanup();
::CRYPTO_cleanup_all_ex_data();
#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
#if (OPENSSL_VERSION_NUMBER < 0x10000000L)
::ERR_remove_state(0);
#elif (OPENSSL_VERSION_NUMBER < 0x10100000L)
#elif (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
::ERR_remove_thread_state(NULL);
#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L)
#if (OPENSSL_VERSION_NUMBER >= 0x10002000L) \
Expand All @@ -87,10 +87,10 @@ public:
::CONF_modules_unload(1);
#endif // !defined(OPENSSL_IS_BORINGSSL)
#if !defined(OPENSSL_NO_ENGINE) \
&& (OPENSSL_VERSION_NUMBER < 0x10100000L)
&& (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
::ENGINE_cleanup();
#endif // !defined(OPENSSL_NO_ENGINE)
// && (OPENSSL_VERSION_NUMBER < 0x10100000L)
// && (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
}

#if !defined(SSL_OP_NO_COMPRESSION) \
Expand All @@ -116,7 +116,7 @@ private:
}
#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L)

#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
#if (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))
static void openssl_locking_func(int mode, int n,
const char* /*file*/, int /*line*/)
{
Expand All @@ -129,7 +129,7 @@ private:
// Mutexes to be used in locking callbacks.
std::vector<asio::detail::shared_ptr<
asio::detail::mutex> > mutexes_;
#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER))

#if !defined(SSL_OP_NO_COMPRESSION) \
&& (OPENSSL_VERSION_NUMBER >= 0x00908000L)
Expand Down
3 changes: 2 additions & 1 deletion asio/include/asio/ssl/error.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ enum stream_errors
#if defined(GENERATING_DOCUMENTATION)
/// The underlying stream closed before the ssl stream gracefully shut down.
stream_truncated
#elif (OPENSSL_VERSION_NUMBER < 0x10100000L) && !defined(OPENSSL_IS_BORINGSSL)
#elif (OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)) \
&& !defined(OPENSSL_IS_BORINGSSL)
stream_truncated = ERR_PACK(ERR_LIB_SSL, 0, SSL_R_SHORT_READ)
#else
stream_truncated = 1
Expand Down
40 changes: 20 additions & 20 deletions asio/include/asio/ssl/impl/context.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,14 @@ context::context(context::method m)
switch (m)
{
// SSL v2.
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(OPENSSL_NO_SSL2)
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)) || defined(OPENSSL_NO_SSL2)
case context::sslv2:
case context::sslv2_client:
case context::sslv2_server:
asio::detail::throw_error(
asio::error::invalid_argument, "context");
break;
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(OPENSSL_NO_SSL2)
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)) || defined(OPENSSL_NO_SSL2)
case context::sslv2:
handle_ = ::SSL_CTX_new(::SSLv2_method());
break;
Expand All @@ -84,7 +84,7 @@ context::context(context::method m)
case context::sslv2_server:
handle_ = ::SSL_CTX_new(::SSLv2_server_method());
break;
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(OPENSSL_NO_SSL2)
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)) || defined(OPENSSL_NO_SSL2)

// SSL v3.
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
Expand Down Expand Up @@ -157,7 +157,7 @@ context::context(context::method m)
SSL_CTX_set_max_proto_version(handle_, TLS1_VERSION);
}
break;
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
case context::tlsv1:
handle_ = ::SSL_CTX_new(::TLSv1_method());
break;
Expand All @@ -167,7 +167,7 @@ context::context(context::method m)
case context::tlsv1_server:
handle_ = ::SSL_CTX_new(::TLSv1_server_method());
break;
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))

// TLS v1.1.
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
Expand Down Expand Up @@ -287,7 +287,7 @@ context::context(context::method m)
if (handle_)
SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION);
break;
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
case context::tls:
handle_ = ::SSL_CTX_new(::SSLv23_method());
if (handle_)
Expand All @@ -303,7 +303,7 @@ context::context(context::method m)
if (handle_)
SSL_CTX_set_options(handle_, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
break;
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER))

default:
handle_ = ::SSL_CTX_new(0);
Expand Down Expand Up @@ -343,9 +343,9 @@ context::~context()
{
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_);
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
void* cb_userdata = handle_->default_passwd_callback_userdata;
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
if (cb_userdata)
{
detail::password_callback_base* callback =
Expand All @@ -354,9 +354,9 @@ context::~context()
delete callback;
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
::SSL_CTX_set_default_passwd_cb_userdata(handle_, 0);
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
handle_->default_passwd_callback_userdata = 0;
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
}

if (SSL_CTX_get_app_data(handle_))
Expand Down Expand Up @@ -689,10 +689,10 @@ ASIO_SYNC_OP_VOID context::use_certificate_chain(
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
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)
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
pem_password_cb* callback = handle_->default_passwd_callback;
void* cb_userdata = handle_->default_passwd_callback_userdata;
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
x509_cleanup cert = {
::PEM_read_bio_X509_AUX(bio.p, 0,
callback,
Expand Down Expand Up @@ -721,7 +721,7 @@ ASIO_SYNC_OP_VOID context::use_certificate_chain(
::sk_X509_pop_free(handle_->extra_certs, X509_free);
handle_->extra_certs = 0;
}
#endif // (OPENSSL_VERSION_NUMBER >= 0x10002000L)
#endif // (OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(LIBRESSL_VERSION_NUMBER))

while (X509* cacert = ::PEM_read_bio_X509(bio.p, 0,
callback,
Expand Down Expand Up @@ -793,10 +793,10 @@ ASIO_SYNC_OP_VOID context::use_private_key(
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
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)
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
pem_password_cb* callback = handle_->default_passwd_callback;
void* cb_userdata = handle_->default_passwd_callback_userdata;
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))

bio_cleanup bio = { make_buffer_bio(private_key) };
if (bio.p)
Expand Down Expand Up @@ -860,10 +860,10 @@ ASIO_SYNC_OP_VOID context::use_rsa_private_key(
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
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)
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
pem_password_cb* callback = handle_->default_passwd_callback;
void* cb_userdata = handle_->default_passwd_callback_userdata;
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))

bio_cleanup bio = { make_buffer_bio(private_key) };
if (bio.p)
Expand Down Expand Up @@ -1099,10 +1099,10 @@ ASIO_SYNC_OP_VOID context::do_set_password_callback(
#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
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)
#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))
void* old_callback = handle_->default_passwd_callback_userdata;
handle_->default_passwd_callback_userdata = callback;
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L)
#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER))

if (old_callback)
delete static_cast<detail::password_callback_base*>(
Expand Down

0 comments on commit bb1b23e

Please sign in to comment.