proper portable fallback

This commit is contained in:
Glenn Maynard
2005-01-20 16:05:17 +00:00
parent 583eaf5532
commit 59d04d5755
2 changed files with 11 additions and 76 deletions
+10 -50
View File
@@ -15,7 +15,7 @@
#include <wincrypt.h>
#endif
#ifdef CRYPTOPP_UNIX_AVAILABLE
#if defined(UNIX)
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
@@ -28,16 +28,16 @@ OS_RNG_Err::OS_RNG_Err(const std::string &operation)
: Exception(OTHER_ERROR, "OS_Rng: " + operation + " operation failed with error " +
#ifdef CRYPTOPP_WIN32_AVAILABLE
"0x" + IntToString(GetLastError(), 16)
#else
#elif defined(UNIX)
IntToString(errno)
#else
"(unknown)"
#endif
)
{
}
#endif
#ifdef NONBLOCKING_RNG_AVAILABLE
#ifdef CRYPTOPP_WIN32_AVAILABLE
MicrosoftCryptoProvider::MicrosoftCryptoProvider()
@@ -61,7 +61,7 @@ MicrosoftCryptoProvider::~MicrosoftCryptoProvider()
NonblockingRng::NonblockingRng()
{
#ifndef CRYPTOPP_WIN32_AVAILABLE
#if defined(UNIX)
m_fd = open("/dev/urandom",O_RDONLY);
if (m_fd == -1)
throw OS_RNG_Err("open /dev/urandom");
@@ -70,7 +70,7 @@ NonblockingRng::NonblockingRng()
NonblockingRng::~NonblockingRng()
{
#ifndef CRYPTOPP_WIN32_AVAILABLE
#if defined(UNIX)
close(m_fd);
#endif
}
@@ -90,55 +90,15 @@ void NonblockingRng::GenerateBlock(byte *output, unsigned int size)
# endif
if (!CryptGenRandom(m_Provider.GetProviderHandle(), size, output))
throw OS_RNG_Err("CryptGenRandom");
#else
#elif defined(UNIX)
if (read(m_fd, output, size) != int(size))
throw OS_RNG_Err("read /dev/urandom");
#else
#warning No crypto source
memset( output, 0, size );
#endif
}
#endif
// *************************************************************
#ifdef BLOCKING_RNG_AVAILABLE
BlockingRng::BlockingRng()
{
m_fd = open("/dev/random",O_RDONLY);
if (m_fd == -1)
throw OS_RNG_Err("open /dev/random");
}
BlockingRng::~BlockingRng()
{
close(m_fd);
}
byte BlockingRng::GenerateByte()
{
byte b;
GenerateBlock(&b, 1);
return b;
}
void BlockingRng::GenerateBlock(byte *output, unsigned int size)
{
while (size)
{
// on some systems /dev/random will block until all bytes
// are available, on others it will returns immediately
int len = read(m_fd, output, STDMIN(size, (unsigned int)INT_MAX));
if (len == -1)
throw OS_RNG_Err("read /dev/random");
size -= len;
output += len;
if (size)
sleep(1);
}
}
#endif
NAMESPACE_END
#endif
+1 -26
View File
@@ -3,8 +3,6 @@
#include "config.h"
#ifdef OS_RNG_AVAILABLE
//removed
//#include "randpool.h"
@@ -21,8 +19,6 @@ public:
OS_RNG_Err(const std::string &operation);
};
#ifdef NONBLOCKING_RNG_AVAILABLE
#ifdef CRYPTOPP_WIN32_AVAILABLE
class MicrosoftCryptoProvider
{
@@ -54,32 +50,11 @@ protected:
# ifndef WORKAROUND_MS_BUG_Q258000
MicrosoftCryptoProvider m_Provider;
# endif
#else
#elif defined(UNIX)
int m_fd;
#endif
};
#endif
#ifdef BLOCKING_RNG_AVAILABLE
//! encapsulate /dev/random
class BlockingRng : public RandomNumberGenerator
{
public:
BlockingRng();
~BlockingRng();
byte GenerateByte();
void GenerateBlock(byte *output, unsigned int size);
protected:
int m_fd;
};
#endif
NAMESPACE_END
#endif
#endif