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)
void copy_mem(T *out, const T *in, size_t n)
bool polling_goal_achieved() const
void randomize(byte buf[], size_t len)
size_t bits_collected() const
void add_entropy_source(EntropySource *es)
void zeroise(MemoryRegion< T > &vec)
virtual size_t output_length() const =0