9 #include <botan/hmac.h>
16 void HMAC::add_data(
const uint8_t input[],
size_t length)
19 m_hash->update(input, length);
25 void HMAC::final_result(uint8_t mac[])
29 m_hash->update(m_okey);
30 m_hash->update(mac, m_hash_output_length);
32 m_hash->update(m_ikey);
43 return m_hash_output_length;
49 void HMAC::key_schedule(
const uint8_t key[],
size_t length)
51 const uint8_t ipad = 0x36;
52 const uint8_t opad = 0x5C;
56 m_ikey.resize(m_hash_block_size);
57 set_mem(m_ikey.data(), m_hash_block_size, ipad);
59 m_okey.resize(m_hash_block_size);
60 set_mem(m_okey.data(), m_hash_block_size, opad);
62 if(length > m_hash_block_size)
64 m_hash->update(key, length);
65 m_hash->final(m_ikey.data());
67 xor_buf(m_okey.data(), m_ikey.data(), m_hash_output_length);
69 for(
size_t i = 0; i != m_hash_output_length; ++i)
80 m_hash->update(m_ikey);
98 return "HMAC(" + m_hash->name() +
")";
106 return new HMAC(m_hash->clone());
114 m_hash_output_length(
m_hash->output_length()),
115 m_hash_block_size(
m_hash->hash_block_size())
118 "HMAC is not compatible with this hash function");
Key_Length_Specification key_spec() const override
MessageAuthenticationCode * clone() const override
void zap(std::vector< T, Alloc > &vec)
void set_mem(uint8_t *ptr, size_t n, uint8_t val)
size_t output_length() const override
void xor_buf(uint8_t out[], const uint8_t in[], size_t length)
#define BOTAN_ARG_CHECK(expr, msg)
void verify_key_set(bool cond) const
std::string name() const override
std::unique_ptr< HashFunction > m_hash