MicrosoftCryptoProvider::MicrosoftCryptoProvider() : m_hProvider(0) { #if defined(USE_MS_CRYPTOAPI) // See http://support.microsoft.com/en-us/kb/238187 for CRYPT_NEWKEYSET fallback strategy if (!CryptAcquireContext(&m_hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { const DWORD firstErr = GetLastError(); if (!CryptAcquireContext(&m_hProvider, CRYPTOPP_CONTAINER, 0, PROV_RSA_FULL, CRYPT_NEWKEYSET /*user*/) && !CryptAcquireContext(&m_hProvider, CRYPTOPP_CONTAINER, 0, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET|CRYPT_NEWKEYSET)) { // Set original error with original code SetLastError(firstErr); throw OS_RNG_Err("CryptAcquireContext"); } } #elif defined(USE_MS_CNGAPI) NTSTATUS ret = BCryptOpenAlgorithmProvider(&m_hProvider, BCRYPT_RNG_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0); if (!(BCRYPT_SUCCESS(ret))) { // Hack... OS_RNG_Err calls GetLastError() SetLastError(NtStatusToErrorCode(ret)); throw OS_RNG_Err("BCryptOpenAlgorithmProvider"); } #endif }
void NonblockingRng::GenerateBlock(byte *output, size_t size) { #ifdef CRYPTOPP_WIN32_AVAILABLE # ifdef WORKAROUND_MS_BUG_Q258000 const MicrosoftCryptoProvider &m_Provider = Singleton<MicrosoftCryptoProvider>().Ref(); # endif if (!CryptGenRandom(m_Provider.GetProviderHandle(), (DWORD)size, output)) throw OS_RNG_Err("CryptGenRandom"); #else while (size) { ssize_t len = read(m_fd, output, size); if (len < 0) { // /dev/urandom reads CAN give EAGAIN errors! (maybe EINTR as well) if (errno != EINTR && errno != EAGAIN) throw OS_RNG_Err("read /dev/urandom"); continue; } output += len; size -= len; } #endif }
void NonblockingRng::GenerateBlock(byte *output, size_t size) { #ifdef CRYPTOPP_WIN32_AVAILABLE // Acquiring a provider is expensive. Do it once and retain the reference. static const MicrosoftCryptoProvider &hProvider = Singleton<MicrosoftCryptoProvider>().Ref(); # if defined(USE_MS_CRYPTOAPI) if (!CryptGenRandom(hProvider.GetProviderHandle(), (DWORD)size, output)) throw OS_RNG_Err("CryptGenRandom"); # elif defined(USE_MS_CNGAPI) NTSTATUS ret = BCryptGenRandom(hProvider.GetProviderHandle(), output, (ULONG)size, 0); if (!(BCRYPT_SUCCESS(ret))) { // Hack... OS_RNG_Err calls GetLastError() SetLastError(NtStatusToErrorCode(ret)); throw OS_RNG_Err("BCryptGenRandom"); } # endif #else while (size) { ssize_t len = read(m_fd, output, size); if (len < 0) { // /dev/urandom reads CAN give EAGAIN errors! (maybe EINTR as well) if (errno != EINTR && errno != EAGAIN) throw OS_RNG_Err("read /dev/urandom"); continue; } output += len; size -= len; } #endif // CRYPTOPP_WIN32_AVAILABLE }
void NonblockingRng::GenerateBlock(byte *output, unsigned int size) { #ifdef _WIN32 if (!CryptGenRandom(m_hProvider, size, output)) throw OS_RNG_Err("NonblockingRng: CryptGenRandom failed"); #else if (read(m_fd, output, size) != size) throw OS_RNG_Err("NonblockingRng: error reading from /dev/urandom"); #endif }
NonblockingRng::NonblockingRng() { #ifdef _WIN32 if(!CryptAcquireContext(&m_hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) throw OS_RNG_Err("NonblockingRng: CryptAcquireContext failed"); #else m_fd = open("/dev/urandom",O_RDONLY); if (m_fd == -1) throw OS_RNG_Err("NonblockingRng: could not open /dev/urandom"); #endif }
void NonblockingRng::GenerateBlock(byte *output, size_t size) { #ifdef CRYPTOPP_WIN32_AVAILABLE # ifdef WORKAROUND_MS_BUG_Q258000 static MicrosoftCryptoProvider m_Provider; # endif if (!CryptGenRandom(m_Provider.GetProviderHandle(), (DWORD)size, output)) throw OS_RNG_Err("CryptGenRandom"); #else if (read(m_fd, output, size) != size) throw OS_RNG_Err("read /dev/urandom"); #endif }
NonblockingRng::NonblockingRng() { #ifndef CRYPTOPP_WIN32_AVAILABLE m_fd = open("/dev/urandom",O_RDONLY); if (m_fd == -1) throw OS_RNG_Err("open /dev/urandom"); #endif }
MicrosoftCryptoProvider::MicrosoftCryptoProvider() { if(!CryptAcquireContext(&m_hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { char buf[1024] = ""; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, buf, sizeof(buf), NULL); throw OS_RNG_Err( std::string("CryptAcquireContext: ") + buf); } }
void BlockingRng::GenerateBlock(byte *output, size_t size) { while (size) { // on some systems /dev/random will block until all bytes // are available, on others it will returns immediately ssize_t len = read(m_fd, output, size); if (len < 0) throw OS_RNG_Err("read " CRYPTOPP_BLOCKING_RNG_FILENAME); size -= len; output += len; if (size) sleep(1); } }
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); } }
void BlockingRng::GenerateBlock(byte *output, size_t size) { while (size) { // on some systems /dev/random will block until all bytes // are available, on others it returns immediately ssize_t len = read(m_fd, output, size); if (len < 0) { // /dev/random reads CAN give EAGAIN errors! (maybe EINTR as well) if (errno != EINTR && errno != EAGAIN) throw OS_RNG_Err("read " CRYPTOPP_BLOCKING_RNG_FILENAME); continue; } size -= len; output += len; if (size) sleep(1); } }
MicrosoftCryptoProvider::MicrosoftCryptoProvider() { if(!CryptAcquireContext(&m_hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) throw OS_RNG_Err("CryptAcquireContext"); }
BlockingRng::BlockingRng() { m_fd = open(CRYPTOPP_BLOCKING_RNG_FILENAME,O_RDONLY); if (m_fd == -1) throw OS_RNG_Err("open " CRYPTOPP_BLOCKING_RNG_FILENAME); }
BlockingRng::BlockingRng() { m_fd = open("/dev/random",O_RDONLY); if (m_fd == -1) throw OS_RNG_Err("open /dev/random"); }