9#include <botan/internal/rdseed.h>
10#include <botan/cpuid.h>
33 const size_t RDSEED_RETRIES = 512;
35 for(
size_t i = 0; i != RDSEED_RETRIES; ++i)
40#if defined(BOTAN_USE_GCC_INLINE_ASM)
41 asm(
"rdseed %0; adcl $0,%1" :
42 "=r" (r),
"=r" (cf) :
"0" (r),
"1" (cf) :
"cc");
44 cf = _rdseed32_step(&r);
64 const size_t RDSEED_BYTES = 1024;
65 static_assert(RDSEED_BYTES % 4 == 0,
"Bad RDSEED configuration");
67 if(CPUID::has_rdseed())
70 seed.reserve(RDSEED_BYTES / 4);
72 for(
size_t p = 0; p != RDSEED_BYTES / 4; ++p)
82 if(!read_rdseed(seed))
88 rng.
add_entropy(
reinterpret_cast<const uint8_t*
>(seed.data()),
89 seed.size() *
sizeof(uint32_t));
size_t poll(RandomNumberGenerator &rng) override
virtual void add_entropy(const uint8_t input[], size_t length)=0
#define BOTAN_FUNC_ISA(isa)
std::vector< T, secure_allocator< T > > secure_vector