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 constexpr unsigned int oversampling_rate = 0;
27 constexpr unsigned int flags = JENT_FORCE_FIPS;
30 static int result = jent_entropy_init_ex(oversampling_rate, flags);
33 BOTAN_ASSERT(result == 0,
"JitterRNG: initialization successful");
35 m_rand_data = jent_entropy_collector_alloc(oversampling_rate, flags);
39Jitter_RNG_Internal::~Jitter_RNG_Internal() {
41 jent_entropy_collector_free(m_rand_data);
42 m_rand_data =
nullptr;
46void Jitter_RNG_Internal::collect_into_buffer(std::span<uint8_t> buf) {
53 ssize_t num_bytes = jent_read_entropy_safe(&m_rand_data,
reinterpret_cast<char*
>(buf.data()), buf.size());
55 const auto error_msg = [&]() -> std::string_view {
58 return "JitterRNG: Uninitilialized";
60 return "JitterRNG: SP800-90B repetition count online health test failed";
62 return "JitterRNG: SP800-90B adaptive proportion online health test failed";
64 return "JitterRNG: Internal timer generator could not be initialized";
66 return "JitterRNG: LAG predictor health test failed";
68 return "JitterRNG: Repetitive count test (RCT) failed permanently";
70 return "JitterRNG: Adaptive proportion test (APT) failed permanently";
72 return "JitterRNG: LAG prediction test failed permanently";
74 return "JitterRNG: Error reading entropy";
83 BOTAN_ASSERT(
static_cast<size_t>(num_bytes) == buf.size(),
"JitterRNG produced the expected number of bytes");
91 m_jitter = std::make_unique<Jitter_RNG_Internal>();
94void Jitter_RNG::fill_bytes_with_input(std::span<uint8_t> out, std::span<const uint8_t> in) {
97 m_jitter->collect_into_buffer(out);
#define BOTAN_STATE_CHECK(expr)
#define BOTAN_ASSERT_NONNULL(ptr)
#define BOTAN_ASSERT(expr, assertion_made)