Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
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();
}
Ejemplo n.º 3
0
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
}
Ejemplo n.º 4
0
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
}
Ejemplo n.º 5
0
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
}
Ejemplo n.º 6
0
Archivo: tiger.cpp Proyecto: acat/emule
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
}
Ejemplo n.º 7
0
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
}
Ejemplo n.º 8
0
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
}
Ejemplo n.º 9
0
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();
}
Ejemplo n.º 10
0
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
}
Ejemplo n.º 11
0
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
}
Ejemplo n.º 12
0
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
}