From a7eb5c7ca64e3cde2336e2014ad04b660a89277e Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Sun, 26 May 2013 10:49:19 -0700 Subject: [PATCH] Move platform specific random number stuff --- modules/ripple_basics/ripple_basics.cpp | 8 +- .../system/ripple_RandomNumbers.cpp | 78 ++++++++++++++++++ .../system/ripple_RandomNumbers.h | 2 + modules/ripple_mess/ripple_mess.cpp | 1 - newcoin.vcxproj | 6 -- newcoin.vcxproj.filters | 3 - src/cpp/ripple/PlatRand.cpp | 80 ------------------- src/cpp/ripple/main.cpp | 1 - 8 files changed, 86 insertions(+), 93 deletions(-) delete mode 100644 src/cpp/ripple/PlatRand.cpp diff --git a/modules/ripple_basics/ripple_basics.cpp b/modules/ripple_basics/ripple_basics.cpp index cdd6d5552a..182f231b3d 100644 --- a/modules/ripple_basics/ripple_basics.cpp +++ b/modules/ripple_basics/ripple_basics.cpp @@ -24,6 +24,7 @@ #include "ripple_basics.h" +#include #include #include @@ -54,12 +55,15 @@ #include "events/ripple_UptimeTimer.cpp" +#include "memory/ripple_StringUtilities.cpp" + #ifdef WIN32 +#include // for ripple_RandomNumbers.cpp +#include // for ripple_RandomNumbers.cpp // Winsock #defines 'max' and does other stupid things so put it last -#include "Winsock2.h" // for ripple_ByteOrder.cpp +#include // for ripple_ByteOrder.cpp #endif #include "memory/ripple_ByteOrder.cpp" -#include "memory/ripple_StringUtilities.cpp" #include "system/ripple_RandomNumbers.cpp" diff --git a/modules/ripple_basics/system/ripple_RandomNumbers.cpp b/modules/ripple_basics/system/ripple_RandomNumbers.cpp index 2699b8ccc9..54b46da4f5 100644 --- a/modules/ripple_basics/system/ripple_RandomNumbers.cpp +++ b/modules/ripple_basics/system/ripple_RandomNumbers.cpp @@ -28,3 +28,81 @@ void getRand(unsigned char *buf, int num) } } +//------------------------------------------------------------------------------ + +// VFALCO: TODO replace WIN32 macro with VFLIB_WIN32 + +#ifdef WIN32 + +bool AddSystemEntropy() +{ // Get entropy from the Windows crypto provider + char name[512], rand[128]; + DWORD count = 500; + HCRYPTPROV cryptoHandle; + + if (!CryptGetDefaultProvider(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, name, &count)) + { +#ifdef DEBUG + std::cerr << "Unable to get default crypto provider" << std::endl; +#endif + return false; + } + + if (!CryptAcquireContext(&cryptoHandle, NULL, name, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) + { +#ifdef DEBUG + std::cerr << "Unable to acquire crypto provider" << std::endl; +#endif + return false; + } + + if(!CryptGenRandom(cryptoHandle, 128, reinterpret_cast(rand))) + { +#ifdef DEBUG + std::cerr << "Unable to get entropy from crypto provider" << std::endl; +#endif + CryptReleaseContext(cryptoHandle, 0); + return false; + } + + CryptReleaseContext(cryptoHandle, 0); + RAND_seed(rand, 128); + + return true; +} + +#else + +#include +#include + +#include + +bool AddSystemEntropy() +{ + char rand[128]; + std::ifstream reader; + + reader.open("/dev/urandom", std::ios::in | std::ios::binary); + if (!reader.is_open()) + { +#ifdef DEBUG + std::cerr << "Unable to open random source" << std::endl; +#endif + return false; + } + reader.read(rand, 128); + + int bytesRead = reader.gcount(); + if (bytesRead == 0) + { +#ifdef DEBUG + std::cerr << "Unable to read from random source" << std::endl; +#endif + return false; + } + RAND_seed(rand, bytesRead); + return bytesRead >= 64; +} + +#endif diff --git a/modules/ripple_basics/system/ripple_RandomNumbers.h b/modules/ripple_basics/system/ripple_RandomNumbers.h index 058b642e9c..c4560215f2 100644 --- a/modules/ripple_basics/system/ripple_RandomNumbers.h +++ b/modules/ripple_basics/system/ripple_RandomNumbers.h @@ -19,6 +19,8 @@ #ifndef RIPPLE_RANDOMNUMBERS_H #define RIPPLE_RANDOMNUMBERS_H +extern bool AddSystemEntropy (); + // Cryptographically secure random number source // VFALCO: TODO Clean this up, rename stuff diff --git a/modules/ripple_mess/ripple_mess.cpp b/modules/ripple_mess/ripple_mess.cpp index 783d2e5219..4baf46ee61 100644 --- a/modules/ripple_mess/ripple_mess.cpp +++ b/modules/ripple_mess/ripple_mess.cpp @@ -58,7 +58,6 @@ static const uint64 tenTo17m1 = tenTo17 - 1; #include "src/cpp/ripple/PackedMessage.cpp" // no log #include "src/cpp/ripple/ParameterTable.cpp" // no log #include "src/cpp/ripple/ParseSection.cpp" -#include "src/cpp/ripple/PlatRand.cpp" // no log #include "src/cpp/ripple/ProofOfWork.cpp" #include "src/cpp/ripple/RippleAddress.cpp" #include "src/cpp/ripple/rfc1751.cpp" // no log diff --git a/newcoin.vcxproj b/newcoin.vcxproj index 5d36c45ce4..589fdca6ab 100644 --- a/newcoin.vcxproj +++ b/newcoin.vcxproj @@ -887,12 +887,6 @@ true true - - true - true - true - true - true true diff --git a/newcoin.vcxproj.filters b/newcoin.vcxproj.filters index 2e09adc5c8..942b084fde 100644 --- a/newcoin.vcxproj.filters +++ b/newcoin.vcxproj.filters @@ -516,9 +516,6 @@ 1. Modules\ripple_mess\types - - 1. Modules\ripple_mess\types - 1. Modules\ripple_mess\types diff --git a/src/cpp/ripple/PlatRand.cpp b/src/cpp/ripple/PlatRand.cpp deleted file mode 100644 index e367cbf841..0000000000 --- a/src/cpp/ripple/PlatRand.cpp +++ /dev/null @@ -1,80 +0,0 @@ - -#ifdef WIN32 - -#include -#include - -#include - -bool AddSystemEntropy() -{ // Get entropy from the Windows crypto provider - char name[512], rand[128]; - DWORD count = 500; - HCRYPTPROV cryptoHandle; - - if (!CryptGetDefaultProvider(PROV_RSA_FULL, NULL, CRYPT_MACHINE_DEFAULT, name, &count)) - { -#ifdef DEBUG - std::cerr << "Unable to get default crypto provider" << std::endl; -#endif - return false; - } - - if (!CryptAcquireContext(&cryptoHandle, NULL, name, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) - { -#ifdef DEBUG - std::cerr << "Unable to acquire crypto provider" << std::endl; -#endif - return false; - } - - if(!CryptGenRandom(cryptoHandle, 128, reinterpret_cast(rand))) - { -#ifdef DEBUG - std::cerr << "Unable to get entropy from crypto provider" << std::endl; -#endif - CryptReleaseContext(cryptoHandle, 0); - return false; - } - - CryptReleaseContext(cryptoHandle, 0); - RAND_seed(rand, 128); - - return true; -} - -#else - -#include -#include - -#include - -bool AddSystemEntropy() -{ - char rand[128]; - std::ifstream reader; - - reader.open("/dev/urandom", std::ios::in | std::ios::binary); - if (!reader.is_open()) - { -#ifdef DEBUG - std::cerr << "Unable to open random source" << std::endl; -#endif - return false; - } - reader.read(rand, 128); - - int bytesRead = reader.gcount(); - if (bytesRead == 0) - { -#ifdef DEBUG - std::cerr << "Unable to read from random source" << std::endl; -#endif - return false; - } - RAND_seed(rand, bytesRead); - return bytesRead >= 64; -} - -#endif diff --git a/src/cpp/ripple/main.cpp b/src/cpp/ripple/main.cpp index e6f87edae7..8a14ab29ee 100644 --- a/src/cpp/ripple/main.cpp +++ b/src/cpp/ripple/main.cpp @@ -14,7 +14,6 @@ namespace po = boost::program_options; -extern bool AddSystemEntropy(); extern void TFInit(); extern void LEFInit(); extern void SVFInit();