void Tiger::Final(byte *hash) { PadLastBlock(56, 0x01); CorrectEndianess(data, data, 56); data[7] = countLo; Transform(digest, data); CorrectEndianess(digest, digest, DigestSize()); memcpy(hash, digest, DigestSize()); Reinit(); // reinit for next use }
void Tiger::TruncatedFinal(byte *hash, unsigned int size) { ThrowIfInvalidTruncatedSize(size); PadLastBlock(56, 0x01); CorrectEndianess(m_data, m_data, 56); m_data[7] = GetBitCountLo(); Transform(m_digest, m_data); CorrectEndianess(m_digest, m_digest, DigestSize()); memcpy(hash, m_digest, size); Restart(); // reinit for next use }
void Whirlpool::TruncatedFinal(byte *hash, size_t size) { ThrowIfInvalidTruncatedSize(size); PadLastBlock(32); CorrectEndianess(m_data, m_data, 32); m_data[m_data.size()-4] = 0; m_data[m_data.size()-3] = 0; m_data[m_data.size()-2] = GetBitCountHi(); m_data[m_data.size()-1] = GetBitCountLo(); Transform(m_digest, m_data); CorrectEndianess(m_digest, m_digest, DigestSize()); memcpy(hash, m_digest, size); Restart(); // reinit for next use }
void HashTransformation::ThrowIfInvalidTruncatedSize(unsigned int size) const { if (size > DigestSize()) throw InvalidArgument("HashTransformation: can't truncate a " + IntToString(DigestSize()) + " byte digest to " + IntToString(size) + " bytes"); }
size_t OAEP_Base::MaxUnpaddedLength(size_t paddedLength) const { return SaturatingSubtract(paddedLength/8, 1+2*DigestSize()); }
bool MessageAuthenticationCode::Verify(const byte *macIn) { SecByteBlock mac(DigestSize()); Final(mac); return memcmp(mac, macIn, DigestSize()) == 0; }