8#include <botan/jitter_rng.h>
10#include <botan/assert.h>
12#include <jitterentropy.h>
16struct Jitter_RNG_Internal {
17 Jitter_RNG_Internal();
18 ~Jitter_RNG_Internal();
19 void collect_into_buffer(std::span<uint8_t> buf);
22 rand_data* m_rand_data;
25Jitter_RNG_Internal::Jitter_RNG_Internal() {
26 static int result = jent_entropy_init();
29 BOTAN_ASSERT(result == 0,
"JitterRNG: initialization successful");
31 constexpr unsigned int oversampling_rate = 0;
32 constexpr unsigned int flags = 0;
34 m_rand_data = jent_entropy_collector_alloc(oversampling_rate, flags);
38Jitter_RNG_Internal::~Jitter_RNG_Internal() {
40 jent_entropy_collector_free(m_rand_data);
41 m_rand_data =
nullptr;
45void Jitter_RNG_Internal::collect_into_buffer(std::span<uint8_t> buf) {
52 ssize_t num_bytes = jent_read_entropy_safe(&m_rand_data,
reinterpret_cast<char*
>(buf.data()), buf.size());
54 const auto error_msg = [&]() -> std::string_view {
57 return "JitterRNG: Uninitilialized";
59 return "JitterRNG: SP800-90B repetition count online health test failed";
61 return "JitterRNG: SP800-90B adaptive proportion online health test failed";
63 return "JitterRNG: Internal timer generator could not be initialized";
65 return "JitterRNG: LAG predictor health test failed";
67 return "JitterRNG: Repetitive count test (RCT) failed permanently";
69 return "JitterRNG: Adaptive proportion test (APT) failed permanently";
71 return "JitterRNG: LAG prediction test failed permanently";
73 return "JitterRNG: Error reading entropy";
82 BOTAN_ASSERT(
static_cast<size_t>(num_bytes) == buf.size(),
"JitterRNG produced the expected number of bytes");
90 m_jitter = std::make_unique<Jitter_RNG_Internal>();
93void Jitter_RNG::fill_bytes_with_input(std::span<uint8_t> out, std::span<const uint8_t> in) {
96 m_jitter->collect_into_buffer(out);
#define BOTAN_STATE_CHECK(expr)
#define BOTAN_ASSERT_NONNULL(ptr)
#define BOTAN_ASSERT(expr, assertion_made)