00001
00002
00003 #include "pch.h"
00004
00005 #ifndef CRYPTOPP_IMPORTS
00006
00007 #include "hmac.h"
00008
00009 NAMESPACE_BEGIN(CryptoPP)
00010
00011 void HMAC_Base::UncheckedSetKey(const byte *userKey, unsigned int keylength)
00012 {
00013 AssertValidKeyLength(keylength);
00014
00015 Restart();
00016
00017 HashTransformation &hash = AccessHash();
00018 unsigned int blockSize = hash.BlockSize();
00019
00020 if (!blockSize)
00021 throw InvalidArgument("HMAC: can only be used with a block-based hash function");
00022
00023 if (keylength <= blockSize)
00024 memcpy(AccessIpad(), userKey, keylength);
00025 else
00026 {
00027 AccessHash().CalculateDigest(AccessIpad(), userKey, keylength);
00028 keylength = hash.DigestSize();
00029 }
00030
00031 assert(keylength <= blockSize);
00032 memset(AccessIpad()+keylength, 0, blockSize-keylength);
00033
00034 for (unsigned int i=0; i<blockSize; i++)
00035 {
00036 AccessOpad()[i] = AccessIpad()[i] ^ OPAD;
00037 AccessIpad()[i] ^= IPAD;
00038 }
00039 }
00040
00041 void HMAC_Base::KeyInnerHash()
00042 {
00043 assert(!m_innerHashKeyed);
00044 HashTransformation &hash = AccessHash();
00045 hash.Update(AccessIpad(), hash.BlockSize());
00046 m_innerHashKeyed = true;
00047 }
00048
00049 void HMAC_Base::Restart()
00050 {
00051 if (m_innerHashKeyed)
00052 {
00053 AccessHash().Restart();
00054 m_innerHashKeyed = false;
00055 }
00056 }
00057
00058 void HMAC_Base::Update(const byte *input, size_t length)
00059 {
00060 if (!m_innerHashKeyed)
00061 KeyInnerHash();
00062 AccessHash().Update(input, length);
00063 }
00064
00065 void HMAC_Base::TruncatedFinal(byte *mac, size_t size)
00066 {
00067 ThrowIfInvalidTruncatedSize(size);
00068
00069 HashTransformation &hash = AccessHash();
00070
00071 if (!m_innerHashKeyed)
00072 KeyInnerHash();
00073 hash.Final(AccessInnerHash());
00074
00075 hash.Update(AccessOpad(), hash.BlockSize());
00076 hash.Update(AccessInnerHash(), hash.DigestSize());
00077 hash.TruncatedFinal(mac, size);
00078
00079 m_innerHashKeyed = false;
00080 }
00081
00082 NAMESPACE_END
00083
00084 #endif