9#ifndef BOTAN_RANDOM_NUMBER_GENERATOR_H_
10#define BOTAN_RANDOM_NUMBER_GENERATOR_H_
12#include <botan/concepts.h>
13#include <botan/exceptn.h>
14#include <botan/secmem.h>
36 static constexpr size_t DefaultReseedInterval = 1024;
41 static constexpr size_t DefaultPollBits = 256;
46 static constexpr auto DefaultPollTimeout = std::chrono::milliseconds(50);
71 void randomize(std::span<uint8_t> output) { this->fill_bytes_with_input(output, {}); }
94 void add_entropy(std::span<const uint8_t> input) { this->fill_bytes_with_input({}, input); }
101 template <
typename T>
102 requires std::is_standard_layout_v<T> && std::is_trivial_v<T>
104 this->add_entropy(
reinterpret_cast<const uint8_t*
>(&t),
sizeof(
T));
124 this->fill_bytes_with_input(output, input);
128 this->randomize_with_input(std::span(output, output_len), std::span(input, input_len));
145 void randomize_with_ts_input(std::span<uint8_t> output);
148 this->randomize_with_ts_input(std::span(output, output_len));
154 virtual std::string
name()
const = 0;
176 size_t poll_bits = RandomNumberGenerator::DefaultPollBits,
177 std::chrono::milliseconds poll_timeout = RandomNumberGenerator::DefaultPollTimeout);
187 size_t poll_bits = RandomNumberGenerator::DefaultPollBits);
199 void random_vec(std::span<uint8_t> v) { this->randomize(v); }
209 template <concepts::resizable_
byte_buffer T>
223 template <concepts::resizable_
byte_buffer T = secure_vector<u
int8_t>>
224 requires std::default_initializable<T>
227 random_vec(result, bytes);
234 template <
size_t bytes>
236 std::array<uint8_t, bytes> result{};
249 this->fill_bytes_with_input(std::span(&b, 1), {});
259 uint8_t b = this->next_byte();
261 b = this->next_byte();
311 std::string
name()
const override {
return "Null_RNG"; }
314 void fill_bytes_with_input(std::span<uint8_t> output, std::span<const uint8_t> )
override;
#define BOTAN_PUBLIC_API(maj, min)
bool accepts_input() const override
std::string name() const override
bool is_seeded() const override
void randomize(std::span< uint8_t > output)
RandomNumberGenerator & operator=(RandomNumberGenerator &&rng)=default
std::array< uint8_t, bytes > random_array()
virtual bool accepts_input() const =0
T random_vec(size_t bytes)
RandomNumberGenerator(RandomNumberGenerator &&rng)=default
virtual ~RandomNumberGenerator()=default
RandomNumberGenerator()=default
void add_entropy(std::span< const uint8_t > input)
void randomize(uint8_t output[], size_t length)
uint8_t next_nonzero_byte()
void random_vec(T &v, size_t bytes)
RandomNumberGenerator & operator=(const RandomNumberGenerator &rng)=delete
virtual bool is_seeded() const =0
void randomize_with_ts_input(uint8_t output[], size_t output_len)
void add_entropy(const uint8_t input[], size_t length)
virtual std::string name() const =0
void random_vec(std::span< uint8_t > v)
virtual void fill_bytes_with_input(std::span< uint8_t > output, std::span< const uint8_t > input)=0
void randomize_with_input(std::span< uint8_t > output, std::span< const uint8_t > input)
RandomNumberGenerator(const RandomNumberGenerator &rng)=delete
void add_entropy_T(const T &t)
void randomize_with_input(uint8_t output[], size_t output_len, const uint8_t input[], size_t input_len)
int(* final)(unsigned char *, CTX *)
RandomNumberGenerator RNG