Browse Source

Merge #5689: openssl: abstract out OPENSSL_cleanse

1630219 openssl: abstract out OPENSSL_cleanse (Cory Fields)
0.13
Wladimir J. van der Laan 10 years ago
parent
commit
07f4386b38
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
  1. 2
      src/Makefile.am
  2. 10
      src/allocators.h
  3. 2
      src/base58.cpp
  4. 4
      src/crypter.cpp
  5. 4
      src/crypter.h
  6. 2
      src/db.cpp
  7. 1
      src/qt/paymentrequestplus.cpp
  8. 2
      src/qt/paymentrequestplus.h
  9. 1
      src/qt/paymentserver.cpp
  10. 6
      src/random.cpp
  11. 1
      src/streams.h
  12. 13
      src/support/cleanse.cpp
  13. 13
      src/support/cleanse.h

2
src/Makefile.am

@ -123,6 +123,7 @@ BITCOIN_CORE_H = \
script/standard.h \ script/standard.h \
serialize.h \ serialize.h \
streams.h \ streams.h \
support/cleanse.h \
sync.h \ sync.h \
threadsafety.h \ threadsafety.h \
timedata.h \ timedata.h \
@ -268,6 +269,7 @@ libbitcoin_util_a_SOURCES = \
compat/strnlen.cpp \ compat/strnlen.cpp \
random.cpp \ random.cpp \
rpcprotocol.cpp \ rpcprotocol.cpp \
support/cleanse.cpp \
sync.cpp \ sync.cpp \
uint256.cpp \ uint256.cpp \
util.cpp \ util.cpp \

10
src/allocators.h

