10#include <botan/internal/ct_utils.h>
17void HMAC::add_data(
const uint8_t input[],
size_t length)
20 m_hash->update(input, length);
26void HMAC::final_result(uint8_t mac[])
30 m_hash->update(m_okey);
31 m_hash->update(mac, m_hash_output_length);
33 m_hash->update(m_ikey);
44 return m_hash_output_length;
50void HMAC::key_schedule(
const uint8_t key[],
size_t length)
52 const uint8_t ipad = 0x36;
53 const uint8_t opad = 0x5C;
57 m_ikey.resize(m_hash_block_size);
58 m_okey.resize(m_hash_block_size);
80 if(length > m_hash_block_size)
82 m_hash->update(key, length);
83 m_hash->final(m_ikey.data());
87 for(
size_t i = 0, i_mod_length = 0; i != m_hash_block_size; ++i)
94 i_mod_length = needs_reduction.select(0, i_mod_length);
95 const uint8_t kb = key[i_mod_length];
98 m_ikey[i] =
static_cast<uint8_t
>(in_range.if_set_return(kb));
103 for(
size_t i = 0; i != m_hash_block_size; ++i)
106 m_okey[i] = m_ikey[i] ^ ipad ^ opad;
109 m_hash->update(m_ikey);
127 return "HMAC(" + m_hash->name() +
")";
135 return new HMAC(m_hash->clone());
143 m_hash_output_length(m_hash->output_length()),
144 m_hash_block_size(m_hash->hash_block_size())
147 "HMAC is not compatible with this hash function");
#define BOTAN_ARG_CHECK(expr, msg)
static Mask< T > is_lt(T x, T y)
static Mask< T > is_lte(T x, T y)
size_t output_length() const override
std::string name() const override
MessageAuthenticationCode * clone() const override
Key_Length_Specification key_spec() const override
void verify_key_set(bool cond) const
void zap(std::vector< T, Alloc > &vec)
void clear_mem(T *ptr, size_t n)