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>
43 virtual void randomize(uint8_t output[],
size_t length) = 0;
64 virtual void add_entropy(
const uint8_t input[],
size_t length) = 0;
71 static_assert(std::is_standard_layout<T>::value && std::is_trivial<T>::value,
"add_entropy_T data must be POD");
72 this->add_entropy(
reinterpret_cast<const uint8_t*
>(&t),
sizeof(
T));
90 virtual void randomize_with_input(uint8_t output[],
size_t output_len,
91 const uint8_t input[],
size_t input_len);
102 virtual void randomize_with_ts_input(uint8_t output[],
size_t output_len);
107 virtual std::string
name()
const = 0;
127 size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS,
128 std::chrono::milliseconds poll_timeout = BOTAN_RNG_RESEED_DEFAULT_TIMEOUT);
134 size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS);
146 random_vec(output, bytes);
150 template<
typename Alloc>
151 void random_vec(std::vector<uint8_t, Alloc>& v,
size_t bytes)
154 this->randomize(v.data(), v.size());
164 this->randomize(&b, 1);
173 uint8_t b = this->next_byte();
175 b = this->next_byte();
184 BOTAN_DEPRECATED(
"Use AutoSeeded_RNG")
222 std::string
name()
const override {
return "Null_RNG"; }
225#if defined(BOTAN_TARGET_OS_HAS_THREADS)
238 void randomize(uint8_t out[],
size_t len)
override
240 lock_guard_type<mutex_type> lock(m_mutex);
241 m_rng->randomize(out, len);
244 bool accepts_input()
const override
246 lock_guard_type<mutex_type> lock(m_mutex);
247 return m_rng->accepts_input();
250 bool is_seeded()
const override
252 lock_guard_type<mutex_type> lock(m_mutex);
253 return m_rng->is_seeded();
256 void clear()
override
258 lock_guard_type<mutex_type> lock(m_mutex);
262 std::string
name()
const override
264 lock_guard_type<mutex_type> lock(m_mutex);
265 return m_rng->name();
268 size_t reseed(Entropy_Sources& src,
269 size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS,
270 std::chrono::milliseconds poll_timeout = BOTAN_RNG_RESEED_DEFAULT_TIMEOUT)
override
272 lock_guard_type<mutex_type> lock(m_mutex);
273 return m_rng->reseed(src, poll_bits, poll_timeout);
276 void add_entropy(
const uint8_t in[],
size_t len)
override
278 lock_guard_type<mutex_type> lock(m_mutex);
279 m_rng->add_entropy(in, len);
282 BOTAN_DEPRECATED(
"Use Serialized_RNG(new AutoSeeded_RNG) instead") Serialized_RNG();
288 explicit Serialized_RNG(RandomNumberGenerator* rng) : m_rng(rng) {}
291 std::unique_ptr<RandomNumberGenerator> m_rng;
virtual void clear() final override
bool accepts_input() const override
void add_entropy(const uint8_t[], size_t) override
void randomize(uint8_t[], size_t) override
std::string name() const override
bool is_seeded() const override
virtual bool accepts_input() const =0
virtual ~RandomNumberGenerator()=default
RandomNumberGenerator()=default
uint8_t next_nonzero_byte()
RandomNumberGenerator & operator=(const RandomNumberGenerator &rng)=delete
virtual bool is_seeded() const =0
void add_entropy_T(const T &t)
virtual void randomize(uint8_t output[], size_t length)=0
virtual std::string name() const =0
secure_vector< uint8_t > random_vec(size_t bytes)
RandomNumberGenerator(const RandomNumberGenerator &rng)=delete
void random_vec(std::vector< uint8_t, Alloc > &v, size_t bytes)
virtual void add_entropy(const uint8_t input[], size_t length)=0
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
std::vector< T, secure_allocator< T > > secure_vector