Crypto++
cbcmac.cpp
00001 #include "pch.h"
00002 
00003 #ifndef CRYPTOPP_IMPORTS
00004 
00005 #include "cbcmac.h"
00006 
00007 NAMESPACE_BEGIN(CryptoPP)
00008 
00009 void CBC_MAC_Base::UncheckedSetKey(const byte *key, unsigned int length, const NameValuePairs &params)
00010 {
00011         AccessCipher().SetKey(key, length, params);
00012         m_reg.CleanNew(AccessCipher().BlockSize());
00013         m_counter = 0;
00014 }
00015 
00016 void CBC_MAC_Base::Update(const byte *input, size_t length)
00017 {
00018         unsigned int blockSize = AccessCipher().BlockSize();
00019 
00020         while (m_counter && length)
00021         {
00022                 m_reg[m_counter++] ^= *input++;
00023                 if (m_counter == blockSize)
00024                         ProcessBuf();
00025                 length--;
00026         }
00027 
00028         if (length >= blockSize)
00029         {
00030                 size_t leftOver = AccessCipher().AdvancedProcessBlocks(m_reg, input, m_reg, length, BlockTransformation::BT_DontIncrementInOutPointers|BlockTransformation::BT_XorInput);
00031                 input += (length - leftOver);
00032                 length = leftOver;
00033         }
00034 
00035         while (length--)
00036         {
00037                 m_reg[m_counter++] ^= *input++;
00038                 if (m_counter == blockSize)
00039                         ProcessBuf();
00040         }
00041 }
00042 
00043 void CBC_MAC_Base::TruncatedFinal(byte *mac, size_t size)
00044 {
00045         ThrowIfInvalidTruncatedSize(size);
00046 
00047         if (m_counter)
00048                 ProcessBuf();
00049 
00050         memcpy(mac, m_reg, size);
00051         memset(m_reg, 0, AccessCipher().BlockSize());
00052 }
00053 
00054 void CBC_MAC_Base::ProcessBuf()
00055 {
00056         AccessCipher().ProcessBlock(m_reg);
00057         m_counter = 0;
00058 }
00059 
00060 NAMESPACE_END
00061 
00062 #endif