9#include <botan/internal/rdseed.h>
11#include <botan/compiler.h>
12#include <botan/internal/cpuid.h>
33 const size_t RDSEED_RETRIES = 1024;
35 for(
size_t i = 0; i != RDSEED_RETRIES; ++i) {
39#if defined(BOTAN_USE_GCC_INLINE_ASM)
40 asm(
"rdseed %0; adcl $0,%1" :
"=r"(r),
"=r"(cf) :
"0"(r),
"1"(cf) :
"cc");
42 cf = _rdseed32_step(&r);
60 const size_t RDSEED_BYTES = 1024;
61 static_assert(RDSEED_BYTES % 4 == 0,
"Bad RDSEED configuration");
63 if(CPUID::has_rdseed()) {
65 seed.reserve(RDSEED_BYTES / 4);
67 for(
size_t p = 0; p != RDSEED_BYTES / 4; ++p) {
76 if(!read_rdseed(seed)) {
82 rng.
add_entropy(
reinterpret_cast<const uint8_t*
>(seed.data()), seed.size() *
sizeof(uint32_t));
size_t poll(RandomNumberGenerator &rng) override
void add_entropy(std::span< const uint8_t > input)
#define BOTAN_FUNC_ISA(isa)
std::vector< T, secure_allocator< T > > secure_vector