Beispiel #1
0
XMoshSum digestBlock( hp_byte* initialBlock, XMoshSum sum )
{
	hp_word32* sumWords = ( hp_word32* ) &sum.data;
	hp_word32 block[ 80 ];

	for( unsigned int i = 0; i < 16; i++ )
	{
		block[ i ] = ( ( hp_word32 ) initialBlock[ i * 4 ] ) << 24;
		block[ i ] |= ( ( hp_word32 ) initialBlock[ i * 4 + 1 ] ) << 16;
		block[ i ] |= ( ( hp_word32 ) initialBlock[ i * 4 + 2 ] ) << 8;
		block[ i ] |= ( ( hp_word32 ) initialBlock[ i * 4 + 3 ] );
	}

	for( unsigned int i = 16; i < 80; i++ )
	{
		block[ i ] = LROT(
				( block[ i - 3 ] ^ block[ i - 8 ] ^ block[ i - 14 ]
						^ block[ i - 16 ] ), 1 );
	}

	hp_word32 a = sumWords[ 0 ];
	hp_word32 b = sumWords[ 1 ];
	hp_word32 c = sumWords[ 2 ];
	hp_word32 d = sumWords[ 3 ];
	hp_word32 e = sumWords[ 4 ];

	hp_word32 f = 0;
	hp_word32 k = 0;

	hp_word32 temp = 0;

	unsigned int i;
	for( i = 0; i < 20; i++ )
	{
		f = ( b & c ) | ( ( ~b ) & d );
		k = K[ 0 ];
		SUM_UPDATE( a, b, c, d, e, f, k, temp );
	}
	for( i = 20; i < 40; i++ )
	{
		f = b ^ c ^ d;
		k = K[ 1 ];
		SUM_UPDATE( a, b, c, d, e, f, k, temp );
	}
	for( i = 40; i < 60; i++ )
	{
		f = ( b & c ) | ( b & d ) | ( c & d );
		k = K[ 2 ];
		SUM_UPDATE( a, b, c, d, e, f, k, temp );
	}
	for( i = 60; i < 80; i++ )
	{
		f = b ^ c ^ d;
		k = K[ 3 ];
		SUM_UPDATE( a, b, c, d, e, f, k, temp );
	}

	sumWords[ 0 ] += a;
	sumWords[ 1 ] += b;
	sumWords[ 2 ] += c;
	sumWords[ 3 ] += d;
	sumWords[ 4 ] += e;

	return sum;
}
Beispiel #2
0
static unsigned int mix32(unsigned int h)
{
    h ^= 0x2e63823a;  h += LROT(h, 15); h -= LROT(h, 9);
    h += LROT(h, 4);  h -= LROT(h, 1);  h ^= LROT(h, 2);
    return h;
}