8 #include <botan/hmac_drbg.h>
15 size_t reseed_interval,
16 size_t max_number_of_bytes_per_request) :
19 m_max_number_of_bytes_per_request(max_number_of_bytes_per_request)
23 if(m_max_number_of_bytes_per_request == 0 || m_max_number_of_bytes_per_request > 64 * 1024)
34 size_t reseed_interval,
35 size_t max_number_of_bytes_per_request ) :
36 Stateful_RNG(underlying_rng, entropy_sources, reseed_interval),
38 m_max_number_of_bytes_per_request(max_number_of_bytes_per_request)
42 if(m_max_number_of_bytes_per_request == 0 || m_max_number_of_bytes_per_request > 64 * 1024)
52 size_t reseed_interval,
53 size_t max_number_of_bytes_per_request) :
56 m_max_number_of_bytes_per_request(max_number_of_bytes_per_request)
60 if(m_max_number_of_bytes_per_request == 0 || m_max_number_of_bytes_per_request > 64 * 1024)
71 m_max_number_of_bytes_per_request(64*1024)
81 m_V.resize(m_mac->output_length());
82 for(
size_t i = 0; i != m_V.size(); ++i)
84 m_mac->set_key(std::vector<uint8_t>(m_mac->output_length(), 0x00));
89 return "HMAC_DRBG(" + m_mac->name() +
")";
102 const uint8_t input[],
size_t input_len)
104 while(output_len > 0)
106 size_t this_req =
std::min(m_max_number_of_bytes_per_request, output_len);
107 output_len -= this_req;
113 update(input, input_len);
118 const size_t to_copy =
std::min(this_req, m_V.size());
119 m_mac->update(m_V.data(), m_V.size());
120 m_mac->final(m_V.data());
121 copy_mem(output, m_V.data(), to_copy);
127 update(input, input_len);
136 void HMAC_DRBG::update(
const uint8_t input[],
size_t input_len)
140 m_mac->update(input, input_len);
141 m_mac->set_key(m_mac->final());
143 m_mac->update(m_V.data(), m_V.size());
144 m_mac->final(m_V.data());
150 m_mac->update(input, input_len);
151 m_mac->set_key(m_mac->final());
153 m_mac->update(m_V.data(), m_V.size());
154 m_mac->final(m_V.data());
160 update(input, input_len);
175 if(m_mac->output_length() < 32)
177 return (m_mac->output_length() - 4) * 8;
void add_entropy(const uint8_t input[], size_t input_len) override
std::unique_ptr< MessageAuthenticationCode > m_mac
std::string name() const override
void randomize_with_input(uint8_t output[], size_t output_len, const uint8_t input[], size_t input_len) override
HMAC_DRBG(std::unique_ptr< MessageAuthenticationCode > prf)
size_t security_level() const override
#define BOTAN_ASSERT_NONNULL(ptr)
void randomize(uint8_t output[], size_t output_len) override
void copy_mem(T *out, const T *in, size_t n)