diff --git a/external/ours/library/crypto/src/shared/original/iterhash.cpp b/external/ours/library/crypto/src/shared/original/iterhash.cpp index 83b9ee16..1730ce94 100644 --- a/external/ours/library/crypto/src/shared/original/iterhash.cpp +++ b/external/ours/library/crypto/src/shared/original/iterhash.cpp @@ -5,106 +5,6 @@ NAMESPACE_BEGIN(CryptoPP) -template -IteratedHashBase::IteratedHashBase(unsigned int blockSize, unsigned int digestSize) - : blockSize(blockSize), countLo(0), countHi(0) - , data(blockSize/sizeof(T)), digest(digestSize/sizeof(T)) -{ -} - -template void IteratedHashBase::Update(const byte *input, unsigned int len) -{ - HashWordType tmp = countLo; - if ((countLo = tmp + ((word32)len << 3)) < tmp) - countHi++; // Carry from low to high - - int rshift = (8*sizeof(HashWordType)-3); - if (rshift<32) - { - countHi += len >> rshift; - } - - assert((blockSize & (blockSize-1)) == 0); // blockSize is a power of 2 - unsigned int num = (unsigned int)(tmp >> 3) & (blockSize-1); - - if (num != 0) - { - if ((num+len) >= blockSize) - { - memcpy((byte *)data.ptr+num, input, blockSize-num); - HashBlock(data); - input += (blockSize-num); - len-=(blockSize - num); - num=0; - // drop through and do the rest - } - else - { - memcpy((byte *)data.ptr+num, input, len); - return; - } - } - - // we now can process the input data in blocks of blockSize - // chars and save the leftovers to this->data. - if (len >= blockSize) - { - if (IsAligned(input)) - { - unsigned int leftOver = HashMultipleBlocks((T *)input, len); - input += (len - leftOver); - len = leftOver; - } - else - do - { // copy input first if it's not aligned correctly - memcpy(data, input, blockSize); - HashBlock(data); - input+=blockSize; - len-=blockSize; - } while (len >= blockSize); - } - - memcpy(data, input, len); -} - -template unsigned int IteratedHashBase::HashMultipleBlocks(const T *input, unsigned int length) -{ - do - { - HashBlock(input); - input += blockSize/sizeof(T); - length -= blockSize; - } - while (length >= blockSize); - return length; -} - -template void IteratedHashBase::PadLastBlock(unsigned int lastBlockSize, byte padFirst) -{ - unsigned int num = (unsigned int)(countLo >> 3) & (blockSize-1); - assert(num < blockSize); - ((byte *)data.ptr)[num++]=padFirst; - if (num <= lastBlockSize) - memset((byte *)data.ptr+num, 0, lastBlockSize-num); - else - { - memset((byte *)data.ptr+num, 0, blockSize-num); - HashBlock(data); - memset(data, 0, lastBlockSize); - } -} - -template void IteratedHashBase::Reinit() -{ - countLo = countHi = 0; - Init(); -} - -// provide empty definitions to avoid instantiation warnings -template void IteratedHashBase::Init() {} -template void IteratedHashBase::HashBlock(const T *input) {} - #ifdef WORD64_AVAILABLE template class IteratedHashBase; #endif diff --git a/external/ours/library/crypto/src/shared/original/iterhash.h b/external/ours/library/crypto/src/shared/original/iterhash.h index ac9e0efe..a0abd0e7 100644 --- a/external/ours/library/crypto/src/shared/original/iterhash.h +++ b/external/ours/library/crypto/src/shared/original/iterhash.h @@ -34,6 +34,106 @@ protected: SecBlock digest; // Message digest }; +template +IteratedHashBase::IteratedHashBase(unsigned int blockSize, unsigned int digestSize) + : blockSize(blockSize), countLo(0), countHi(0) + , data(blockSize/sizeof(T)), digest(digestSize/sizeof(T)) +{ +} + +template void IteratedHashBase::Update(const byte *input, unsigned int len) +{ + HashWordType tmp = countLo; + if ((countLo = tmp + ((word32)len << 3)) < tmp) + countHi++; // Carry from low to high + + int rshift = (8*sizeof(HashWordType)-3); + if (rshift<32) + { + countHi += len >> rshift; + } + + assert((blockSize & (blockSize-1)) == 0); // blockSize is a power of 2 + unsigned int num = (unsigned int)(tmp >> 3) & (blockSize-1); + + if (num != 0) + { + if ((num+len) >= blockSize) + { + memcpy((byte *)data.ptr+num, input, blockSize-num); + HashBlock(data); + input += (blockSize-num); + len-=(blockSize - num); + num=0; + // drop through and do the rest + } + else + { + memcpy((byte *)data.ptr+num, input, len); + return; + } + } + + // we now can process the input data in blocks of blockSize + // chars and save the leftovers to this->data. + if (len >= blockSize) + { + if (IsAligned(input)) + { + unsigned int leftOver = HashMultipleBlocks((T *)input, len); + input += (len - leftOver); + len = leftOver; + } + else + do + { // copy input first if it's not aligned correctly + memcpy(data, input, blockSize); + HashBlock(data); + input+=blockSize; + len-=blockSize; + } while (len >= blockSize); + } + + memcpy(data, input, len); +} + +template unsigned int IteratedHashBase::HashMultipleBlocks(const T *input, unsigned int length) +{ + do + { + HashBlock(input); + input += blockSize/sizeof(T); + length -= blockSize; + } + while (length >= blockSize); + return length; +} + +template void IteratedHashBase::PadLastBlock(unsigned int lastBlockSize, byte padFirst) +{ + unsigned int num = (unsigned int)(countLo >> 3) & (blockSize-1); + assert(num < blockSize); + ((byte *)data.ptr)[num++]=padFirst; + if (num <= lastBlockSize) + memset((byte *)data.ptr+num, 0, lastBlockSize-num); + else + { + memset((byte *)data.ptr+num, 0, blockSize-num); + HashBlock(data); + memset(data, 0, lastBlockSize); + } +} + +template void IteratedHashBase::Reinit() +{ + countLo = countHi = 0; + Init(); +} + +// provide empty definitions to avoid instantiation warnings +template void IteratedHashBase::Init() {} +template void IteratedHashBase::HashBlock(const T *input) {} + //! . template class IteratedHash : public IteratedHashBase @@ -41,7 +141,7 @@ class IteratedHash : public IteratedHashBase public: typedef T HashWordType; enum {HIGHFIRST = H, BLOCKSIZE = S}; - + IteratedHash(unsigned int digestSize) : IteratedHashBase(BLOCKSIZE, digestSize) {} inline static void CorrectEndianess(HashWordType *out, const HashWordType *in, unsigned int byteCount) @@ -54,7 +154,7 @@ public: void Final(byte *hash) { - PadLastBlock(BLOCKSIZE - 2*sizeof(HashWordType)); + this->PadLastBlock(BLOCKSIZE - 2*sizeof(HashWordType)); CorrectEndianess(this->data, this->data, BLOCKSIZE - 2*sizeof(HashWordType)); this->data[this->data.size-2] = HIGHFIRST ? this->countHi : this->countLo;