summaryrefslogtreecommitdiff
path: root/src/common/Cryptography/OpenSSLCrypto.cpp
diff options
context:
space:
mode:
authorWinfidonarleyan <dowlandtop@yandex.com>2022-11-23 21:12:20 +0300
committerGitHub <noreply@github.com>2022-11-24 01:12:20 +0700
commita1a1528cb4a9ed6f0220621fe6ecf9e2c36a5534 (patch)
tree04598163bda650f353cc1e12872c03f94537f700 /src/common/Cryptography/OpenSSLCrypto.cpp
parent4a2964e10a03a2b6ba2077e6b362b8a6ba6675fb (diff)
feat(Core/Crypto): add support `OpenSSL 3.0` (#13354)
Diffstat (limited to 'src/common/Cryptography/OpenSSLCrypto.cpp')
-rw-r--r--src/common/Cryptography/OpenSSLCrypto.cpp55
1 files changed, 48 insertions, 7 deletions
diff --git a/src/common/Cryptography/OpenSSLCrypto.cpp b/src/common/Cryptography/OpenSSLCrypto.cpp
index 7bba285bda..ccfe2de5f7 100644
--- a/src/common/Cryptography/OpenSSLCrypto.cpp
+++ b/src/common/Cryptography/OpenSSLCrypto.cpp
@@ -15,49 +15,90 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <OpenSSLCrypto.h>
+#include "OpenSSLCrypto.h"
+#include <openssl/crypto.h>
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1010000fL
#include <vector>
#include <thread>
#include <mutex>
+
std::vector<std::mutex*> cryptoLocks;
+
static void lockingCallback(int mode, int type, char const* /*file*/, int /*line*/)
{
if (mode & CRYPTO_LOCK)
- {
cryptoLocks[type]->lock();
- }
else
- {
cryptoLocks[type]->unlock();
- }
}
-static void threadIdCallback(CRYPTO_THREADID* id)
+
+static void threadIdCallback(CRYPTO_THREADID * id)
{
(void)id;
CRYPTO_THREADID_set_numeric(id, std::hash<std::thread::id>()(std::this_thread::get_id()));
}
+#elif OPENSSL_VERSION_NUMBER >= 0x30000000L
+#include <openssl/provider.h>
+OSSL_PROVIDER* LegacyProvider;
+OSSL_PROVIDER* DefaultProvider;
+#endif
+
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L && AC_PLATFORM == AC_PLATFORM_WINDOWS
+#include <boost/dll/runtime_symbol_info.hpp>
+#include <filesystem>
+
+void SetupLibrariesForWindows()
+{
+ namespace fs = std::filesystem;
+
+ fs::path programLocation{ boost::dll::program_location().remove_filename().string() };
+ fs::path libLegacy{ boost::dll::program_location().remove_filename().string() + "/legacy.dll" };
+
+ ASSERT(fs::exists(libLegacy), "Not found 'legacy.dll'. Please copy library 'legacy.dll' from OpenSSL default dir to '{}'", programLocation.generic_string());
+ OSSL_PROVIDER_set_default_search_path(nullptr, programLocation.generic_string().c_str());
+}
+#endif
+
void OpenSSLCrypto::threadsSetup()
{
+#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1010000fL
cryptoLocks.resize(CRYPTO_num_locks());
+
for (int i = 0 ; i < CRYPTO_num_locks(); ++i)
{
cryptoLocks[i] = new std::mutex();
}
+
(void)&threadIdCallback;
CRYPTO_THREADID_set_callback(threadIdCallback);
+
(void)&lockingCallback;
CRYPTO_set_locking_callback(lockingCallback);
+#elif OPENSSL_VERSION_NUMBER >= 0x30000000L
+#if AC_PLATFORM == AC_PLATFORM_WINDOWS
+ SetupLibrariesForWindows();
+#endif
+ LegacyProvider = OSSL_PROVIDER_load(nullptr, "legacy");
+ DefaultProvider = OSSL_PROVIDER_load(nullptr, "default");
+#endif
}
+
void OpenSSLCrypto::threadsCleanup()
{
+#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1010000fL
CRYPTO_set_locking_callback(nullptr);
CRYPTO_THREADID_set_callback(nullptr);
+
for (int i = 0 ; i < CRYPTO_num_locks(); ++i)
{
delete cryptoLocks[i];
}
+
cryptoLocks.resize(0);
-}
+#elif OPENSSL_VERSION_NUMBER >= 0x30000000L
+ OSSL_PROVIDER_unload(LegacyProvider);
+ OSSL_PROVIDER_unload(DefaultProvider);
+ OSSL_PROVIDER_set_default_search_path(nullptr, nullptr);
#endif
+}