8 #ifndef BOTAN_RANDOM_NUMBER_GENERATOR_H__
9 #define BOTAN_RANDOM_NUMBER_GENERATOR_H__
11 #include <botan/entropy_src.h>
12 #include <botan/secmem.h>
13 #include <botan/exceptn.h>
14 #include <botan/mutex.h>
20 class Entropy_Sources;
43 virtual void randomize(uint8_t output[],
size_t length) = 0;
55 virtual void add_entropy(
const uint8_t input[],
size_t length) = 0;
62 this->add_entropy(reinterpret_cast<const uint8_t*>(&t),
sizeof(T));
80 virtual void randomize_with_input(uint8_t output[],
size_t output_len,
81 const uint8_t input[],
size_t input_len);
92 virtual void randomize_with_ts_input(uint8_t output[],
size_t output_len);
97 virtual std::string name()
const = 0;
103 virtual void clear() = 0;
109 virtual bool is_seeded()
const = 0;
117 size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS,
118 std::chrono::milliseconds poll_timeout = BOTAN_RNG_RESEED_DEFAULT_TIMEOUT);
124 size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS);
136 this->randomize(output.data(), output.size());
147 this->randomize(&b, 1);
156 uint8_t b = this->next_byte();
158 b = this->next_byte();
202 std::string
name()
const override {
return "Null_RNG"; }
205 #if defined(BOTAN_TARGET_OS_HAS_THREADS)
211 class BOTAN_DLL Serialized_RNG final :
public RandomNumberGenerator
214 void randomize(uint8_t out[],
size_t len)
override
216 lock_guard_type<mutex_type> lock(m_mutex);
217 m_rng->randomize(out, len);
220 bool is_seeded()
const override
222 lock_guard_type<mutex_type> lock(m_mutex);
223 return m_rng->is_seeded();
226 void clear()
override
228 lock_guard_type<mutex_type> lock(m_mutex);
232 std::string name()
const override
234 lock_guard_type<mutex_type> lock(m_mutex);
235 return m_rng->name();
238 size_t reseed(Entropy_Sources& src,
239 size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS,
240 std::chrono::milliseconds poll_timeout = BOTAN_RNG_RESEED_DEFAULT_TIMEOUT)
override
242 lock_guard_type<mutex_type> lock(m_mutex);
243 return m_rng->reseed(src, poll_bits, poll_timeout);
246 void add_entropy(
const uint8_t in[],
size_t len)
override
248 lock_guard_type<mutex_type> lock(m_mutex);
249 m_rng->add_entropy(in, len);
252 BOTAN_DEPRECATED(
"Use Serialized_RNG(new AutoSeeded_RNG)") Serialized_RNG();
254 explicit Serialized_RNG(RandomNumberGenerator* rng) :
m_rng(rng) {}
256 mutable mutex_type m_mutex;
257 std::unique_ptr<RandomNumberGenerator>
m_rng;
void add_entropy(const uint8_t[], size_t) override
secure_vector< uint8_t > random_vec(size_t bytes)
std::string name() const override
void randomize(uint8_t[], size_t) override
std::vector< T, secure_allocator< T >> secure_vector
class BOTAN_DLL BOTAN_DEPRECATED("LibraryInitializer is no longer required") LibraryInitializer
uint8_t next_nonzero_byte()
void add_entropy_T(const T &t)
bool is_seeded() const override
RandomNumberGenerator & m_rng