static int ALL_RSI_GenerateBlock(byte *output, size_t size, unsigned int safety) { CRYPTOPP_ASSERT((output && size) || !(output || size)); #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 word32 val; #else word64 val; #endif while (size >= sizeof(val)) { #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 if (_rdseed32_step((word32*)output)) #else // Cast due to GCC, http://github.com/weidai11/cryptopp/issues/236 if (_rdseed64_step(reinterpret_cast<unsigned long long*>(output))) #endif { output += sizeof(val); size -= sizeof(val); } else { if (!safety--) { CRYPTOPP_ASSERT(0); return 0; } } } if (size) { #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 if (_rdseed32_step(&val)) #else // Cast due to GCC, http://github.com/weidai11/cryptopp/issues/236 if (_rdseed64_step(reinterpret_cast<unsigned long long*>(&val))) #endif { memcpy(output, &val, size); size = 0; } else { if (!safety--) { CRYPTOPP_ASSERT(0); return 0; } } } SecureWipeBuffer(&val, 1); return int(size == 0); }
static int ALL_RSI_GenerateBlock(byte *output, size_t size, unsigned int safety) { assert((output && size) || !(output || size)); #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 word32 val; #else word64 val; #endif while (size >= sizeof(val)) { #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 if (_rdseed32_step((word32*)output)) #else if (_rdseed64_step((word64*)output)) #endif { output += sizeof(val); size -= sizeof(val); } else { if (!safety--) { assert(0); return 0; } } } if (size) { #if CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 if (_rdseed32_step(&val)) #else if (_rdseed64_step(&val)) #endif { memcpy(output, &val, size); size = 0; } else { if (!safety--) { assert(0); return 0; } } } SecureWipeBuffer(&val, 1); return int(size == 0); }
size_t Intel_Rdseed::poll(RandomNumberGenerator& rng) { if(CPUID::has_rdseed()) { for(size_t p = 0; p != BOTAN_ENTROPY_INTEL_RNG_POLLS; ++p) { for(size_t i = 0; i != BOTAN_ENTROPY_RDSEED_RETRIES; ++i) { uint32_t r = 0; #if defined(BOTAN_USE_GCC_INLINE_ASM) int cf = 0; // Encoding of rdseed %eax asm(".byte 0x0F, 0xC7, 0xF8; adcl $0,%1" : "=a" (r), "=r" (cf) : "0" (r), "1" (cf) : "cc"); #else int cf = _rdseed32_step(&r); #endif if(1 == cf) { rng.add_entropy_T(r); break; } } } } return 0; }
void extern rdseed_test (unsigned int *p) { volatile int r; r = _rdseed32_step (p); }