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         while (length >= blockSize)
00029         {
00030                 xorbuf(m_reg, input, blockSize);
00031                 ProcessBuf();
00032                 input += blockSize;
00033                 length -= blockSize;
00034         }
00035 
00036         while (length--)
00037         {
00038                 m_reg[m_counter++] ^= *input++;
00039                 if (m_counter == blockSize)
00040                         ProcessBuf();
00041         }
00042 }
00043 
00044 void CBC_MAC_Base::TruncatedFinal(byte *mac, size_t size)
00045 {
00046         ThrowIfInvalidTruncatedSize(size);
00047 
00048         if (m_counter)
00049                 ProcessBuf();
00050 
00051         memcpy(mac, m_reg, size);
00052         memset(m_reg, 0, AccessCipher().BlockSize());
00053 }
00054 
00055 void CBC_MAC_Base::ProcessBuf()
00056 {
00057         AccessCipher().ProcessBlock(m_reg);
00058         m_counter = 0;
00059 }
00060 
00061 NAMESPACE_END
00062 
00063 #endif

Generated on Sat Dec 23 02:07:06 2006 for Crypto++ by  doxygen 1.5.1-p1