9 #include <botan/internal/rdseed.h>
10 #include <botan/cpuid.h>
12 #include <immintrin.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));
virtual void add_entropy(const uint8_t input[], size_t length)=0
size_t poll(RandomNumberGenerator &rng) override
std::vector< T, secure_allocator< T >> secure_vector
#define BOTAN_FUNC_ISA(isa)