8#include <botan/jitter_rng.h>
10#include <botan/assert.h>
11#include <botan/exceptn.h>
13#include <jitterentropy.h>
17struct Jitter_RNG_Internal {
18 Jitter_RNG_Internal();
19 ~Jitter_RNG_Internal();
20 void collect_into_buffer(std::span<uint8_t> buf);
23 rand_data* m_rand_data;
26Jitter_RNG_Internal::Jitter_RNG_Internal() {
27 constexpr unsigned int oversampling_rate = 0;
28 constexpr unsigned int flags = JENT_FORCE_FIPS;
31 static int result = jent_entropy_init_ex(oversampling_rate, flags);
38 m_rand_data = jent_entropy_collector_alloc(oversampling_rate, flags);
39 if(m_rand_data ==
nullptr) {
40 throw Internal_Error(
"Jitter_RNG_Internal collector allocation failed");
44Jitter_RNG_Internal::~Jitter_RNG_Internal() {
46 jent_entropy_collector_free(m_rand_data);
47 m_rand_data =
nullptr;
51void Jitter_RNG_Internal::collect_into_buffer(std::span<uint8_t> buf) {
58 ssize_t num_bytes = jent_read_entropy_safe(&m_rand_data,
reinterpret_cast<char*
>(buf.data()), buf.size());
60 const auto error_msg = [&]() -> std::string_view {
63 return "JitterRNG: Uninitilialized";
65 return "JitterRNG: SP800-90B repetition count online health test failed";
67 return "JitterRNG: SP800-90B adaptive proportion online health test failed";
69 return "JitterRNG: Internal timer generator could not be initialized";
71 return "JitterRNG: LAG predictor health test failed";
73 return "JitterRNG: Repetitive count test (RCT) failed permanently";
75 return "JitterRNG: Adaptive proportion test (APT) failed permanently";
77 return "JitterRNG: LAG prediction test failed permanently";
79 return "JitterRNG: Error reading entropy";
88 BOTAN_ASSERT(
static_cast<size_t>(num_bytes) == buf.size(),
"JitterRNG produced the expected number of bytes");
96 m_jitter = std::make_unique<Jitter_RNG_Internal>();
99void Jitter_RNG::fill_bytes_with_input(std::span<uint8_t> out, std::span<const uint8_t> in) {
102 m_jitter->collect_into_buffer(out);
#define BOTAN_STATE_CHECK(expr)
#define BOTAN_ASSERT(expr, assertion_made)