1// eax.cpp - written and placed in the public domain by Wei Dai 2 3#include "pch.h" 4#include "eax.h" 5 6NAMESPACE_BEGIN(CryptoPP) 7 8void EAX_Base::SetKeyWithoutResync(const byte *userKey, size_t keylength, const NameValuePairs ¶ms) 9{ 10 AccessMAC().SetKey(userKey, keylength, params); 11 m_buffer.New(2*AccessMAC().TagSize()); 12} 13 14void EAX_Base::Resync(const byte *iv, size_t len) 15{ 16 MessageAuthenticationCode &mac = AccessMAC(); 17 unsigned int blockSize = mac.TagSize(); 18 19 memset(m_buffer, 0, blockSize); 20 mac.Update(m_buffer, blockSize); 21 mac.CalculateDigest(m_buffer+blockSize, iv, len); 22 23 m_buffer[blockSize-1] = 1; 24 mac.Update(m_buffer, blockSize); 25 26 m_ctr.SetCipherWithIV(AccessMAC().AccessCipher(), m_buffer+blockSize, blockSize); 27} 28 29size_t EAX_Base::AuthenticateBlocks(const byte *data, size_t len) 30{ 31 AccessMAC().Update(data, len); 32 return 0; 33} 34 35void EAX_Base::AuthenticateLastHeaderBlock() 36{ 37 assert(m_bufferedDataLength == 0); 38 MessageAuthenticationCode &mac = AccessMAC(); 39 unsigned int blockSize = mac.TagSize(); 40 41 mac.Final(m_buffer); 42 xorbuf(m_buffer+blockSize, m_buffer, blockSize); 43 44 memset(m_buffer, 0, blockSize); 45 m_buffer[blockSize-1] = 2; 46 mac.Update(m_buffer, blockSize); 47} 48 49void EAX_Base::AuthenticateLastFooterBlock(byte *tag, size_t macSize) 50{ 51 assert(m_bufferedDataLength == 0); 52 MessageAuthenticationCode &mac = AccessMAC(); 53 unsigned int blockSize = mac.TagSize(); 54 55 mac.TruncatedFinal(m_buffer, macSize); 56 xorbuf(tag, m_buffer, m_buffer+blockSize, macSize); 57} 58 59NAMESPACE_END 60