8#include <botan/hmac_drbg.h>
10#include <botan/exceptn.h>
12#include <botan/mem_ops.h>
13#include <botan/internal/fmt.h>
20size_t hmac_drbg_security_level(
size_t mac_output_length) {
28 if(mac_output_length < 32) {
29 return (mac_output_length - 4) * 8;
35void check_limits(
size_t reseed_interval,
size_t max_number_of_bytes_per_request) {
38 if(reseed_interval == 0 || reseed_interval >
static_cast<size_t>(1) << 24) {
42 if(max_number_of_bytes_per_request == 0 || max_number_of_bytes_per_request > 64 * 1024) {
56 m_mac(std::move(prf)),
58 m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
72 m_mac(std::move(prf)),
74 m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
87 m_mac(std::move(prf)),
89 m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
98 m_mac(std::move(prf)),
99 m_max_number_of_bytes_per_request(64 * 1024),
100 m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
107 m_max_number_of_bytes_per_request(64 * 1024),
108 m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
114 const size_t output_length = m_mac->output_length();
115 m_V.resize(output_length);
116 m_T.resize(output_length);
119 std::fill(m_V.begin(), m_V.end(), 0x01);
120 m_mac->set_key(std::vector<uint8_t>(m_V.size(), 0x00));
124 return fmt(
"HMAC_DRBG({})", m_mac->name());
131void HMAC_DRBG::generate_output(std::span<uint8_t> output, std::span<const uint8_t> input) {
138 while(!output.empty()) {
139 const size_t to_copy = std::min(output.size(), m_V.size());
142 copy_mem(output.data(), m_V.data(), to_copy);
144 output = output.subspan(to_copy);
154void HMAC_DRBG::update(std::span<const uint8_t> input) {
158 m_mac->update(input);
169 m_mac->update(input);
179 return m_security_level;
#define BOTAN_ASSERT_NOMSG(expr)
#define BOTAN_ASSERT_NONNULL(ptr)
std::string name() const override
size_t security_level() const override
size_t max_number_of_bytes_per_request() const override
HMAC_DRBG(std::unique_ptr< MessageAuthenticationCode > prf)
size_t reseed_interval() const
virtual void clear_state()=0
Stateful_RNG(RandomNumberGenerator &rng, Entropy_Sources &entropy_sources, size_t reseed_interval)
constexpr void copy_mem(T *out, const T *in, size_t n)
std::string fmt(std::string_view format, const T &... args)