void HAVAL::Final (byte *hash) { PadLastBlock(118, 1); // first byte of padding for HAVAL is 1 instead of 0x80 CorrectEndianess(data, data, 120); data[29] &= 0xffff; data[29] |= ((word32)digestSize<<25) | ((word32)pass<<19) | ((word32)VERSION<<16); data[30] = countLo; data[31] = countHi; vTransform(data); Tailor(digestSize*8); CorrectEndianess(digest, digest, digestSize); memcpy(hash, digest, digestSize); Reinit(); // reinit for next use }
void HAVAL::TruncatedFinal(byte *hash, unsigned int size) { ThrowIfInvalidTruncatedSize(size); PadLastBlock(118, 1); // first byte of padding for HAVAL is 1 instead of 0x80 CorrectEndianess(m_data, m_data, 120); m_data[29] &= 0xffff; m_data[29] |= ((word32)digestSize<<25) | ((word32)pass<<19) | ((word32)HAVAL_VERSION<<16); m_data[30] = GetBitCountLo(); m_data[31] = GetBitCountHi(); vTransform(m_data); Tailor(digestSize*8); CorrectEndianess(m_digest, m_digest, digestSize); memcpy(hash, m_digest, size); Restart(); // reinit for next use }