Added support for OpenSSL 1.1.0.
This commit is contained in:
parent
8f4db13e7f
commit
523aacb499
@ -29,11 +29,14 @@
|
|||||||
|
|
||||||
#include "vmime/net/tls/openssl/OpenSSLInitializer.hpp"
|
#include "vmime/net/tls/openssl/OpenSSLInitializer.hpp"
|
||||||
|
|
||||||
#include "vmime/utility/sync/autoLock.hpp"
|
|
||||||
#include "vmime/utility/sync/criticalSection.hpp"
|
|
||||||
|
|
||||||
#include "vmime/platform.hpp"
|
#include "vmime/platform.hpp"
|
||||||
|
|
||||||
|
#include <openssl/opensslv.h>
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
||||||
|
# define OPENSSL_API_COMPAT 0x10100000L
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
#include <openssl/rand.h>
|
#include <openssl/rand.h>
|
||||||
#include <openssl/crypto.h>
|
#include <openssl/crypto.h>
|
||||||
@ -43,15 +46,43 @@
|
|||||||
# include <openssl/conf.h>
|
# include <openssl/conf.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
|
# include "vmime/utility/sync/autoLock.hpp"
|
||||||
|
# include "vmime/utility/sync/criticalSection.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// OpenSSL locking callbacks for multithreading support (< v1.1 only)
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
vmime::shared_ptr <vmime::utility::sync::criticalSection >* g_openSSLMutexes = NULL;
|
||||||
|
|
||||||
|
extern "C" void VMime_OpenSSLCallback_lock(int mode, int n, const char* /* file */, int /* line */) {
|
||||||
|
|
||||||
|
if (mode & CRYPTO_LOCK) {
|
||||||
|
g_openSSLMutexes[n]->lock();
|
||||||
|
} else {
|
||||||
|
g_openSSLMutexes[n]->unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" unsigned long VMime_OpenSSLCallback_id() {
|
||||||
|
|
||||||
|
return vmime::platform::getHandler()->getThreadId();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace vmime {
|
namespace vmime {
|
||||||
namespace net {
|
namespace net {
|
||||||
namespace tls {
|
namespace tls {
|
||||||
|
|
||||||
|
|
||||||
shared_ptr <vmime::utility::sync::criticalSection >* OpenSSLInitializer::sm_mutexes;
|
|
||||||
|
|
||||||
|
|
||||||
OpenSSLInitializer::autoInitializer::autoInitializer() {
|
OpenSSLInitializer::autoInitializer::autoInitializer() {
|
||||||
|
|
||||||
// The construction of this unique 'oneTimeInitializer' object will be triggered
|
// The construction of this unique 'oneTimeInitializer' object will be triggered
|
||||||
@ -80,58 +111,52 @@ OpenSSLInitializer::oneTimeInitializer::~oneTimeInitializer() {
|
|||||||
// static
|
// static
|
||||||
void OpenSSLInitializer::initialize() {
|
void OpenSSLInitializer::initialize() {
|
||||||
|
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x0907000L
|
#if OPENSSL_VERSION_NUMBER >= 0x0907000L && OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
OPENSSL_config(NULL);
|
OPENSSL_config(NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
SSL_load_error_strings();
|
SSL_load_error_strings();
|
||||||
SSL_library_init();
|
SSL_library_init();
|
||||||
OpenSSL_add_all_algorithms();
|
OpenSSL_add_all_algorithms();
|
||||||
|
|
||||||
|
int numMutexes = CRYPTO_num_locks();
|
||||||
|
g_openSSLMutexes = new shared_ptr <vmime::utility::sync::criticalSection>[numMutexes];
|
||||||
|
|
||||||
|
for (int i = 0 ; i < numMutexes ; ++i) {
|
||||||
|
g_openSSLMutexes[i] = vmime::platform::getHandler()->createCriticalSection();
|
||||||
|
}
|
||||||
|
|
||||||
|
CRYPTO_set_locking_callback(OpenSSLCallback_lock);
|
||||||
|
CRYPTO_set_id_callback(OpenSSLCallback_id);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Seed the RNG, in case /dev/urandom is not available. Explicitely calling
|
||||||
|
// RAND_seed() even though /dev/urandom is available is harmless.
|
||||||
|
enum {
|
||||||
|
SEEDSIZE = 256
|
||||||
|
};
|
||||||
|
|
||||||
unsigned char seed[SEEDSIZE];
|
unsigned char seed[SEEDSIZE];
|
||||||
vmime::platform::getHandler()->generateRandomBytes(seed, SEEDSIZE);
|
vmime::platform::getHandler()->generateRandomBytes(seed, SEEDSIZE);
|
||||||
RAND_seed(seed, SEEDSIZE);
|
RAND_seed(seed, SEEDSIZE);
|
||||||
|
|
||||||
int numMutexes = CRYPTO_num_locks();
|
|
||||||
sm_mutexes = new shared_ptr <vmime::utility::sync::criticalSection>[numMutexes];
|
|
||||||
|
|
||||||
for (int i = 0 ; i < numMutexes ; ++i) {
|
|
||||||
sm_mutexes[i] = vmime::platform::getHandler()->createCriticalSection();
|
|
||||||
}
|
|
||||||
|
|
||||||
CRYPTO_set_locking_callback(&OpenSSLInitializer::lock);
|
|
||||||
CRYPTO_set_id_callback(&OpenSSLInitializer::id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
void OpenSSLInitializer::uninitialize() {
|
void OpenSSLInitializer::uninitialize() {
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
EVP_cleanup();
|
EVP_cleanup();
|
||||||
ERR_free_strings();
|
ERR_free_strings();
|
||||||
|
|
||||||
CRYPTO_set_locking_callback(NULL);
|
CRYPTO_set_locking_callback(NULL);
|
||||||
CRYPTO_set_id_callback(NULL);
|
CRYPTO_set_id_callback(NULL);
|
||||||
|
|
||||||
delete [] sm_mutexes;
|
delete [] g_openSSLMutexes;
|
||||||
}
|
g_openSSLMutexes = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
void OpenSSLInitializer::lock(int mode, int n, const char* /* file */, int /* line */) {
|
|
||||||
|
|
||||||
if (mode & CRYPTO_LOCK) {
|
|
||||||
sm_mutexes[n]->lock();
|
|
||||||
} else {
|
|
||||||
sm_mutexes[n]->unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
unsigned long OpenSSLInitializer::id() {
|
|
||||||
|
|
||||||
return vmime::platform::getHandler()->getThreadId();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,22 +74,6 @@ protected:
|
|||||||
/** Shutdown the OpenSSL lib
|
/** Shutdown the OpenSSL lib
|
||||||
*/
|
*/
|
||||||
static void uninitialize();
|
static void uninitialize();
|
||||||
|
|
||||||
|
|
||||||
static shared_ptr <vmime::utility::sync::criticalSection> getMutex();
|
|
||||||
|
|
||||||
enum {
|
|
||||||
SEEDSIZE = 256
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// OpenSSL multithreading support
|
|
||||||
static void lock(int mode, int n, const char* file, int line);
|
|
||||||
static unsigned long id();
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
static shared_ptr <vmime::utility::sync::criticalSection >* sm_mutexes;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user