Tweak device random stuff for Linux

This commit is contained in:
Brian Cox 2017-07-15 22:59:50 -07:00
parent eec812814a
commit 60fede7678
1 changed files with 16 additions and 14 deletions

View File

@ -1241,37 +1241,34 @@ cHashedKey192::~cHashedKey192()
RandomizeBytes(mKey, KEYLEN);
}
/////////////////////////////////////////////////////////
#if HAVE_DEVICE_RANDOM
static bool randomize_by_device(const char* device_name, int8* destbuf, int len)
{
int dev_random = open("/dev/random", O_RDONLY|O_NONBLOCK);
if (dev_random >= 0)
int rng_device = open(device_name, O_RDONLY|O_NONBLOCK);
if (rng_device >= 0)
{
int bytes_read = read(dev_random, destbuf, len);
close(dev_random);
int bytes_read = read(rng_device, destbuf, len);
close(rng_device);
if (bytes_read == len)
return true;
return true;
}
return false;
}
#else
static bool gRandomizeBytesSeeded = false;
#endif
///////////////////////////////////////////////////////////////////////////////
// void RandomizeBytes(byte* destbuf, int len) -- Fill a buffer with random bytes
static bool gRandomizeBytesSeeded = false;
void RandomizeBytes(int8* destbuf, int len)
{
#if HAVE_DEVICE_RANDOM
#if HAVE_DEV_RANDOM
if (randomize_by_device("/dev/random", destbuf, len))
return;
iUserNotify::GetInstance()->Notify( iUserNotify::V_NORMAL, "Could not read from /dev/random, falling back to /dev/urandom");
#endif
#if HAVE_DEV_URANDOM
if (randomize_by_device("/dev/urandom", destbuf, len))
return;
@ -1282,6 +1279,11 @@ void RandomizeBytes(int8* destbuf, int len)
return;
#endif
#if HAVE_DEV_RANDOM
if (randomize_by_device("/dev/random", destbuf, len))
return;
#endif
ThrowAndAssert(eInternal(_T("Failed to read from any RNG devices")));
// TODO: OpenSSL or other impls that are better than the default one