From 572fe07633123ce38abf28c6426356e37aef3a99 Mon Sep 17 00:00:00 2001 From: weidai Date: Fri, 4 Jul 2003 00:17:37 +0000 Subject: create DLL version, fix GetNextIV() bug in CTR and OFB modes git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@87 57ff6487-cd31-0410-9ec3-f628ee90f5f0 --- hmac.h | 101 +++++++++++++++-------------------------------------------------- 1 file changed, 23 insertions(+), 78 deletions(-) (limited to 'hmac.h') diff --git a/hmac.h b/hmac.h index 44a5a8a..ff834aa 100644 --- a/hmac.h +++ b/hmac.h @@ -8,111 +8,56 @@ NAMESPACE_BEGIN(CryptoPP) -template -class CRYPTOPP_NO_VTABLE HMAC_Base : public VariableKeyLength<16, 0, UINT_MAX>, public MessageAuthenticationCode +class CRYPTOPP_DLL CRYPTOPP_NO_VTABLE HMAC_Base : public VariableKeyLength<16, 0, UINT_MAX>, public MessageAuthenticationCode { public: - static std::string StaticAlgorithmName() {return std::string("HMAC(") + T::StaticAlgorithmName() + ")";} - - // put enums here for Metrowerks 4 - enum {DIGESTSIZE=T::DIGESTSIZE, BLOCKSIZE=T::BLOCKSIZE}; - HMAC_Base() : m_innerHashKeyed(false) {} void UncheckedSetKey(const byte *userKey, unsigned int keylength); void Restart(); void Update(const byte *input, unsigned int length); void TruncatedFinal(byte *mac, unsigned int size); - unsigned int DigestSize() const {return DIGESTSIZE;} + unsigned int OptimalBlockSize() const {return const_cast(this)->AccessHash().OptimalBlockSize();} + unsigned int DigestSize() const {return const_cast(this)->AccessHash().DigestSize();} + +protected: + virtual HashTransformation & AccessHash() =0; + virtual byte * AccessIpad() =0; + virtual byte * AccessOpad() =0; + virtual byte * AccessInnerHash() =0; private: void KeyInnerHash(); enum {IPAD=0x36, OPAD=0x5c}; - FixedSizeSecBlock k_ipad, k_opad; - FixedSizeSecBlock m_innerHash; - T m_hash; bool m_innerHashKeyed; }; //! HMAC /*! HMAC(K, text) = H(K XOR opad, H(K XOR ipad, text)) */ template -class HMAC : public MessageAuthenticationCodeTemplate > +class HMAC : public MessageAuthenticationCodeImpl > { public: + enum {DIGESTSIZE=T::DIGESTSIZE, BLOCKSIZE=T::BLOCKSIZE}; + HMAC() {} - HMAC(const byte *key, unsigned int length=HMAC_Base::DEFAULT_KEYLENGTH) + HMAC(const byte *key, unsigned int length=HMAC_Base::DEFAULT_KEYLENGTH) {SetKey(key, length);} -}; - -template -void HMAC_Base::UncheckedSetKey(const byte *userKey, unsigned int keylength) -{ - AssertValidKeyLength(keylength); - - Restart(); - - if (keylength <= T::BLOCKSIZE) - memcpy(k_ipad, userKey, keylength); - else - { - m_hash.CalculateDigest(k_ipad, userKey, keylength); - keylength = T::DIGESTSIZE; - } - - assert(keylength <= T::BLOCKSIZE); - memset(k_ipad+keylength, 0, T::BLOCKSIZE-keylength); - - for (unsigned int i=0; i -void HMAC_Base::KeyInnerHash() -{ - assert(!m_innerHashKeyed); - m_hash.Update(k_ipad, T::BLOCKSIZE); - m_innerHashKeyed = true; -} - -template -void HMAC_Base::Restart() -{ - if (m_innerHashKeyed) - { - m_hash.Restart(); - m_innerHashKeyed = false; - } -} - -template -void HMAC_Base::Update(const byte *input, unsigned int length) -{ - if (!m_innerHashKeyed) - KeyInnerHash(); - m_hash.Update(input, length); -} - -template -void HMAC_Base::TruncatedFinal(byte *mac, unsigned int size) -{ - ThrowIfInvalidTruncatedSize(size); - - if (!m_innerHashKeyed) - KeyInnerHash(); - m_hash.Final(m_innerHash); + static std::string StaticAlgorithmName() {return std::string("HMAC(") + T::StaticAlgorithmName() + ")";} - m_hash.Update(k_opad, T::BLOCKSIZE); - m_hash.Update(m_innerHash, DIGESTSIZE); - m_hash.TruncatedFinal(mac, size); +private: + HashTransformation & AccessHash() {return m_hash;} + byte * AccessIpad() {return m_ipad;} + byte * AccessOpad() {return m_opad;} + byte * AccessInnerHash() {return m_innerHash;} - m_innerHashKeyed = false; -} + FixedSizeSecBlock m_ipad, m_opad; + FixedSizeSecBlock m_innerHash; + T m_hash; +}; NAMESPACE_END -- cgit v1.2.1