@ -6,6 +6,8 @@
#ifndef BITCOIN_ALLOCATORS_H #ifndef BITCOIN_ALLOCATORS_H
#define BITCOIN_ALLOCATORS_H #define BITCOIN_ALLOCATORS_H
#include "support/cleanse.h"
#include <map> #include <map>
#include <string> #include <string>
#include <string.h> #include <string.h>
@ -14,8 +16,6 @@
#include <boost/thread/mutex.hpp> #include <boost/thread/mutex.hpp>
#include <boost/thread/once.hpp> #include <boost/thread/once.hpp>
#include <openssl/crypto.h> // for OPENSSL_cleanse()
/** /**
* Thread-safe class to keep track of locked (ie, non-swappable) memory pages. * Thread-safe class to keep track of locked (ie, non-swappable) memory pages.
* *
@ -174,7 +174,7 @@ void LockObject(const T& t)
template <typename T> template <typename T>
void UnlockObject(const T& t) void UnlockObject(const T& t)
{ {
OPENSSL_cleanse((void*)(&t), sizeof(T)); memory_cleanse((void*)(&t), sizeof(T));
LockedPageManager::Instance().UnlockRange((void*)(&t), sizeof(T)); LockedPageManager::Instance().UnlockRange((void*)(&t), sizeof(T));
} }
@ -217,7 +217,7 @@ struct secure_allocator : public std::allocator<T> {
void deallocate(T* p, std::size_t n) void deallocate(T* p, std::size_t n)
{ {
if (p != NULL) { if (p != NULL) {
OPENSSL_cleanse(p, sizeof(T) * n); memory_cleanse(p, sizeof(T) * n);
LockedPageManager::Instance().UnlockRange(p, sizeof(T) * n); LockedPageManager::Instance().UnlockRange(p, sizeof(T) * n);
} }
std::allocator<T>::deallocate(p, n); std::allocator<T>::deallocate(p, n);
@ -254,7 +254,7 @@ struct zero_after_free_allocator : public std::allocator<T> {
void deallocate(T* p, std::size_t n) void deallocate(T* p, std::size_t n)
{ {
if (p != NULL) if (p != NULL)
OPENSSL_cleanse(p, sizeof(T) * n); memory_cleanse(p, sizeof(T) * n);
std::allocator<T>::deallocate(p, n); std::allocator<T>::deallocate(p, n);
} }
}; };

2
src/base58.cpp

@ -172,7 +172,7 @@ bool CBase58Data::SetString(const char* psz, unsigned int nVersionBytes)
vchData.resize(vchTemp.size() - nVersionBytes); vchData.resize(vchTemp.size() - nVersionBytes);
if (!vchData.empty()) if (!vchData.empty())
memcpy(&vchData[0], &vchTemp[nVersionBytes], vchData.size()); memcpy(&vchData[0], &vchTemp[nVersionBytes], vchData.size());
OPENSSL_cleanse(&vchTemp[0], vchData.size()); memory_cleanse(&vchTemp[0], vchData.size());
return true; return true;
} }

4
src/crypter.cpp

@ -26,8 +26,8 @@ bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::v
if (i != (int)WALLET_CRYPTO_KEY_SIZE) if (i != (int)WALLET_CRYPTO_KEY_SIZE)
{ {
OPENSSL_cleanse(chKey, sizeof(chKey)); memory_cleanse(chKey, sizeof(chKey));
OPENSSL_cleanse(chIV, sizeof(chIV)); memory_cleanse(chIV, sizeof(chIV));
return false; return false;
} }

4
src/crypter.h

@ -82,8 +82,8 @@ public:
void CleanKey() void CleanKey()
{ {
OPENSSL_cleanse(chKey, sizeof(chKey)); memory_cleanse(chKey, sizeof(chKey));
OPENSSL_cleanse(chIV, sizeof(chIV)); memory_cleanse(chIV, sizeof(chIV));
fKeySet = false; fKeySet = false;
} }

2
src/db.cpp

@ -21,8 +21,6 @@
#include <boost/thread.hpp> #include <boost/thread.hpp>
#include <boost/version.hpp> #include <boost/version.hpp>
#include <openssl/rand.h>
using namespace std; using namespace std;

1
src/qt/paymentrequestplus.cpp

@ -13,7 +13,6 @@
#include <stdexcept> #include <stdexcept>
#include <openssl/x509.h>
#include <openssl/x509_vfy.h> #include <openssl/x509_vfy.h>
#include <QDateTime> #include <QDateTime>

2
src/qt/paymentrequestplus.h

@ -9,6 +9,8 @@
#include "base58.h" #include "base58.h"
#include <openssl/x509.h>
#include <QByteArray> #include <QByteArray>
#include <QList> #include <QList>
#include <QString> #include <QString>

1
src/qt/paymentserver.cpp

@ -16,7 +16,6 @@
#include <cstdlib> #include <cstdlib>
#include <openssl/x509.h>
#include <openssl/x509_vfy.h> #include <openssl/x509_vfy.h>
#include <QApplication> #include <QApplication>

6
src/random.cpp

@ -5,6 +5,7 @@
#include "random.h" #include "random.h"
#include "support/cleanse.h"
#ifdef WIN32 #ifdef WIN32
#include "compat.h" // for Windows API #include "compat.h" // for Windows API
#endif #endif
@ -18,7 +19,6 @@
#include <sys/time.h> #include <sys/time.h>
#endif #endif
#include <openssl/crypto.h>
#include <openssl/err.h> #include <openssl/err.h>
#include <openssl/rand.h> #include <openssl/rand.h>
@ -40,7 +40,7 @@ void RandAddSeed()
// Seed with CPU performance counter // Seed with CPU performance counter
int64_t nCounter = GetPerformanceCounter(); int64_t nCounter = GetPerformanceCounter();
RAND_add(&nCounter, sizeof(nCounter), 1.5); RAND_add(&nCounter, sizeof(nCounter), 1.5);
OPENSSL_cleanse((void*)&nCounter, sizeof(nCounter)); memory_cleanse((void*)&nCounter, sizeof(nCounter));
} }
void RandAddSeedPerfmon() void RandAddSeedPerfmon()
@ -70,7 +70,7 @@ void RandAddSeedPerfmon()
RegCloseKey(HKEY_PERFORMANCE_DATA); RegCloseKey(HKEY_PERFORMANCE_DATA);
if (ret == ERROR_SUCCESS) { if (ret == ERROR_SUCCESS) {
RAND_add(begin_ptr(vData), nSize, nSize / 100.0); RAND_add(begin_ptr(vData), nSize, nSize / 100.0);
OPENSSL_cleanse(begin_ptr(vData), nSize); memory_cleanse(begin_ptr(vData), nSize);
LogPrint("rand", "%s: %lu bytes\n", __func__, nSize); LogPrint("rand", "%s: %lu bytes\n", __func__, nSize);
} else { } else {
static bool warned = false; // Warn only once static bool warned = false; // Warn only once

1
src/streams.h

@ -16,6 +16,7 @@
#include <map> #include <map>
#include <set> #include <set>
#include <stdint.h> #include <stdint.h>
#include <stdio.h>
#include <string> #include <string>
#include <string.h> #include <string.h>
#include <utility> #include <utility>

13
src/support/cleanse.cpp

@ -0,0 +1,13 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2015 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "cleanse.h"
#include <openssl/crypto.h>
void memory_cleanse(void *ptr, size_t len)
{
OPENSSL_cleanse(ptr, len);
}

13
src/support/cleanse.h

@ -0,0 +1,13 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2015 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef BITCOIN_SUPPORT_CLEANSE_H
#define BITCOIN_SUPPORT_CLEANSE_H
#include <stdlib.h>
void memory_cleanse(void *ptr, size_t len);
#endif // BITCOIN_SUPPORT_CLEANSE_H
Loading…
Cancel
Save