10 #include <botan/cmac.h>
11 #include <botan/ctr.h>
12 #include <botan/parsing.h>
21 secure_vector<uint8_t> eax_prf(uint8_t tag,
size_t block_size,
22 MessageAuthenticationCode& mac,
23 const uint8_t in[],
size_t length)
25 for(
size_t i = 0; i != block_size - 1; ++i)
30 mac.update(in, length);
40 m_tag_size(tag_size ? tag_size : cipher->block_size()),
42 m_ctr(new
CTR_BE(m_cipher->clone())),
43 m_cmac(new
CMAC(m_cipher->clone()))
45 if(m_tag_size < 8 || m_tag_size >
m_cmac->output_length())
81 void EAX_Mode::key_schedule(
const uint8_t key[],
size_t length)
87 m_ctr->set_key(key, length);
88 m_cmac->set_key(key, length);
99 void EAX_Mode::start_msg(
const uint8_t nonce[],
size_t nonce_len)
115 m_ctr->cipher(buf, buf, sz);
134 buffer += std::make_pair(data_mac.data(),
tag_size());
140 m_ctr->cipher(buf, buf, sz);
146 BOTAN_ASSERT(buffer.size() >= offset,
"Offset is sane");
147 const size_t sz = buffer.size() - offset;
148 uint8_t* buf = buffer.data() + offset;
152 const size_t remaining = sz -
tag_size();
156 m_cmac->update(buf, remaining);
157 m_ctr->cipher(buf, buf, remaining);
160 const uint8_t* included_tag = &buf[remaining];
175 buffer.resize(offset + remaining);
void xor_buf(T out[], const T in[], size_t length)
void finish(secure_vector< uint8_t > &final_block, size_t offset=0) override
Key_Length_Specification key_spec() const override
size_t process(uint8_t buf[], size_t size) override
bool same_mem(const T *p1, const T *p2, size_t n)
std::string name() const override
void update(secure_vector< uint8_t > &buffer, size_t offset=0)
secure_vector< uint8_t > m_ad_mac
secure_vector< uint8_t > m_nonce_mac
std::string to_string(const BER_Object &obj)
#define BOTAN_ASSERT(expr, assertion_made)
std::vector< T, secure_allocator< T >> secure_vector
bool valid_nonce_length(size_t) const override
EAX_Mode(BlockCipher *cipher, size_t tag_size)
size_t process(uint8_t buf[], size_t size) override
size_t block_size() const
std::unique_ptr< BlockCipher > m_cipher
size_t tag_size() const override
std::unique_ptr< MessageAuthenticationCode > m_cmac
size_t update_granularity() const override
void set_associated_data(const uint8_t ad[], size_t ad_len) override
std::unique_ptr< StreamCipher > m_ctr
void finish(secure_vector< uint8_t > &final_block, size_t offset=0) override