8 #ifndef BOTAN_RANDOM_NUMBER_GENERATOR_H_
9 #define BOTAN_RANDOM_NUMBER_GENERATOR_H_
11 #include <botan/secmem.h>
12 #include <botan/exceptn.h>
13 #include <botan/mutex.h>
19 class Entropy_Sources;
42 virtual void randomize(uint8_t output[],
size_t length) = 0;
51 virtual bool accepts_input()
const = 0;
63 virtual void add_entropy(
const uint8_t input[],
size_t length) = 0;
70 this->add_entropy(reinterpret_cast<const uint8_t*>(&t),
sizeof(
T));
88 virtual void randomize_with_input(uint8_t output[],
size_t output_len,
89 const uint8_t input[],
size_t input_len);
100 virtual void randomize_with_ts_input(uint8_t output[],
size_t output_len);
105 virtual std::string
name()
const = 0;
111 virtual void clear() = 0;
117 virtual bool is_seeded()
const = 0;
125 size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS,
126 std::chrono::milliseconds poll_timeout = BOTAN_RNG_RESEED_DEFAULT_TIMEOUT);
132 size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS);
144 random_vec(output, bytes);
148 template<
typename Alloc>
149 void random_vec(std::vector<uint8_t, Alloc>& v,
size_t bytes)
152 this->randomize(v.data(), v.size());
162 this->randomize(&b, 1);
171 uint8_t b = this->next_byte();
173 b = this->next_byte();
182 BOTAN_DEPRECATED(
"Use AutoSeeded_RNG")
220 std::string
name()
const override {
return "Null_RNG"; }
223 #if defined(BOTAN_TARGET_OS_HAS_THREADS)
232 void randomize(uint8_t out[],
size_t len)
override
234 lock_guard_type<mutex_type> lock(
m_mutex);
235 m_rng->randomize(out, len);
238 bool accepts_input()
const override
240 lock_guard_type<mutex_type> lock(
m_mutex);
241 return m_rng->accepts_input();
244 bool is_seeded()
const override
246 lock_guard_type<mutex_type> lock(
m_mutex);
247 return m_rng->is_seeded();
250 void clear()
override
252 lock_guard_type<mutex_type> lock(
m_mutex);
256 std::string
name()
const override
258 lock_guard_type<mutex_type> lock(
m_mutex);
259 return m_rng->name();
262 size_t reseed(Entropy_Sources& src,
263 size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS,
264 std::chrono::milliseconds poll_timeout = BOTAN_RNG_RESEED_DEFAULT_TIMEOUT)
override
266 lock_guard_type<mutex_type> lock(
m_mutex);
267 return m_rng->reseed(src, poll_bits, poll_timeout);
270 void add_entropy(
const uint8_t in[],
size_t len)
override
272 lock_guard_type<mutex_type> lock(
m_mutex);
273 m_rng->add_entropy(in, len);
276 BOTAN_DEPRECATED(
"Use Serialized_RNG(new AutoSeeded_RNG)") Serialized_RNG();
278 explicit Serialized_RNG(RandomNumberGenerator* rng) :
m_rng(rng) {}
281 std::unique_ptr<RandomNumberGenerator>
m_rng;
void add_entropy(const uint8_t[], size_t) override
secure_vector< uint8_t > random_vec(size_t bytes)
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
std::string name() const override
void randomize(uint8_t[], size_t) override
std::vector< T, secure_allocator< T >> secure_vector
uint8_t next_nonzero_byte()
void add_entropy_T(const T &t)
bool is_seeded() const override
RandomNumberGenerator & m_rng
void random_vec(std::vector< uint8_t, Alloc > &v, size_t bytes)
bool accepts_input() const override
virtual void clear() finaloverride