Botan 2.19.1
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/loadstor.h>
10#include <botan/internal/os_utils.h>
11
12#if defined(BOTAN_HAS_AUTO_SEEDING_RNG)
13 #include <botan/auto_rng.h>
14#endif
15
16namespace Botan {
17
18void RandomNumberGenerator::randomize_with_ts_input(uint8_t output[], size_t output_len)
19 {
20 if(this->accepts_input())
21 {
22 /*
23 Form additional input which is provided to the PRNG implementation
24 to paramaterize the KDF output.
25 */
26 uint8_t additional_input[16] = { 0 };
27 store_le(OS::get_system_timestamp_ns(), additional_input);
28 store_le(OS::get_high_resolution_clock(), additional_input + 8);
29
30 this->randomize_with_input(output, output_len, additional_input, sizeof(additional_input));
31 }
32 else
33 {
34 this->randomize(output, output_len);
35 }
36 }
37
38void RandomNumberGenerator::randomize_with_input(uint8_t output[], size_t output_len,
39 const uint8_t input[], size_t input_len)
40 {
41 this->add_entropy(input, input_len);
42 this->randomize(output, output_len);
43 }
44
46 size_t poll_bits,
47 std::chrono::milliseconds poll_timeout)
48 {
49 if(this->accepts_input())
50 {
51 return srcs.poll(*this, poll_bits, poll_timeout);
52 }
53 else
54 {
55 return 0;
56 }
57 }
58
60 {
61 if(this->accepts_input())
62 {
63 secure_vector<uint8_t> buf(poll_bits / 8);
64 rng.randomize(buf.data(), buf.size());
65 this->add_entropy(buf.data(), buf.size());
66 }
67 }
68
70 {
71#if defined(BOTAN_HAS_AUTO_SEEDING_RNG)
72 return new AutoSeeded_RNG;
73#else
74 throw Not_Implemented("make_rng failed, no AutoSeeded_RNG in this build");
75#endif
76 }
77
78#if defined(BOTAN_TARGET_OS_HAS_THREADS)
79
80#if defined(BOTAN_HAS_AUTO_SEEDING_RNG)
81Serialized_RNG::Serialized_RNG() : m_rng(new AutoSeeded_RNG) {}
82#else
83Serialized_RNG::Serialized_RNG()
84 {
85 throw Not_Implemented("Serialized_RNG default constructor failed: AutoSeeded_RNG disabled in build");
86 }
87#endif
88
89#endif
90
91}
size_t poll(RandomNumberGenerator &rng, size_t bits, std::chrono::milliseconds timeout)
virtual bool accepts_input() const =0
virtual void reseed_from_rng(RandomNumberGenerator &rng, size_t poll_bits=BOTAN_RNG_RESEED_POLL_BITS)
Definition: rng.cpp:59
virtual void randomize_with_ts_input(uint8_t output[], size_t output_len)
Definition: rng.cpp:18
virtual void randomize(uint8_t output[], size_t length)=0
static RandomNumberGenerator * make_rng()
Definition: rng.cpp:69
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:45
virtual void add_entropy(const uint8_t input[], size_t length)=0
virtual void randomize_with_input(uint8_t output[], size_t output_len, const uint8_t input[], size_t input_len)
Definition: rng.cpp:38
uint64_t BOTAN_TEST_API get_high_resolution_clock()
Definition: os_utils.cpp:241
uint64_t BOTAN_TEST_API get_system_timestamp_ns()
Definition: os_utils.cpp:293
Definition: alg_id.cpp:13
void store_le(uint16_t in, uint8_t out[2])
Definition: loadstor.h:454
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:65