8 #include <botan/hmac_rng.h>
9 #include <botan/get_byte.h>
10 #include <botan/time.h>
11 #include <botan/internal/xor_buf.h>
12 #include <botan/internal/stl_util.h>
19 void hmac_prf(MessageAuthenticationCode* prf,
20 MemoryRegion<byte>& K,
22 const std::string& label)
26 prf->update_be(counter);
48 hmac_prf(prf, K, counter,
"rng");
50 const size_t copied = std::min<size_t>(K.size(), length);
56 output_since_reseed += copied;
58 if(output_since_reseed >= BOTAN_RNG_MAX_OUTPUT_BEFORE_RESEED)
59 reseed(BOTAN_RNG_RESEED_POLL_BITS);
79 if(!entropy_sources.empty())
81 size_t poll_attempt = 0;
85 const size_t src_idx = poll_attempt % entropy_sources.size();
86 entropy_sources[src_idx]->poll(accum);
102 hmac_prf(prf, K, counter,
"rng");
105 hmac_prf(prf, K, counter,
"reseed");
110 prf->set_key(extractor->
final());
113 hmac_prf(prf, K, counter,
"xts");
119 output_since_reseed = 0;
133 extractor->
update(input, length);
134 reseed(BOTAN_RNG_RESEED_POLL_BITS);
142 entropy_sources.push_back(src);
154 output_since_reseed = 0;
163 return "HMAC_RNG(" + extractor->
name() +
"," + prf->name() +
")";
171 extractor(extractor_mac), prf(prf_mac)
176 extractor->
name() +
" and " +
180 K.resize(prf->output_length());
183 output_since_reseed = 0;
200 prf->set_key(prf_key);
211 extractor->
set_key(prf->process(
"Botan HMAC_RNG XTS"));
222 std::for_each(entropy_sources.begin(), entropy_sources.end(),
void add_entropy(const byte[], size_t)
u64bit get_nanoseconds_clock()
void reseed(size_t poll_bits)
std::invalid_argument Invalid_Argument
bool valid_keylength(size_t length) const
void set_key(const SymmetricKey &key)
HMAC_RNG(MessageAuthenticationCode *extractor, MessageAuthenticationCode *prf)
virtual std::string name() const =0
void update(const byte in[], size_t length)
bool polling_goal_achieved() const
size_t bits_collected() const
void copy_mem(T *out, const T *in, size_t n)
void randomize(byte buf[], size_t len)
void add_entropy_source(EntropySource *es)
void zeroise(MemoryRegion< T > &vec)
virtual size_t output_length() const =0