diff options
Diffstat (limited to 'src/common/Cryptography/OpenSSLCrypto.cpp')
-rw-r--r-- | src/common/Cryptography/OpenSSLCrypto.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/common/Cryptography/OpenSSLCrypto.cpp b/src/common/Cryptography/OpenSSLCrypto.cpp index 92e5f0a87ef..1da91da633d 100644 --- a/src/common/Cryptography/OpenSSLCrypto.cpp +++ b/src/common/Cryptography/OpenSSLCrypto.cpp @@ -22,6 +22,7 @@ #include <mutex> std::vector<std::mutex*> cryptoLocks; +void ValgrindRandomSetup(); static void lockingCallback(int mode, int type, const char* /*file*/, int /*line*/) { @@ -39,6 +40,10 @@ static void threadIdCallback(CRYPTO_THREADID * id) void OpenSSLCrypto::threadsSetup() { +#ifdef VALGRIND + ValgrindRandomSetup(); +#endif + cryptoLocks.resize(CRYPTO_num_locks()); for(int i = 0 ; i < CRYPTO_num_locks(); ++i) { @@ -62,3 +67,66 @@ void OpenSSLCrypto::threadsCleanup() } cryptoLocks.resize(0); } + +#ifdef VALGRIND +#include <openssl/rand.h> + +RAND_METHOD const* default_rand; + +static int Valgrind_RAND_seed(const void* buf, int num) +{ + VALGRIND_DISCARD(VALGRIND_MAKE_MEM_DEFINED(buf, num)); + return default_rand->seed(buf, num); +} + +static int Valgrind_RAND_bytes(unsigned char* buf, int num) +{ + int ret = default_rand->bytes(buf, num); + VALGRIND_DISCARD(VALGRIND_MAKE_MEM_DEFINED(buf, num)); + return ret; +} + +static void Valgrind_RAND_cleanup(void) +{ + default_rand->cleanup(); +} + +static int Valgrind_RAND_add(const void* buf, int num, double randomness) +{ + VALGRIND_DISCARD(VALGRIND_MAKE_MEM_DEFINED(buf, num)); + return default_rand->add(buf, num, randomness); +} + +static int Valgrind_RAND_pseudorand(unsigned char* buf, int num) +{ + int ret = default_rand->pseudorand(buf, num); + VALGRIND_DISCARD(VALGRIND_MAKE_MEM_DEFINED(buf, num)); + return ret; +} + +static int Valgrind_RAND_status(void) +{ + return default_rand->status(); +} + +static RAND_METHOD valgrind_rand; + +void ValgrindRandomSetup() +{ + memset(&valgrind_rand, 0, sizeof(RAND_METHOD)); + default_rand = RAND_get_rand_method(); + if (default_rand->seed) + valgrind_rand.seed = &Valgrind_RAND_seed; + if (default_rand->bytes) + valgrind_rand.bytes = &Valgrind_RAND_bytes; + if (default_rand->cleanup) + valgrind_rand.cleanup = &Valgrind_RAND_cleanup; + if (default_rand->add) + valgrind_rand.add = &Valgrind_RAND_add; + if (default_rand->pseudorand) + valgrind_rand.pseudorand = &Valgrind_RAND_pseudorand; + if (default_rand->status) + valgrind_rand.status = &Valgrind_RAND_status; + RAND_set_rand_method(&valgrind_rand); +} +#endif |