/*************************************************
* CBC-MAC Source File *
* (C) 1999-2007 The Botan Project *
*************************************************/
#include <botan/cbc_mac.h>
#include <botan/lookup.h>
#include <botan/bit_ops.h>
#include <algorithm>
namespace Botan {
/*************************************************
* Update an CBC-MAC Calculation *
*************************************************/
void CBC_MAC::add_data(const byte input[], u32bit length)
{
u32bit xored = std::min(OUTPUT_LENGTH - position, length);
xor_buf(state + position, input, xored);
position += xored;
if(position < OUTPUT_LENGTH)
return;
e->encrypt(state);
input += xored;
length -= xored;
while(length >= OUTPUT_LENGTH)
{
xor_buf(state, input, OUTPUT_LENGTH);
e->encrypt(state);
input += OUTPUT_LENGTH;
length -= OUTPUT_LENGTH;
}
xor_buf(state, input, length);
position = length;
}
/*************************************************
* Finalize an CBC-MAC Calculation *
*************************************************/
void CBC_MAC::final_result(byte mac[])
{
if(position)
e->encrypt(state);
copy_mem(mac, state.begin(), state.size());
state.clear();
position = 0;
}
/*************************************************
* CBC-MAC Key Schedule *
*************************************************/
void CBC_MAC::key(const byte key[], u32bit length)
{
e->set_key(key, length);
}
/*************************************************
* Clear memory of sensitive data *
*************************************************/
void CBC_MAC::clear() throw()
{
e->clear();
state.clear();
position = 0;
}
/*************************************************
* Return the name of this type *
*************************************************/
std::string CBC_MAC::name() const
{
return "CBC-MAC(" + e->name() + ")";
}
/*************************************************
* Return a clone of this object *
*************************************************/
MessageAuthenticationCode* CBC_MAC::clone() const
{
return new CBC_MAC(e->name());
}
/*************************************************
* CBC-MAC Constructor *
*************************************************/
CBC_MAC::CBC_MAC(const std::string& cipher) :
MessageAuthenticationCode(block_size_of(cipher),
min_keylength_of(cipher),
max_keylength_of(cipher),
keylength_multiple_of(cipher)),
state(block_size_of(cipher))
{
e = get_block_cipher(cipher);
position = 0;
}
/*************************************************
* CBC-MAC Destructor *
*************************************************/
CBC_MAC::~CBC_MAC()
{
delete e;
}
}
syntax highlighted by Code2HTML, v. 0.9.1