8 #include <botan/hmac_drbg.h>
15 void check_limits(
size_t reseed_interval,
16 size_t max_number_of_bytes_per_request)
20 if(reseed_interval == 0 || reseed_interval > static_cast<size_t>(1) << 24)
22 throw Invalid_Argument(
"Invalid value for reseed_interval");
25 if(max_number_of_bytes_per_request == 0 || max_number_of_bytes_per_request > 64 * 1024)
27 throw Invalid_Argument(
"Invalid value for max_number_of_bytes_per_request");
35 size_t reseed_interval,
36 size_t max_number_of_bytes_per_request) :
38 m_mac(
std::move(prf)),
39 m_max_number_of_bytes_per_request(max_number_of_bytes_per_request)
43 check_limits(reseed_interval, max_number_of_bytes_per_request);
51 size_t reseed_interval,
52 size_t max_number_of_bytes_per_request) :
53 Stateful_RNG(underlying_rng, entropy_sources, reseed_interval),
54 m_mac(
std::move(prf)),
55 m_max_number_of_bytes_per_request(max_number_of_bytes_per_request)
59 check_limits(reseed_interval, max_number_of_bytes_per_request);
66 size_t reseed_interval,
67 size_t max_number_of_bytes_per_request) :
69 m_mac(
std::move(prf)),
70 m_max_number_of_bytes_per_request(max_number_of_bytes_per_request)
74 check_limits(reseed_interval, max_number_of_bytes_per_request);
81 m_mac(
std::move(prf)),
82 m_max_number_of_bytes_per_request(64*1024)
92 const size_t output_length = m_mac->output_length();
94 m_V.resize(output_length);
95 for(
size_t i = 0; i != m_V.size(); ++i)
97 m_mac->set_key(std::vector<uint8_t>(output_length, 0x00));
102 return "HMAC_DRBG(" + m_mac->name() +
")";
115 const uint8_t input[],
size_t input_len)
117 while(output_len > 0)
119 size_t this_req = std::min(m_max_number_of_bytes_per_request, output_len);
120 output_len -= this_req;
126 update(input, input_len);
131 const size_t to_copy = std::min(this_req, m_V.size());
132 m_mac->update(m_V.data(), m_V.size());
133 m_mac->final(m_V.data());
134 copy_mem(output, m_V.data(), to_copy);
140 update(input, input_len);
149 void HMAC_DRBG::update(
const uint8_t input[],
size_t input_len)
154 m_mac->update(input, input_len);
155 m_mac->final(
T.data());
158 m_mac->update(m_V.data(), m_V.size());
159 m_mac->final(m_V.data());
165 m_mac->update(input, input_len);
166 m_mac->final(
T.data());
169 m_mac->update(m_V.data(), m_V.size());
170 m_mac->final(m_V.data());
176 update(input, input_len);
192 const size_t output_length = m_mac->output_length();
194 if(output_length < 32)
196 return (output_length - 4) * 8;
void add_entropy(const uint8_t input[], size_t input_len) override
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)
std::vector< T, secure_allocator< T >> secure_vector
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)
void reset_reseed_counter()