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; }
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; }