8#include <botan/hmac_drbg.h> 
   10#include <botan/mem_ops.h> 
   11#include <botan/internal/fmt.h> 
   18size_t hmac_drbg_security_level(
size_t mac_output_length) {
 
   26   if(mac_output_length < 32) {
 
   27      return (mac_output_length - 4) * 8;
 
   33void check_limits(
size_t reseed_interval, 
size_t max_number_of_bytes_per_request) {
 
   36   if(reseed_interval == 0 || reseed_interval > 
static_cast<size_t>(1) << 24) {
 
   40   if(max_number_of_bytes_per_request == 0 || max_number_of_bytes_per_request > 64 * 1024) {
 
   52      m_mac(std::move(prf)),
 
   54      m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
 
 
   68      m_mac(std::move(prf)),
 
   70      m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
 
 
   83      m_mac(std::move(prf)),
 
   85      m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
 
 
   94      m_mac(std::move(prf)),
 
   95      m_max_number_of_bytes_per_request(64 * 1024),
 
   96      m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
 
 
  103      m_max_number_of_bytes_per_request(64 * 1024),
 
  104      m_security_level(hmac_drbg_security_level(m_mac->output_length())) {
 
 
  110      const size_t output_length = m_mac->output_length();
 
  111      m_V.resize(output_length);
 
  112      m_T.resize(output_length);
 
  115   std::fill(m_V.begin(), m_V.end(), 0x01);
 
  116   m_mac->set_key(std::vector<uint8_t>(m_V.size(), 0x00));
 
  120   return fmt(
"HMAC_DRBG({})", m_mac->name());
 
 
  127void HMAC_DRBG::generate_output(std::span<uint8_t> output, std::span<const uint8_t> input) {
 
  134   while(!output.empty()) {
 
  135      const size_t to_copy = std::min(output.size(), m_V.size());
 
  138      copy_mem(output.data(), m_V.data(), to_copy);
 
  140      output = output.subspan(to_copy);
 
  150void HMAC_DRBG::update(std::span<const uint8_t> input) {
 
  154      m_mac->update(input);
 
  165      m_mac->update(input);
 
  175   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)