void blake28_compress( state *S, const u8 *block ) { u32 v[16], m[16], i; #define ROT(x,n) (((x)<<(32-n))|( (x)>>(n))) #define G(a,b,c,d,e) \ v[a] += (m[sigma[i][e]] ^ cst[sigma[i][e+1]]) + v[b]; \ v[d] = ROT( v[d] ^ v[a],16); \ v[c] += v[d]; \ v[b] = ROT( v[b] ^ v[c],12); \ v[a] += (m[sigma[i][e+1]] ^ cst[sigma[i][e]])+v[b]; \ v[d] = ROT( v[d] ^ v[a], 8); \ v[c] += v[d]; \ v[b] = ROT( v[b] ^ v[c], 7); for(i=0; i<16;++i) m[i] = U8TO32(block + i*4); for(i=0; i< 8;++i) v[i] = S->h[i]; v[ 8] = S->s[0] ^ 0x243F6A88; v[ 9] = S->s[1] ^ 0x85A308D3; v[10] = S->s[2] ^ 0x13198A2E; v[11] = S->s[3] ^ 0x03707344; v[12] = 0xA4093822; v[13] = 0x299F31D0; v[14] = 0x082EFA98; v[15] = 0xEC4E6C89; if (S->nullt == 0) { v[12] ^= S->t[0]; v[13] ^= S->t[0]; v[14] ^= S->t[1]; v[15] ^= S->t[1]; } for(i=0; i<10; ++i) { G( 0, 4, 8,12, 0); G( 1, 5, 9,13, 2); G( 2, 6,10,14, 4); G( 3, 7,11,15, 6); G( 3, 4, 9,14,14); G( 2, 7, 8,13,12); G( 0, 5,10,15, 8); G( 1, 6,11,12,10); } for(i=0; i<16;++i) S->h[i%8] ^= v[i]; for(i=0; i<8 ;++i) S->h[i] ^= S->s[i%4]; }
void blake256_compress( state *S, const u8 *block ) { u32 m0; u32 m1; u32 m2; u32 m3; u32 m4; u32 m5; u32 m6; u32 m7; u32 m8; u32 m9; u32 m10; u32 m11; u32 m12; u32 m13; u32 m14; u32 m15; u32 v0; u32 v1; u32 v2; u32 v3; u32 v4; u32 v5; u32 v6; u32 v7; u32 v8; u32 v9; u32 v10; u32 v11; u32 v12; u32 v13; u32 v14; u32 v15; m0 = U8TO32(block + 0); m1 = U8TO32(block + 4); m2 = U8TO32(block + 8); m3 = U8TO32(block + 12); m4 = U8TO32(block + 16); m5 = U8TO32(block + 20); m6 = U8TO32(block + 24); m7 = U8TO32(block + 28); m8 = U8TO32(block + 32); m9 = U8TO32(block + 36); m10 = U8TO32(block + 40); m11 = U8TO32(block + 44); m12 = U8TO32(block + 48); m13 = U8TO32(block + 52); m14 = U8TO32(block + 56); m15 = U8TO32(block + 60); v0 = S->h[0]; v1 = S->h[1]; v2 = S->h[2]; v3 = S->h[3]; v4 = S->h[4]; v5 = S->h[5]; v6 = S->h[6]; v7 = S->h[7]; v8 = S->s[0] ^ 0x243F6A88; v9 = S->s[1] ^ 0x85A308D3; v10 = S->s[2] ^ 0x13198A2E; v11 = S->s[3] ^ 0x03707344; v12 = 0xA4093822; v13 = 0x299F31D0; v14 = 0x082EFA98; v15 = 0xEC4E6C89; if (S->nullt == 0) { v12 ^= S->t[0]; v13 ^= S->t[0]; v14 ^= S->t[1]; v15 ^= S->t[1]; } #define ROUND(m0,c0,m1,c1,m2,c2,m3,c3,m4,c4,m5,c5,m6,c6,m7,c7,m8,c8,m9,c9,m10,c10,m11,c11,m12,c12,m13,c13,m14,c14,m15,c15) \ v0 += m0 ^ c0; \ v0 += v4; \ v12 ^= v0; \ v12 = ROT( v12,16); \ v8 += v12; \ v4 ^= v8; \ v4 = ROT( v4,12); \ v1 += m2 ^ c2; \ v1 += v5; \ v13 ^= v1; \ v13 = ROT( v13,16); \ v9 += v13; \ v5 ^= v9; \ v5 = ROT( v5,12); \ v2 += m4 ^ c4; \ v2 += v6; \ v14 ^= v2; \ v14 = ROT( v14,16); \ v10 += v14; \ v6 ^= v10; \ v6 = ROT( v6,12); \ v3 += m6 ^ c6; \ v3 += v7; \ v15 ^= v3; \ v15 = ROT( v15,16); \ v11 += v15; \ v7 ^= v11; \ v7 = ROT( v7,12); \ v2 += m5 ^ c5; \ v2 += v6; \ v14 ^= v2; \ v14 = ROT( v14, 8); \ v10 += v14; \ v6 ^= v10; \ v6 = ROT( v6, 7); \ v3 += m7 ^ c7; \ v3 += v7; \ v15 ^= v3; \ v15 = ROT( v15, 8); \ v11 += v15; \ v7 ^= v11; \ v7 = ROT( v7, 7); \ v1 += m3 ^ c3; \ v1 += v5; \ v13 ^= v1; \ v13 = ROT( v13, 8); \ v9 += v13; \ v5 ^= v9; \ v5 = ROT( v5, 7); \ v0 += m1 ^ c1; \ v0 += v4; \ v12 ^= v0; \ v12 = ROT( v12, 8); \ v8 += v12; \ v4 ^= v8; \ v4 = ROT( v4, 7); \ v0 += m8 ^ c8; \ v0 += v5; \ v15 ^= v0; \ v15 = ROT( v15,16); \ v10 += v15; \ v5 ^= v10; \ v5 = ROT( v5,12); \ v1 += m10 ^ c10; \ v1 += v6; \ v12 ^= v1; \ v12 = ROT( v12,16); \ v11 += v12; \ v6 ^= v11; \ v6 = ROT( v6,12); \ v2 += m12 ^ c12; \ v2 += v7; \ v13 ^= v2; \ v13 = ROT( v13,16); \ v8 += v13; \ v7 ^= v8; \ v7 = ROT( v7,12); \ v3 += m14 ^ c14; \ v3 += v4; \ v14 ^= v3; \ v14 = ROT( v14,16); \ v9 += v14; \ v4 ^= v9; \ v4 = ROT( v4,12); \ v2 += m13 ^ c13; \ v2 += v7; \ v13 ^= v2; \ v13 = ROT( v13, 8); \ v8 += v13; \ v7 ^= v8; \ v7 = ROT( v7, 7); \ v3 += m15 ^ c15; \ v3 += v4; \ v14 ^= v3; \ v14 = ROT( v14, 8); \ v9 += v14; \ v4 ^= v9; \ v4 = ROT( v4, 7); \ v1 += m11 ^ c11; \ v1 += v6; \ v12 ^= v1; \ v12 = ROT( v12, 8); \ v11 += v12; \ v6 ^= v11; \ v6 = ROT( v6, 7); \ v0 += m9 ^ c9; \ v0 += v5; \ v15 ^= v0; \ v15 = ROT( v15, 8); \ v10 += v15; \ v5 ^= v10; \ v5 = ROT( v5, 7); \ ROUND(m0,cst[1],m1,cst[0],m2,cst[3],m3,cst[2],m4,cst[5],m5,cst[4],m6,cst[7],m7,cst[6],m8,cst[9],m9,cst[8],m10,cst[11],m11,cst[10],m12,cst[13],m13,cst[12],m14,cst[15],m15,cst[14]) ROUND(m14,cst[10],m10,cst[14],m4,cst[8],m8,cst[4],m9,cst[15],m15,cst[9],m13,cst[6],m6,cst[13],m1,cst[12],m12,cst[1],m0,cst[2],m2,cst[0],m11,cst[7],m7,cst[11],m5,cst[3],m3,cst[5]) ROUND(m11,cst[8],m8,cst[11],m12,cst[0],m0,cst[12],m5,cst[2],m2,cst[5],m15,cst[13],m13,cst[15],m10,cst[14],m14,cst[10],m3,cst[6],m6,cst[3],m7,cst[1],m1,cst[7],m9,cst[4],m4,cst[9]) ROUND(m7,cst[9],m9,cst[7],m3,cst[1],m1,cst[3],m13,cst[12],m12,cst[13],m11,cst[14],m14,cst[11],m2,cst[6],m6,cst[2],m5,cst[10],m10,cst[5],m4,cst[0],m0,cst[4],m15,cst[8],m8,cst[15]) ROUND(m9,cst[0],m0,cst[9],m5,cst[7],m7,cst[5],m2,cst[4],m4,cst[2],m10,cst[15],m15,cst[10],m14,cst[1],m1,cst[14],m11,cst[12],m12,cst[11],m6,cst[8],m8,cst[6],m3,cst[13],m13,cst[3]) ROUND(m2,cst[12],m12,cst[2],m6,cst[10],m10,cst[6],m0,cst[11],m11,cst[0],m8,cst[3],m3,cst[8],m4,cst[13],m13,cst[4],m7,cst[5],m5,cst[7],m15,cst[14],m14,cst[15],m1,cst[9],m9,cst[1]) ROUND(m12,cst[5],m5,cst[12],m1,cst[15],m15,cst[1],m14,cst[13],m13,cst[14],m4,cst[10],m10,cst[4],m0,cst[7],m7,cst[0],m6,cst[3],m3,cst[6],m9,cst[2],m2,cst[9],m8,cst[11],m11,cst[8]) ROUND(m13,cst[11],m11,cst[13],m7,cst[14],m14,cst[7],m12,cst[1],m1,cst[12],m3,cst[9],m9,cst[3],m5,cst[0],m0,cst[5],m15,cst[4],m4,cst[15],m8,cst[6],m6,cst[8],m2,cst[10],m10,cst[2]) ROUND(m6,cst[15],m15,cst[6],m14,cst[9],m9,cst[14],m11,cst[3],m3,cst[11],m0,cst[8],m8,cst[0],m12,cst[2],m2,cst[12],m13,cst[7],m7,cst[13],m1,cst[4],m4,cst[1],m10,cst[5],m5,cst[10]) ROUND(m10,cst[2],m2,cst[10],m8,cst[4],m4,cst[8],m7,cst[6],m6,cst[7],m1,cst[5],m5,cst[1],m15,cst[11],m11,cst[15],m9,cst[14],m14,cst[9],m3,cst[12],m12,cst[3],m13,cst[0],m0,cst[13]) ROUND(m0,cst[1],m1,cst[0],m2,cst[3],m3,cst[2],m4,cst[5],m5,cst[4],m6,cst[7],m7,cst[6],m8,cst[9],m9,cst[8],m10,cst[11],m11,cst[10],m12,cst[13],m13,cst[12],m14,cst[15],m15,cst[14]) ROUND(m14,cst[10],m10,cst[14],m4,cst[8],m8,cst[4],m9,cst[15],m15,cst[9],m13,cst[6],m6,cst[13],m1,cst[12],m12,cst[1],m0,cst[2],m2,cst[0],m11,cst[7],m7,cst[11],m5,cst[3],m3,cst[5]) ROUND(m11,cst[8],m8,cst[11],m12,cst[0],m0,cst[12],m5,cst[2],m2,cst[5],m15,cst[13],m13,cst[15],m10,cst[14],m14,cst[10],m3,cst[6],m6,cst[3],m7,cst[1],m1,cst[7],m9,cst[4],m4,cst[9]) ROUND(m7,cst[9],m9,cst[7],m3,cst[1],m1,cst[3],m13,cst[12],m12,cst[13],m11,cst[14],m14,cst[11],m2,cst[6],m6,cst[2],m5,cst[10],m10,cst[5],m4,cst[0],m0,cst[4],m15,cst[8],m8,cst[15]) v0 ^= v8; v1 ^= v9; v2 ^= v10; v3 ^= v11; v4 ^= v12; v5 ^= v13; v6 ^= v14; v7 ^= v15; v0 ^= S->s[0]; v1 ^= S->s[1]; v2 ^= S->s[2]; v3 ^= S->s[3]; v4 ^= S->s[0]; v5 ^= S->s[1]; v6 ^= S->s[2]; v7 ^= S->s[3]; S->h[0] ^= v0; S->h[1] ^= v1; S->h[2] ^= v2; S->h[3] ^= v3; S->h[4] ^= v4; S->h[5] ^= v5; S->h[6] ^= v6; S->h[7] ^= v7; }