diff options
author | Jeffrey Walton <noloader@gmail.com> | 2015-11-05 01:59:46 -0500 |
---|---|---|
committer | Jeffrey Walton <noloader@gmail.com> | 2015-11-05 01:59:46 -0500 |
commit | 48809d4e85c125814425c621d8d0d89f95405924 (patch) | |
tree | 1010fd16c4b1199f3d27dd726dda241a2bd29f83 /hmac.cpp | |
parent | 025337a94aceb75d188149db70c2094673772816 (diff) | |
download | cryptopp-git-48809d4e85c125814425c621d8d0d89f95405924.tar.gz |
CRYPTOPP 5.6.3 RC6 checkin
Diffstat (limited to 'hmac.cpp')
-rw-r--r-- | hmac.cpp | 173 |
1 files changed, 86 insertions, 87 deletions
@@ -1,87 +1,86 @@ -// hmac.cpp - written and placed in the public domain by Wei Dai - -#include "pch.h" - -#ifndef CRYPTOPP_IMPORTS - -#include "hmac.h" -#include "trap.h" - -NAMESPACE_BEGIN(CryptoPP) - -void HMAC_Base::UncheckedSetKey(const byte *userKey, unsigned int keylength, const NameValuePairs &) -{ - AssertValidKeyLength(keylength); - - Restart(); - - HashTransformation &hash = AccessHash(); - unsigned int blockSize = hash.BlockSize(); - - if (!blockSize) - throw InvalidArgument("HMAC: can only be used with a block-based hash function"); - - m_buf.resize(2*AccessHash().BlockSize() + AccessHash().DigestSize()); - - if (keylength <= blockSize) - memcpy(AccessIpad(), userKey, keylength); - else - { - AccessHash().CalculateDigest(AccessIpad(), userKey, keylength); - keylength = hash.DigestSize(); - } - - CRYPTOPP_ASSERT(keylength <= blockSize); - memset(AccessIpad()+keylength, 0, blockSize-keylength); - - for (unsigned int i=0; i<blockSize; i++) - { - AccessOpad()[i] = AccessIpad()[i] ^ 0x5c; - AccessIpad()[i] ^= 0x36; - } -} - -void HMAC_Base::KeyInnerHash() -{ - CRYPTOPP_ASSERT(!m_innerHashKeyed); - HashTransformation &hash = AccessHash(); - hash.Update(AccessIpad(), hash.BlockSize()); - m_innerHashKeyed = true; -} - -void HMAC_Base::Restart() -{ - if (m_innerHashKeyed) - { - AccessHash().Restart(); - m_innerHashKeyed = false; - } -} - -void HMAC_Base::Update(const byte *input, size_t length) -{ - if (!m_innerHashKeyed) - KeyInnerHash(); - AccessHash().Update(input, length); -} - -void HMAC_Base::TruncatedFinal(byte *mac, size_t size) -{ - ThrowIfInvalidTruncatedSize(size); - - HashTransformation &hash = AccessHash(); - - if (!m_innerHashKeyed) - KeyInnerHash(); - hash.Final(AccessInnerHash()); - - hash.Update(AccessOpad(), hash.BlockSize()); - hash.Update(AccessInnerHash(), hash.DigestSize()); - hash.TruncatedFinal(mac, size); - - m_innerHashKeyed = false; -} - -NAMESPACE_END - -#endif +// hmac.cpp - written and placed in the public domain by Wei Dai
+
+#include "pch.h"
+
+#ifndef CRYPTOPP_IMPORTS
+
+#include "hmac.h"
+
+NAMESPACE_BEGIN(CryptoPP)
+
+void HMAC_Base::UncheckedSetKey(const byte *userKey, unsigned int keylength, const NameValuePairs &)
+{
+ AssertValidKeyLength(keylength);
+
+ Restart();
+
+ HashTransformation &hash = AccessHash();
+ unsigned int blockSize = hash.BlockSize();
+
+ if (!blockSize)
+ throw InvalidArgument("HMAC: can only be used with a block-based hash function");
+
+ m_buf.resize(2*AccessHash().BlockSize() + AccessHash().DigestSize());
+
+ if (keylength <= blockSize)
+ memcpy(AccessIpad(), userKey, keylength);
+ else
+ {
+ AccessHash().CalculateDigest(AccessIpad(), userKey, keylength);
+ keylength = hash.DigestSize();
+ }
+
+ assert(keylength <= blockSize);
+ memset(AccessIpad()+keylength, 0, blockSize-keylength);
+
+ for (unsigned int i=0; i<blockSize; i++)
+ {
+ AccessOpad()[i] = AccessIpad()[i] ^ 0x5c;
+ AccessIpad()[i] ^= 0x36;
+ }
+}
+
+void HMAC_Base::KeyInnerHash()
+{
+ assert(!m_innerHashKeyed);
+ HashTransformation &hash = AccessHash();
+ hash.Update(AccessIpad(), hash.BlockSize());
+ m_innerHashKeyed = true;
+}
+
+void HMAC_Base::Restart()
+{
+ if (m_innerHashKeyed)
+ {
+ AccessHash().Restart();
+ m_innerHashKeyed = false;
+ }
+}
+
+void HMAC_Base::Update(const byte *input, size_t length)
+{
+ if (!m_innerHashKeyed)
+ KeyInnerHash();
+ AccessHash().Update(input, length);
+}
+
+void HMAC_Base::TruncatedFinal(byte *mac, size_t size)
+{
+ ThrowIfInvalidTruncatedSize(size);
+
+ HashTransformation &hash = AccessHash();
+
+ if (!m_innerHashKeyed)
+ KeyInnerHash();
+ hash.Final(AccessInnerHash());
+
+ hash.Update(AccessOpad(), hash.BlockSize());
+ hash.Update(AccessInnerHash(), hash.DigestSize());
+ hash.TruncatedFinal(mac, size);
+
+ m_innerHashKeyed = false;
+}
+
+NAMESPACE_END
+
+#endif
|