4 #define CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
10 NAMESPACE_BEGIN(CryptoPP)
12 template <class T, class BASE>
void IteratedHashBase<T, BASE>::Update(const byte *input,
size_t len)
14 HashWordType oldCountLo = m_countLo, oldCountHi = m_countHi;
15 if ((m_countLo = oldCountLo + HashWordType(len)) < oldCountLo)
17 m_countHi += (HashWordType)SafeRightShift<8*
sizeof(HashWordType)>(len);
18 if (m_countHi < oldCountHi || SafeRightShift<2*8*
sizeof(HashWordType)>(len) != 0)
21 unsigned int blockSize = this->
BlockSize();
22 unsigned int num = ModPowerOf2(oldCountLo, blockSize);
23 T* dataBuf = this->DataBuf();
24 byte* data = (byte *)dataBuf;
28 if (num+len >= blockSize)
30 memcpy(data+num, input, blockSize-num);
32 input += (blockSize-num);
33 len -= (blockSize-num);
39 memcpy(data+num, input, len);
49 assert(len == blockSize);
53 else if (IsAligned<T>(input))
55 size_t leftOver = HashMultipleBlocks((T *)input, len);
56 input += (len - leftOver);
62 memcpy(data, input, blockSize);
66 }
while (len >= blockSize);
69 if (len && data != input)
70 memcpy(data, input, len);
75 unsigned int blockSize = this->
BlockSize();
76 unsigned int num = ModPowerOf2(m_countLo, blockSize);
77 size = blockSize - num;
78 return (byte *)DataBuf() + num;
83 unsigned int blockSize = this->
BlockSize();
84 bool noReverse = NativeByteOrderIs(this->GetByteOrder());
85 T* dataBuf = this->DataBuf();
89 this->HashEndianCorrectedBlock(input);
92 ByteReverse(dataBuf, input, this->
BlockSize());
93 this->HashEndianCorrectedBlock(dataBuf);
96 input += blockSize/
sizeof(T);
99 while (length >= blockSize);
105 unsigned int blockSize = this->
BlockSize();
106 unsigned int num = ModPowerOf2(m_countLo, blockSize);
107 T* dataBuf = this->DataBuf();
108 byte* data = (byte *)dataBuf;
109 data[num++] = padFirst;
110 if (num <= lastBlockSize)
111 memset(data+num, 0, lastBlockSize-num);
114 memset(data+num, 0, blockSize-num);
116 memset(data, 0, lastBlockSize);
122 m_countLo = m_countHi = 0;
128 this->ThrowIfInvalidTruncatedSize(size);
130 T* dataBuf = this->DataBuf();
131 T* stateBuf = this->StateBuf();
132 unsigned int blockSize = this->
BlockSize();
133 ByteOrder order = this->GetByteOrder();
135 PadLastBlock(blockSize - 2*
sizeof(HashWordType));
136 dataBuf[blockSize/
sizeof(T)-2+order] = ConditionalByteReverse(order, this->GetBitCountLo());
137 dataBuf[blockSize/
sizeof(T)-1-order] = ConditionalByteReverse(order, this->GetBitCountHi());
141 if (IsAligned<HashWordType>(digest) && size%
sizeof(HashWordType)==0)
142 ConditionalByteReverse<HashWordType>(order, (HashWordType *)digest, stateBuf, size);
145 ConditionalByteReverse<HashWordType>(order, stateBuf, stateBuf, this->
DigestSize());
146 memcpy(digest, stateBuf, size);