void MD5MAC_Base::UncheckedSetKey(const byte *userKey, unsigned int keylength) { const word32 zeros[4] = {0,0,0,0}; for (unsigned i=0, j; i<3; i++) { m_key[4*i+0] = 0x67452301L; m_key[4*i+1] = 0xefcdab89L; m_key[4*i+2] = 0x98badcfeL; m_key[4*i+3] = 0x10325476L; memcpy(m_data, userKey, KEYLENGTH); CorrectEndianess(m_data, m_data, KEYLENGTH); for (j=0; j<3; j++) memcpy(m_data+4+4*j, T+((i+j)%3)*4, 16); Transform(m_key+4*i, m_data, zeros); for (j=0; j<3; j++) memcpy(m_data+4*j, T+((i+j)%3)*4, 16); memcpy(m_data+12, userKey, KEYLENGTH); CorrectEndianess(m_data+12, m_data+12, KEYLENGTH); Transform(m_key+4*i, m_data, zeros); } Init(); }
MD5MAC::MD5MAC(const byte *userKey) : IteratedHash<word32>(DATASIZE, DIGESTSIZE), key(12) { const word32 zeros[4] = {0,0,0,0}; for (unsigned i=0, j; i<3; i++) { key[4*i+0] = 0x67452301L; key[4*i+1] = 0xefcdab89L; key[4*i+2] = 0x98badcfeL; key[4*i+3] = 0x10325476L; memcpy(data, userKey, KEYLENGTH); CorrectEndianess(data, data, KEYLENGTH); for (j=0; j<3; j++) memcpy(data+4+4*j, T+((i+j)%3)*4, 16); Transform(key+4*i, data, zeros); for (j=0; j<3; j++) memcpy(data+4*j, T+((i+j)%3)*4, 16); memcpy(data+12, userKey, KEYLENGTH); CorrectEndianess(data+12, data+12, KEYLENGTH); Transform(key+4*i, data, zeros); } Init(); }
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 RIPEMD160::Final (byte *hash) { PadLastBlock(56); CorrectEndianess(data, data, 56); data[14] = countLo; data[15] = countHi; Transform(digest, data); CorrectEndianess(digest, digest, DIGESTSIZE); memcpy(hash, digest, DIGESTSIZE); Init(); // reinit for next use }
void TTMAC_Base::TruncatedFinal(byte *hash, size_t size) { PadLastBlock(BlockSize() - 2*sizeof(HashWordType)); CorrectEndianess(m_data, m_data, BlockSize() - 2*sizeof(HashWordType)); m_data[m_data.size()-2] = GetBitCountLo(); m_data[m_data.size()-1] = GetBitCountHi(); Transform(m_digest, m_data, true); word32 t2 = m_digest[2]; word32 t3 = m_digest[3]; if (size != DIGESTSIZE) { switch (size) { case 16: m_digest[3] += m_digest[1] + m_digest[4]; case 12: m_digest[2] += m_digest[0] + t3; case 8: m_digest[0] += m_digest[1] + t3; m_digest[1] += m_digest[4] + t2; break; case 4: m_digest[0] += m_digest[1] + m_digest[2] + m_digest[3] + m_digest[4]; break; case 0: // Used by HashTransformation::Restart() break; default: throw InvalidArgument("TTMAC_Base: can't truncate a Two-Track-MAC 20 byte digest to " + IntToString(size) + " bytes"); break; } } CorrectEndianess(m_digest, m_digest, size); memcpy(hash, m_digest, size); Restart(); // 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 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 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 TTMAC_Base::UncheckedSetKey(const byte *userKey, unsigned int keylength, const NameValuePairs &) { AssertValidKeyLength(keylength); memcpy(m_key, userKey, KEYLENGTH); CorrectEndianess(m_key, m_key, KEYLENGTH); Init(); }
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 }
void MD5MAC::Final (byte *hash) { PadLastBlock(56); CorrectEndianess(data, data, 56); data[14] = countLo; data[15] = countHi; Transform(digest, data, key+4); unsigned i; for (i=0; i<4; i++) data[i] = key[8+i]; for (i=0; i<12; i++) data[i+4] = T[i] ^ key[8+i%4]; Transform(digest, data, key+4); CorrectEndianess(digest, digest, DIGESTSIZE); memcpy(hash, digest, DIGESTSIZE); Init(); // reinit for next use }
void MD5MAC_Base::TruncatedFinal(byte *hash, size_t size) { ThrowIfInvalidTruncatedSize(size); PadLastBlock(56); CorrectEndianess(m_data, m_data, 56); m_data[14] = GetBitCountLo(); m_data[15] = GetBitCountHi(); Transform(m_digest, m_data, m_key+4); unsigned i; for (i=0; i<4; i++) m_data[i] = m_key[8+i]; for (i=0; i<12; i++) m_data[i+4] = T[i] ^ m_key[8+i%4]; Transform(m_digest, m_data, m_key+4); CorrectEndianess(m_digest, m_digest, DIGESTSIZE); memcpy(hash, m_digest, size); Restart(); // reinit for next use }