Botan 2.13.0 Crypto and TLS for C++11

- Main Page
- Namespaces
- Classes
- Files

- Class List
- Class Index
- Class Hierarchy
- Class Members

Public Member Functions | Static Public Member Functions | List of all members
Botan::Intel_Rdseed Class Referencefinal

`#include <rdseed.h>`

Inheritance diagram for Botan::Intel_Rdseed:

## Public Member Functions
std::string | name () const override
size_t | poll (RandomNumberGenerator &rng) override

## Static Public Member Functions
static std::unique_ptr< Entropy_Source > | create (const std::string &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

std::unique_ptr< Entropy_Source > Botan::Entropy_Source::create | ( | const std::string & | type | ) |
| static inherited

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 67 of file entropy_srcs.cpp.

References BOTAN_UNUSED, and Botan::OS::running_in_privileged_state().

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

68 {
69 #if defined(BOTAN_HAS_SYSTEM_RNG)
70 if(name == "system_rng" || name == "win32_cryptoapi")
71 {
72 return std::unique_ptr<Entropy_Source>(new System_RNG_EntropySource);
73 }
74 #endif
75
76 #if defined(BOTAN_HAS_ENTROPY_SRC_RDRAND)
77 if(name == "rdrand")
78 {
79 return std::unique_ptr<Entropy_Source>(new Intel_Rdrand);
80 }
81 #endif
82
83 #if defined(BOTAN_HAS_ENTROPY_SRC_RDSEED)
84 if(name == "rdseed")
85 {
86 return std::unique_ptr<Entropy_Source>(new Intel_Rdseed);
87 }
88 #endif
89
90 #if defined(BOTAN_HAS_ENTROPY_SRC_DARN)
91 if(name == "p9_darn")
92 {
93 return std::unique_ptr<Entropy_Source>(new POWER9_DARN);
94 }
95 #endif
96
97 #if defined(BOTAN_HAS_ENTROPY_SRC_GETENTROPY)
98 if(name == "getentropy")
99 {
100 return std::unique_ptr<Entropy_Source>(new Getentropy);
101 }
102 #endif
103
104 #if defined(BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM)
105 if(name == "dev_random")
106 {
107 return std::unique_ptr<Entropy_Source>(new Device_EntropySource(BOTAN_SYSTEM_RNG_POLL_DEVICES));
108 }
109 #endif
110
111 #if defined(BOTAN_HAS_ENTROPY_SRC_PROC_WALKER)
112 if(name == "proc_walk" && OS::running_in_privileged_state() == false)
113 {
114 const std::string root_dir = BOTAN_ENTROPY_PROC_FS_PATH;
115 if(!root_dir.empty())
116 return std::unique_ptr<Entropy_Source>(new ProcWalking_EntropySource(root_dir));
117 }
118 #endif
119
120 #if defined(BOTAN_HAS_ENTROPY_SRC_WIN32)
121 if(name == "system_stats")
122 {
123 return std::unique_ptr<Entropy_Source>(new Win32_EntropySource);
124 }
125 #endif
126
127 BOTAN_UNUSED(name);
128 return std::unique_ptr<Entropy_Source>();
129 }
Botan::Entropy_Source::name
virtual std::string name() const =0
Botan::OS::running_in_privileged_state
bool running_in_privileged_state()
Definition: os_utils.cpp:143
BOTAN_UNUSED
#define BOTAN_UNUSED(...)
Definition: assert.h:142

std::string Botan::Intel_Rdseed::name | ( |  | ) | const
| inline override virtual

Returns
  name identifying this entropy source

Implements Botan::Entropy_Source.

Definition at line 22 of file rdseed.h.

22 { return "rdseed"; }

size_t Botan::Intel_Rdseed::poll | ( | RandomNumberGenerator & | rng | ) |
| override virtual

Perform an entropy gathering poll

Parameters

  rng | will 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 62 of file rdseed.cpp.

References Botan::RandomNumberGenerator::add_entropy().

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

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

- src/lib/entropy/rdseed/rdseed.h
- src/lib/entropy/rdseed/rdseed.cpp