Botan 3.8.1
Crypto and TLS for C&
Botan::Intel_Rdseed Class Referencefinal

#include <rdseed.h>

Inheritance diagram for Botan::Intel_Rdseed:
Botan::Entropy_Source

Public Member Functions

std::string name () const override
 
size_t poll (RandomNumberGenerator &rng) override
 

Static Public Member Functions

static std::unique_ptr< Entropy_Sourcecreate (std::string_view type)
 

Detailed Description

Entropy source using the rdseed instruction first introduced on Intel's Broadwell architecture.

Definition at line 19 of file rdseed.h.

Member Function Documentation

◆ create()

std::unique_ptr< Entropy_Source > Botan::Entropy_Source::create ( std::string_view type)
staticinherited

Return a new entropy source of a particular type, or null Each entropy source may require substantial resources (eg, a file handle or socket instance), so try to share them among multiple RNGs, or just use the preconfigured global list accessed by Entropy_Sources::global_sources()

Definition at line 111 of file entropy_srcs.cpp.

111 {
112#if defined(BOTAN_HAS_SYSTEM_RNG)
113 if(name == "system_rng") {
114 return std::make_unique<System_RNG_EntropySource>();
115 }
116#endif
117
118#if defined(BOTAN_HAS_PROCESSOR_RNG)
119 if(name == "hwrng") {
121 return std::make_unique<Processor_RNG_EntropySource>();
122 }
123 }
124#endif
125
126#if defined(BOTAN_HAS_ENTROPY_SRC_RDSEED)
127 if(name == "rdseed") {
128 return std::make_unique<Intel_Rdseed>();
129 }
130#endif
131
132#if defined(BOTAN_HAS_ENTROPY_SRC_GETENTROPY)
133 if(name == "getentropy") {
134 return std::make_unique<Getentropy>();
135 }
136#endif
137
138#if defined(BOTAN_HAS_ENTROPY_SRC_WIN32)
139 if(name == "system_stats") {
140 return std::make_unique<Win32_EntropySource>();
141 }
142#endif
143
144#if defined(BOTAN_HAS_JITTER_RNG)
145 if(name == "jitter_rng") {
146 return std::make_unique<Jitter_RNG_EntropySource>();
147 }
148#endif
149
151 return nullptr;
152}
#define BOTAN_UNUSED
Definition assert.h:120
virtual std::string name() const =0

References Botan::Processor_RNG::available(), BOTAN_UNUSED, and name().

Referenced by Botan::Entropy_Sources::Entropy_Sources().

◆ name()

std::string Botan::Intel_Rdseed::name ( ) const
inlineoverridevirtual
Returns
name identifying this entropy source

Implements Botan::Entropy_Source.

Definition at line 21 of file rdseed.h.

21{ return "rdseed"; }

◆ poll()

size_t Botan::Intel_Rdseed::poll ( RandomNumberGenerator & rng)
overridevirtual

Perform an entropy gathering poll

Parameters
rngwill be provided with entropy via calls to add_entropy
Returns
conservative estimate of actual entropy added to rng during poll

Implements Botan::Entropy_Source.

Definition at line 67 of file rdseed.cpp.

67 {
68 const size_t RDSEED_BYTES = 1024;
69 static_assert(RDSEED_BYTES % 4 == 0, "Bad RDSEED configuration");
70
73 seed.reserve(RDSEED_BYTES / 4);
74
75 for(size_t p = 0; p != RDSEED_BYTES / 4; ++p) {
76 /*
77 If at any point we exceed our retry count, we stop the entire seed
78 gathering process. This situation will only occur in situations of
79 extremely high RDSEED utilization. If RDSEED is currently so highly
80 contended, then the rest of the poll is likely to also face contention and
81 it is better to quit now rather than (presumably) face very high retry
82 times for the rest of the poll.
83 */
84 if(!read_rdseed(seed)) {
85 break;
86 }
87 }
88
89 if(!seed.empty()) {
90 rng.add_entropy(reinterpret_cast<const uint8_t*>(seed.data()), seed.size() * sizeof(uint32_t));
91 }
92 }
93
94 // RDSEED is used but not trusted
95 return 0;
96}
static bool has(CPUID::Feature feat)
Definition cpuid.h:94
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:65

References Botan::RandomNumberGenerator::add_entropy(), Botan::CPUID::has(), and Botan::CPUFeature::RDSEED.


The documentation for this class was generated from the following files: