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()
108 {
109#if defined(BOTAN_HAS_SYSTEM_RNG)
110 if(
name ==
"system_rng" ||
name ==
"win32_cryptoapi")
111 {
112 return std::unique_ptr<Entropy_Source>(new System_RNG_EntropySource);
113 }
114#endif
115
116#if defined(BOTAN_HAS_PROCESSOR_RNG)
117 if(
name ==
"hwrng" ||
name ==
"rdrand" ||
name ==
"p9_darn")
118 {
120 {
121 return std::unique_ptr<Entropy_Source>(new Processor_RNG_EntropySource);
122 }
123 }
124#endif
125
126#if defined(BOTAN_HAS_ENTROPY_SRC_RDSEED)
128 {
129 return std::unique_ptr<Entropy_Source>(new Intel_Rdseed);
130 }
131#endif
132
133#if defined(BOTAN_HAS_ENTROPY_SRC_GETENTROPY)
134 if(
name ==
"getentropy")
135 {
136 return std::unique_ptr<Entropy_Source>(new Getentropy);
137 }
138#endif
139
140#if defined(BOTAN_HAS_ENTROPY_SRC_DEV_RANDOM)
141 if(
name ==
"dev_random")
142 {
143 return std::unique_ptr<Entropy_Source>(new Device_EntropySource(BOTAN_SYSTEM_RNG_POLL_DEVICES));
144 }
145#endif
146
147#if defined(BOTAN_HAS_ENTROPY_SRC_PROC_WALKER)
149 {
150 const std::string root_dir = BOTAN_ENTROPY_PROC_FS_PATH;
151 if(!root_dir.empty())
152 return std::unique_ptr<Entropy_Source>(new ProcWalking_EntropySource(root_dir));
153 }
154#endif
155
156#if defined(BOTAN_HAS_ENTROPY_SRC_WIN32)
157 if(
name ==
"system_stats")
158 {
159 return std::unique_ptr<Entropy_Source>(new Win32_EntropySource);
160 }
161#endif
162
164 return std::unique_ptr<Entropy_Source>();
165 }
#define BOTAN_UNUSED(...)
virtual std::string name() const =0
bool running_in_privileged_state()