1#include "pch.h" 2 3#ifndef CRYPTOPP_IMPORTS 4 5#include "cbcmac.h" 6 7NAMESPACE_BEGIN(CryptoPP) 8 9void CBC_MAC_Base::UncheckedSetKey(const byte *key, unsigned int length, const NameValuePairs ¶ms) 10{ 11 AccessCipher().SetKey(key, length, params); 12 m_reg.CleanNew(AccessCipher().BlockSize()); 13 m_counter = 0; 14} 15 16void CBC_MAC_Base::Update(const byte *input, size_t length) 17{ 18 unsigned int blockSize = AccessCipher().BlockSize(); 19 20 while (m_counter && length) 21 { 22 m_reg[m_counter++] ^= *input++; 23 if (m_counter == blockSize) 24 ProcessBuf(); 25 length--; 26 } 27 28 if (length >= blockSize) 29 { 30 size_t leftOver = AccessCipher().AdvancedProcessBlocks(m_reg, input, m_reg, length, BlockTransformation::BT_DontIncrementInOutPointers|BlockTransformation::BT_XorInput); 31 input += (length - leftOver); 32 length = leftOver; 33 } 34 35 while (length--) 36 { 37 m_reg[m_counter++] ^= *input++; 38 if (m_counter == blockSize) 39 ProcessBuf(); 40 } 41} 42 43void CBC_MAC_Base::TruncatedFinal(byte *mac, size_t size) 44{ 45 ThrowIfInvalidTruncatedSize(size); 46 47 if (m_counter) 48 ProcessBuf(); 49 50 memcpy(mac, m_reg, size); 51 memset(m_reg, 0, AccessCipher().BlockSize()); 52} 53 54void CBC_MAC_Base::ProcessBuf() 55{ 56 AccessCipher().ProcessBlock(m_reg); 57 m_counter = 0; 58} 59 60NAMESPACE_END 61 62#endif 63