7#include <botan/stateful_rng.h>
9#include <botan/assert.h>
10#include <botan/exceptn.h>
11#include <botan/internal/os_utils.h>
29 return m_reseed_counter > 0;
39void Stateful_RNG::generate_batched_output(std::span<uint8_t> output, std::span<const uint8_t> input) {
44 if(max_per_request == 0) {
49 while(!output.empty()) {
50 const size_t this_req = std::min(max_per_request, output.size());
58 output = output.subspan(this_req);
63void Stateful_RNG::fill_bytes_with_input(std::span<uint8_t> output, std::span<const uint8_t> input) {
71 reset_reseed_counter();
74 generate_batched_output(output, input);
84 reset_reseed_counter();
87 return bits_collected;
96 reset_reseed_counter();
100void Stateful_RNG::reset_reseed_counter() {
102 m_reseed_counter = 1;
110 const bool fork_detected = (m_last_pid > 0) && (cur_pid != m_last_pid);
112 if(
is_seeded() ==
false || fork_detected || (m_reseed_interval > 0 && m_reseed_counter >= m_reseed_interval)) {
113 m_reseed_counter = 0;
114 m_last_pid = cur_pid;
116 if(m_underlying_rng !=
nullptr) {
120 if(m_entropy_sources !=
nullptr) {
126 throw Invalid_State(
"Detected use of fork but cannot reseed DRBG");
133 m_reseed_counter += 1;
#define BOTAN_ASSERT_NOMSG(expr)
#define BOTAN_ASSERT(expr, assertion_made)
RandomNumberGenerator()=default
void add_entropy(std::span< const uint8_t > input)
virtual size_t reseed_from_sources(Entropy_Sources &srcs, size_t poll_bits=RandomNumberGenerator::DefaultPollBits)
virtual std::string name() const =0
virtual void reseed_from_rng(RandomNumberGenerator &rng, size_t poll_bits=RandomNumberGenerator::DefaultPollBits)
bool is_seeded() const final
void reseed_from_rng(RandomNumberGenerator &rng, size_t poll_bits=RandomNumberGenerator::DefaultPollBits) final
virtual size_t security_level() const =0
size_t reseed_from_sources(Entropy_Sources &srcs, size_t poll_bits=RandomNumberGenerator::DefaultPollBits) final
virtual void clear_state()=0
virtual void generate_output(std::span< uint8_t > output, std::span< const uint8_t > input)=0
virtual size_t max_number_of_bytes_per_request() const =0
virtual void update(std::span< const uint8_t > input)=0
void initialize_with(std::span< const uint8_t > input)
uint32_t BOTAN_TEST_API get_process_id()
secure_vector< T > lock(const std::vector< T > &in)
lock_guard< T > lock_guard_type