Merge branch 'latest-fc' into 'dapp-support'
# Conflicts: # src/crypto/openssl.cpp
This commit is contained in:
commit
bff16bbc3d
3 changed files with 10 additions and 77 deletions
|
|
@ -9,6 +9,7 @@
|
|||
#include <openssl/ecdh.h>
|
||||
#include <openssl/sha.h>
|
||||
#include <openssl/obj_mac.h>
|
||||
#include <openssl/bn.h>
|
||||
|
||||
/**
|
||||
* @file openssl.hpp
|
||||
|
|
|
|||
|
|
@ -390,63 +390,4 @@ std::vector<char> aes_load( const fc::path& file, const fc::sha512& key )
|
|||
return aes_decrypt( key, cipher );
|
||||
} FC_RETHROW_EXCEPTIONS( warn, "", ("file",file) ) }
|
||||
|
||||
/* This stuff has to go somewhere, I guess this is as good a place as any...
|
||||
OpenSSL isn't thread-safe unless you give it access to some mutexes,
|
||||
so the CRYPTO_set_id_callback() function needs to be called before there's any
|
||||
chance of OpenSSL being accessed from multiple threads.
|
||||
*/
|
||||
struct openssl_thread_config
|
||||
{
|
||||
static boost::mutex* openssl_mutexes;
|
||||
static unsigned long get_thread_id();
|
||||
static void locking_callback(int mode, int type, const char *file, int line);
|
||||
openssl_thread_config();
|
||||
~openssl_thread_config();
|
||||
};
|
||||
openssl_thread_config openssl_thread_config_manager;
|
||||
|
||||
boost::mutex* openssl_thread_config::openssl_mutexes = nullptr;
|
||||
|
||||
unsigned long openssl_thread_config::get_thread_id()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return (unsigned long)::GetCurrentThreadId();
|
||||
#else
|
||||
return (unsigned long)(&fc::thread::current()); // TODO: should expose boost thread id
|
||||
#endif
|
||||
}
|
||||
|
||||
void openssl_thread_config::locking_callback(int mode, int type, const char *file, int line)
|
||||
{
|
||||
if (mode & CRYPTO_LOCK)
|
||||
openssl_mutexes[type].lock();
|
||||
else
|
||||
openssl_mutexes[type].unlock();
|
||||
}
|
||||
|
||||
// Warning: Things get complicated if third-party libraries also try to install their their own
|
||||
// OpenSSL thread functions. Right now, we don't install our own handlers if another library has
|
||||
// installed them before us which is a partial solution, but you'd really need to evaluate
|
||||
// each library that does this to make sure they will play nice.
|
||||
openssl_thread_config::openssl_thread_config()
|
||||
{
|
||||
if (CRYPTO_get_id_callback() == NULL &&
|
||||
CRYPTO_get_locking_callback() == NULL)
|
||||
{
|
||||
openssl_mutexes = new boost::mutex[CRYPTO_num_locks()];
|
||||
CRYPTO_set_id_callback(&get_thread_id);
|
||||
CRYPTO_set_locking_callback(&locking_callback);
|
||||
}
|
||||
}
|
||||
openssl_thread_config::~openssl_thread_config()
|
||||
{
|
||||
if (CRYPTO_get_id_callback() == &get_thread_id)
|
||||
{
|
||||
CRYPTO_set_id_callback(NULL);
|
||||
CRYPTO_set_locking_callback(NULL);
|
||||
delete[] openssl_mutexes;
|
||||
openssl_mutexes = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace fc
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
#include <string>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <fc/log/logger.hpp>
|
||||
|
||||
namespace fc
|
||||
{
|
||||
struct openssl_scope
|
||||
|
|
@ -15,9 +17,6 @@ namespace fc
|
|||
static path _configurationFilePath;
|
||||
openssl_scope()
|
||||
{
|
||||
ERR_load_crypto_strings();
|
||||
OpenSSL_add_all_algorithms();
|
||||
|
||||
const boost::filesystem::path& boostPath = _configurationFilePath;
|
||||
if(boostPath.empty() == false)
|
||||
{
|
||||
|
|
@ -29,25 +28,17 @@ namespace fc
|
|||
putenv((char*)varSetting.c_str());
|
||||
#endif
|
||||
}
|
||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||
// no longer needed as of OpenSSL 1.1
|
||||
// if special initialization is necessary in versions 1.1 and above,
|
||||
// use OPENSSL_init_crypto
|
||||
OPENSSL_config(nullptr);
|
||||
#endif
|
||||
|
||||
if (CONF_modules_load_file(_configurationFilePath.string().c_str(), "fc", CONF_MFLAGS_IGNORE_MISSING_FILE) <= 0) {
|
||||
elog("FATAL: error loading configuration file\n");
|
||||
ERR_print_errors_fp(stderr);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
~openssl_scope()
|
||||
{
|
||||
#if not defined(LIBRESSL_VERSION_NUMBER)
|
||||
// No FIPS in LibreSSL.
|
||||
// https://marc.info/?l=openbsd-misc&m=139819485423701&w=2
|
||||
FIPS_mode_set(0);
|
||||
#endif
|
||||
CONF_modules_unload(1);
|
||||
EVP_cleanup();
|
||||
CRYPTO_cleanup_all_ex_data();
|
||||
ERR_free_strings();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue