diff --git a/folly/io/async/ssl/OpenSSLUtils.cpp b/folly/io/async/ssl/OpenSSLUtils.cpp index 0504cf8..a9c2775 100644 --- a/folly/io/async/ssl/OpenSSLUtils.cpp +++ b/folly/io/async/ssl/OpenSSLUtils.cpp @@ -155,8 +155,12 @@ static std::unordered_map getOpenSSLCipherNames() { SSL_CTX* ctx = nullptr; SSL* ssl = nullptr; +#if OPENSSL_VERSION_NUMBER < 0x10100000L const SSL_METHOD* meth = SSLv23_server_method(); OpenSSL_add_ssl_algorithms(); +#else + const SSL_METHOD* meth = TLS_server_method(); +#endif if ((ctx = SSL_CTX_new(meth)) == nullptr) { return ret; diff --git a/folly/portability/OpenSSL.h b/folly/portability/OpenSSL.h index a4f4b04..427bf95 100644 --- a/folly/portability/OpenSSL.h +++ b/folly/portability/OpenSSL.h @@ -27,6 +27,7 @@ #include #include +#include #include #include #include diff --git a/folly/ssl/OpenSSLCertUtils.cpp b/folly/ssl/OpenSSLCertUtils.cpp index 544bb4f..423dd2c 100644 --- a/folly/ssl/OpenSSLCertUtils.cpp +++ b/folly/ssl/OpenSSLCertUtils.cpp @@ -155,12 +155,17 @@ folly::Optional OpenSSLCertUtils::toString(X509& x509) { } } +#if OPENSSL_VERSION_NUMBER < 0x10100000L +#define X509_get0_notAfter X509_get_notAfter +#define X509_get0_notBefore X509_get_notBefore +#endif + std::string OpenSSLCertUtils::getNotAfterTime(X509& x509) { - return getDateTimeStr(X509_get_notAfter(&x509)); + return getDateTimeStr(X509_get0_notAfter(&x509)); } std::string OpenSSLCertUtils::getNotBeforeTime(X509& x509) { - return getDateTimeStr(X509_get_notBefore(&x509)); + return getDateTimeStr(X509_get0_notBefore(&x509)); } std::string OpenSSLCertUtils::getDateTimeStr(const ASN1_TIME* time) { diff --git a/folly/ssl/OpenSSLVersionFinder.h b/folly/ssl/OpenSSLVersionFinder.h index d0110d7..9d65580 100644 --- a/folly/ssl/OpenSSLVersionFinder.h +++ b/folly/ssl/OpenSSLVersionFinder.h @@ -18,6 +18,12 @@ #include #include +#if OPENSSL_VERSION_NUMBER < 0x10100000L +#define OPENSSL_VERSION SSLEAY_VERSION +#define OpenSSL_version SSLeay_version +#define OpenSSL_version_num SSLeay +#endif + // This is used to find the OpenSSL version at runtime. Just returning // OPENSSL_VERSION_NUMBER is insufficient as runtime version may be different // from the compile-time version @@ -25,7 +31,7 @@ namespace folly { namespace ssl { inline std::string getOpenSSLLongVersion() { #ifdef OPENSSL_VERSION_TEXT - return SSLeay_version(SSLEAY_VERSION); + return OpenSSL_version(OPENSSL_VERSION); #elif defined(OPENSSL_VERSION_NUMBER) return folly::format("0x{:x}", OPENSSL_VERSION_NUMBER).str(); #else @@ -35,7 +41,7 @@ inline std::string getOpenSSLLongVersion() { inline uint64_t getOpenSSLNumericVersion() { #ifdef OPENSSL_VERSION_NUMBER - return SSLeay(); + return OpenSSL_version_num(); #else return 0; #endif diff --git a/folly/ssl/detail/OpenSSLThreading.cpp b/folly/ssl/detail/OpenSSLThreading.cpp index 3414fbd..ce345ab 100644 --- a/folly/ssl/detail/OpenSSLThreading.cpp +++ b/folly/ssl/detail/OpenSSLThreading.cpp @@ -115,6 +115,7 @@ struct SSLLock { // SSLContext runs in such environments. // Instead of declaring a static member we "new" the static // member so that it won't be destructed on exit(). +#if !FOLLY_SSL_DETAIL_OPENSSL_IS_110 static std::unique_ptr& locks() { static auto locksInst = new std::unique_ptr(); return *locksInst; @@ -128,8 +129,8 @@ static void callbackLocking(int mode, int n, const char*, int) { } } -static unsigned long callbackThreadID() { - return static_cast(folly::getCurrentThreadID()); +static void callbackThreadID(CRYPTO_THREADID *id) { + return CRYPTO_THREADID_set_numeric(id, folly::getCurrentThreadID()); } static CRYPTO_dynlock_value* dyn_create(const char*, int) { @@ -150,28 +151,33 @@ dyn_lock(int mode, struct CRYPTO_dynlock_value* lock, const char*, int) { static void dyn_destroy(struct CRYPTO_dynlock_value* lock, const char*, int) { delete lock; } +#endif void installThreadingLocks() { +#if !FOLLY_SSL_DETAIL_OPENSSL_IS_110 // static locking locks() = std::make_unique(size_t(CRYPTO_num_locks())); for (auto it : lockTypes()) { locks()[size_t(it.first)].lockType = it.second; } - CRYPTO_set_id_callback(callbackThreadID); + CRYPTO_THREADID_set_callback(callbackThreadID); CRYPTO_set_locking_callback(callbackLocking); // dynamic locking CRYPTO_set_dynlock_create_callback(dyn_create); CRYPTO_set_dynlock_lock_callback(dyn_lock); CRYPTO_set_dynlock_destroy_callback(dyn_destroy); +#endif } void cleanupThreadingLocks() { - CRYPTO_set_id_callback(nullptr); +#if !FOLLY_SSL_DETAIL_OPENSSL_IS_110 + CRYPTO_THREADID_set_callback(nullptr); CRYPTO_set_locking_callback(nullptr); CRYPTO_set_dynlock_create_callback(nullptr); CRYPTO_set_dynlock_lock_callback(nullptr); CRYPTO_set_dynlock_destroy_callback(nullptr); locks().reset(); +#endif } } // namespace detail