8#include <botan/hmac_drbg.h>
10#include <botan/assert.h>
11#include <botan/exceptn.h>
13#include <botan/mem_ops.h>
14#include <botan/internal/fmt.h>
21size_t hmac_drbg_security_level(
size_t mac_output_length) {
29 if(mac_output_length < 20) {
30 throw Invalid_Argument(
fmt(
"HMAC_DRBG MAC output length {} is too small", mac_output_length));
33 if(mac_output_length < 32) {
34 return (mac_output_length - 4) * 8;
40void check_limits(
size_t reseed_interval,
size_t max_number_of_bytes_per_request) {
43 if(reseed_interval == 0 || reseed_interval >
static_cast<size_t>(1) << 24) {
47 if(max_number_of_bytes_per_request == 0 || max_number_of_bytes_per_request > 64 * 1024) {
53std::unique_ptr<T> check_not_null(std::unique_ptr<T> obj) {
67 m_mac(check_not_null(std::move(prf))),
69 m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
81 m_mac(check_not_null(std::move(prf))),
83 m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
94 m_mac(check_not_null(std::move(prf))),
96 m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
103 m_mac(check_not_null(std::move(prf))),
104 m_max_number_of_bytes_per_request(64 * 1024),
105 m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
111 m_max_number_of_bytes_per_request(64 * 1024),
112 m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
118 const size_t output_length = m_mac->output_length();
119 m_V.resize(output_length);
120 m_T.resize(output_length);
123 std::fill(m_V.begin(), m_V.end(), 0x01);
124 m_mac->set_key(std::vector<uint8_t>(m_V.size(), 0x00));
128 return fmt(
"HMAC_DRBG({})", m_mac->name());
135void HMAC_DRBG::generate_output(std::span<uint8_t> output, std::span<const uint8_t> input) {
143 while(!output.empty()) {
144 const size_t to_copy = std::min(output.size(), m_V.size());
147 copy_mem(output.data(), m_V.data(), to_copy);
149 output = output.subspan(to_copy);
159void HMAC_DRBG::update(std::span<const uint8_t> input) {
163 m_mac->update(input);
174 m_mac->update(input);
184 return m_security_level;
#define BOTAN_ASSERT_NOMSG(expr)
#define BOTAN_ARG_CHECK(expr, msg)
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)
std::string fmt(std::string_view format, const T &... args)
constexpr void copy_mem(T *out, const T *in, size_t n)