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 --- iterhash.h | 58 +++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 23 deletions(-) (limited to 'iterhash.h') diff --git a/iterhash.h b/iterhash.h index 362379e..0911fee 100644 --- a/iterhash.h +++ b/iterhash.h @@ -4,6 +4,7 @@ #include "cryptlib.h" #include "secblock.h" #include "misc.h" +#include "simple.h" NAMESPACE_BEGIN(CryptoPP) @@ -13,8 +14,10 @@ class CRYPTOPP_NO_VTABLE IteratedHashBase : public BASE public: typedef T HashWordType; - IteratedHashBase(unsigned int blockSize, unsigned int digestSize); - unsigned int DigestSize() const {return m_digest.size() * sizeof(T);}; + IteratedHashBase() : m_countHi(0), m_countLo(0) {} + void SetBlockSize(unsigned int blockSize) {m_data.resize(blockSize / sizeof(HashWordType));} + void SetStateSize(unsigned int stateSize) {m_digest.resize(stateSize / sizeof(HashWordType));} + unsigned int BlockSize() const {return m_data.size() * sizeof(T);} unsigned int OptimalBlockSize() const {return BlockSize();} unsigned int OptimalDataAlignment() const {return sizeof(T);} void Update(const byte *input, unsigned int length); @@ -29,7 +32,6 @@ protected: void PadLastBlock(unsigned int lastBlockSize, byte padFirst=0x80); virtual void Init() =0; virtual void HashBlock(const T *input) =0; - virtual unsigned int BlockSize() const =0; SecBlock m_data; // Data buffer SecBlock m_digest; // Message digest @@ -38,14 +40,19 @@ private: T m_countLo, m_countHi; }; +#ifdef WORD64_AVAILABLE +CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase; +CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase; +#endif + +CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase; +CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase; + //! . template class CRYPTOPP_NO_VTABLE IteratedHashBase2 : public IteratedHashBase { public: - IteratedHashBase2(unsigned int blockSize, unsigned int digestSize) - : IteratedHashBase(blockSize, digestSize) {} - typedef B ByteOrderClass; typedef typename IteratedHashBase::HashWordType HashWordType; @@ -58,32 +65,37 @@ public: protected: void HashBlock(const HashWordType *input); - - virtual void vTransform(const HashWordType *data) =0; + virtual void HashEndianCorrectedBlock(const HashWordType *data) =0; }; //! . -template -class CRYPTOPP_NO_VTABLE IteratedHash : public IteratedHashBase2 +template +class CRYPTOPP_NO_VTABLE IteratedHash : public IteratedHashBase2 { public: - enum {BLOCKSIZE = S}; - -private: + enum {BLOCKSIZE = T_BlockSize}; CRYPTOPP_COMPILE_ASSERT((BLOCKSIZE & (BLOCKSIZE - 1)) == 0); // blockSize is a power of 2 protected: - IteratedHash(unsigned int digestSize) : IteratedHashBase2(BLOCKSIZE, digestSize) {} - unsigned int BlockSize() const {return BLOCKSIZE;} + IteratedHash() {SetBlockSize(T_BlockSize);} }; -template -class CRYPTOPP_NO_VTABLE IteratedHashWithStaticTransform : public IteratedHash +template +class CRYPTOPP_NO_VTABLE IteratedHashWithStaticTransform + : public ClonableImpl, T_Transform> > { +public: + enum {DIGESTSIZE = T_DigestSize}; + unsigned int DigestSize() const {return DIGESTSIZE;}; + protected: - IteratedHashWithStaticTransform(unsigned int digestSize) : IteratedHash(digestSize) {} - void vTransform(const T *data) {M::Transform(m_digest, data);} - std::string AlgorithmName() const {return M::StaticAlgorithmName();} + IteratedHashWithStaticTransform() + { + SetStateSize(T_StateSize); + Init(); + } + void HashEndianCorrectedBlock(const T_HashWordType *data) {T_Transform::Transform(m_digest, data);} + void Init() {T_Transform::InitState(m_digest);} }; // ************************************************************* @@ -98,7 +110,7 @@ template void IteratedHashBase2::Trun m_data[m_data.size()-2] = B::ToEnum() ? GetBitCountHi() : GetBitCountLo(); m_data[m_data.size()-1] = B::ToEnum() ? GetBitCountLo() : GetBitCountHi(); - vTransform(m_data); + HashEndianCorrectedBlock(m_data); CorrectEndianess(m_digest, m_digest, DigestSize()); memcpy(hash, m_digest, size); @@ -108,11 +120,11 @@ template void IteratedHashBase2::Trun template void IteratedHashBase2::HashBlock(const HashWordType *input) { if (NativeByteOrderIs(B::ToEnum())) - vTransform(input); + HashEndianCorrectedBlock(input); else { ByteReverse(m_data.begin(), input, BlockSize()); - vTransform(m_data); + HashEndianCorrectedBlock(m_data); } } -- cgit v1.2.1