Botan 3.0.0
Crypto and TLS for C&
rng.cpp
Go to the documentation of this file.
1/*
2* (C) 2016 Jack Lloyd
3*
4* Botan is released under the Simplified BSD License (see license.txt)
5*/
6
7#include <botan/rng.h>
8#include <botan/entropy_src.h>
9#include <botan/internal/loadstor.h>
10#include <botan/internal/os_utils.h>
11
12#if defined(BOTAN_HAS_SYSTEM_RNG)
13 #include <botan/system_rng.h>
14#endif
15
16#include <array>
17
18namespace Botan {
19
21 {
22 if(this->accepts_input())
23 {
24 constexpr auto s_hd_clk = sizeof(decltype(OS::get_high_resolution_clock()));
25 constexpr auto s_sys_ts = sizeof(decltype(OS::get_system_timestamp_ns()));
26 constexpr auto s_pid = sizeof(decltype(OS::get_process_id()));
27
28 std::array<uint8_t, s_hd_clk + s_sys_ts + s_pid> additional_input = {0};
29 auto s_additional_input = std::span(additional_input.begin(), additional_input.end());
30
31 store_le(OS::get_high_resolution_clock(), s_additional_input.data());
32 s_additional_input = s_additional_input.subspan(s_hd_clk);
33
34#if defined(BOTAN_HAS_SYSTEM_RNG)
36 system_rng.randomize(s_additional_input);
37#else
38 store_le(OS::get_system_timestamp_ns(), s_additional_input.data());
39 s_additional_input = s_additional_input.subspan(s_sys_ts);
40
41 store_le(OS::get_process_id(), s_additional_input.data());
42#endif
43
44 this->fill_bytes_with_input(output, additional_input);
45 }
46 else
47 {
48 this->fill_bytes_with_input(output, {});
49 }
50 }
51
53 size_t poll_bits,
54 std::chrono::milliseconds poll_timeout)
55 {
56 if(this->accepts_input())
57 {
58 return srcs.poll(*this, poll_bits, poll_timeout);
59 }
60 else
61 {
62 return 0;
63 }
64 }
65
67 {
68 if(this->accepts_input())
69 {
70 this->add_entropy(rng.random_vec(poll_bits / 8));
71 }
72 }
73
74}
size_t poll(RandomNumberGenerator &rng, size_t bits, std::chrono::milliseconds timeout)
void randomize(std::span< uint8_t > output)
Definition: rng.h:53
virtual bool accepts_input() const =0
void add_entropy(std::span< const uint8_t > input)
Definition: rng.h:77
virtual void reseed_from_rng(RandomNumberGenerator &rng, size_t poll_bits=BOTAN_RNG_RESEED_POLL_BITS)
Definition: rng.cpp:66
void randomize_with_ts_input(std::span< uint8_t > output)
Definition: rng.cpp:20
void random_vec(std::span< uint8_t > v)
Definition: rng.h:178
virtual void fill_bytes_with_input(std::span< uint8_t > output, std::span< const uint8_t > input)=0
virtual size_t reseed(Entropy_Sources &srcs, size_t poll_bits=BOTAN_RNG_RESEED_POLL_BITS, std::chrono::milliseconds poll_timeout=BOTAN_RNG_RESEED_DEFAULT_TIMEOUT)
Definition: rng.cpp:52
uint64_t BOTAN_TEST_API get_high_resolution_clock()
Definition: os_utils.cpp:268
uint64_t BOTAN_TEST_API get_system_timestamp_ns()
Definition: os_utils.cpp:320
uint32_t BOTAN_TEST_API get_process_id()
Definition: os_utils.cpp:111
Definition: alg_id.cpp:12
constexpr void store_le(uint16_t in, uint8_t out[2])
Definition: loadstor.h:465
RandomNumberGenerator & system_rng()
Definition: system_rng.cpp:376