Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- __constant ulong keccak_round_constants[24] = {
- 0x0000000000000001UL, 0x0000000000008082UL,
- 0x800000000000808aUL, 0x8000000080008000UL,
- 0x000000000000808bUL, 0x0000000080000001UL,
- 0x8000000080008081UL, 0x8000000000008009UL,
- 0x000000000000008aUL, 0x0000000000000088UL,
- 0x0000000080008009UL, 0x000000008000000aUL,
- 0x000000008000808bUL, 0x800000000000008bUL,
- 0x8000000000008089UL, 0x8000000000008003UL,
- 0x8000000000008002UL, 0x8000000000000080UL,
- 0x000000000000800aUL, 0x800000008000000aUL,
- 0x8000000080008081UL, 0x8000000000008080UL,
- 0x0000000080000001UL, 0x8000000080008008UL
- };
- static void
- keccak_block_core(hash_state *S) {
- uint2 t[5];
- uint2 u[5];
- uint2 v;
- uint2 w;
- uint4 *s4 = S->state4;
- uint i;
- for (i = 0; i < 24; i++) {
- /* theta: c = a[0,i] ^ a[1,i] ^ .. a[4,i] */
- t[0] = s4[0].xy ^ s4[2].zw ^ s4[5].xy ^ s4[7].zw ^ s4[10].xy;
- t[1] = s4[0].zw ^ s4[3].xy ^ s4[5].zw ^ s4[8].xy ^ s4[10].zw;
- t[2] = s4[1].xy ^ s4[3].zw ^ s4[6].xy ^ s4[8].zw ^ s4[11].xy;
- t[3] = s4[1].zw ^ s4[4].xy ^ s4[6].zw ^ s4[9].xy ^ s4[11].zw;
- t[4] = s4[2].xy ^ s4[4].zw ^ s4[7].xy ^ s4[9].zw ^ s4[12].xy;
- /* theta: d[i] = c[i+4] ^ rotl(c[i+1],1) */
- u[0] = t[4] ^ ROTL64(t[1], 1UL);
- u[1] = t[0] ^ ROTL64(t[2], 1UL);
- u[2] = t[1] ^ ROTL64(t[3], 1UL);
- u[3] = t[2] ^ ROTL64(t[4], 1UL);
- u[4] = t[3] ^ ROTL64(t[0], 1UL);
- /* theta: a[0,i], a[1,i], .. a[4,i] ^= d[i] */
- s4[0].xy ^= u[0]; s4[2].zw ^= u[0]; s4[5].xy ^= u[0]; s4[7].zw ^= u[0]; s4[10].xy ^= u[0];
- s4[0].zw ^= u[1]; s4[3].xy ^= u[1]; s4[5].zw ^= u[1]; s4[8].xy ^= u[1]; s4[10].zw ^= u[1];
- s4[1].xy ^= u[2]; s4[3].zw ^= u[2]; s4[6].xy ^= u[2]; s4[8].zw ^= u[2]; s4[11].xy ^= u[2];
- s4[1].zw ^= u[3]; s4[4].xy ^= u[3]; s4[6].zw ^= u[3]; s4[9].xy ^= u[3]; s4[11].zw ^= u[3];
- s4[2].xy ^= u[4]; s4[4].zw ^= u[4]; s4[7].xy ^= u[4]; s4[9].zw ^= u[4]; s4[12].xy ^= u[4];
- /* rho pi: b[..] = rotl(a[..], ..) */
- v = s4[0].zw;
- s4[ 0].zw = ROTL64(s4[ 3].xy, 44UL);
- s4[ 3].xy = ROTL64(s4[ 4].zw, 20UL);
- s4[ 4].zw = ROTL64(s4[11].xy, 61UL);
- s4[11].xy = ROTL64(s4[ 7].xy, 39UL);
- s4[ 7].xy = ROTL64(s4[10].xy, 18UL);
- s4[10].xy = ROTL64(s4[ 1].xy, 62UL);
- s4[ 1].xy = ROTL64(s4[ 6].xy, 43UL);
- s4[ 6].xy = ROTL64(s4[ 6].zw, 25UL);
- s4[ 6].zw = ROTL64(s4[ 9].zw, 8UL);
- s4[ 9].zw = ROTL64(s4[11].zw, 56UL);
- s4[11].zw = ROTL64(s4[ 7].zw, 41UL);
- s4[ 7].zw = ROTL64(s4[ 2].xy, 27UL);
- s4[ 2].xy = ROTL64(s4[12].xy, 14UL);
- s4[12].xy = ROTL64(s4[10].zw, 2UL);
- s4[10].zw = ROTL64(s4[ 4].xy, 55UL);
- s4[ 4].xy = ROTL64(s4[ 8].xy, 45UL);
- s4[ 8].xy = ROTL64(s4[ 2].zw, 36UL);
- s4[ 2].zw = ROTL64(s4[ 1].zw, 28UL);
- s4[ 1].zw = ROTL64(s4[ 9].xy, 21UL);
- s4[ 9].xy = ROTL64(s4[ 8].zw, 15UL);
- s4[ 8].zw = ROTL64(s4[ 5].zw, 10UL);
- s4[ 5].zw = ROTL64(s4[ 3].zw, 6UL);
- s4[ 3].zw = ROTL64(s4[ 5].xy, 3UL);
- s4[ 5].xy = ROTL64( v, 1UL);
- /* chi: a[i,j] ^= ~b[i,j+1] & b[i,j+2] */
- v = s4[ 0].xy; w = s4[ 0].zw; s4[ 0].xy ^= (~w) & s4[ 1].xy; s4[ 0].zw ^= (~s4[ 1].xy) & s4[ 1].zw; s4[ 1].xy ^= (~s4[ 1].zw) & s4[ 2].xy; s4[ 1].zw ^= (~s4[ 2].xy) & v; s4[ 2].xy ^= (~v) & w;
- v = s4[ 2].zw; w = s4[ 3].xy; s4[ 2].zw ^= (~w) & s4[ 3].zw; s4[ 3].xy ^= (~s4[ 3].zw) & s4[ 4].xy; s4[ 3].zw ^= (~s4[ 4].xy) & s4[ 4].zw; s4[ 4].xy ^= (~s4[ 4].zw) & v; s4[ 4].zw ^= (~v) & w;
- v = s4[ 5].xy; w = s4[ 5].zw; s4[ 5].xy ^= (~w) & s4[ 6].xy; s4[ 5].zw ^= (~s4[ 6].xy) & s4[ 6].zw; s4[ 6].xy ^= (~s4[ 6].zw) & s4[ 7].xy; s4[ 6].zw ^= (~s4[ 7].xy) & v; s4[ 7].xy ^= (~v) & w;
- v = s4[ 7].zw; w = s4[ 8].xy; s4[ 7].zw ^= (~w) & s4[ 8].zw; s4[ 8].xy ^= (~s4[ 8].zw) & s4[ 9].xy; s4[ 8].zw ^= (~s4[ 9].xy) & s4[ 9].zw; s4[ 9].xy ^= (~s4[ 9].zw) & v; s4[ 9].zw ^= (~v) & w;
- v = s4[10].xy; w = s4[10].zw; s4[10].xy ^= (~w) & s4[11].xy; s4[10].zw ^= (~s4[11].xy) & s4[11].zw; s4[11].xy ^= (~s4[11].zw) & s4[12].xy; s4[11].zw ^= (~s4[12].xy) & v; s4[12].xy ^= (~v) & w;
- /* iota: a[0,0] ^= round constant */
- s4[0].xy ^= as_uint2(keccak_round_constants[i]);
- }
- }
- static void
- keccak_block(hash_state *S, const uint4 *in4) {
- uint4 *s4 = S->state4;
- uint i;
- /* absorb input */
- #pragma unroll
- for (i = 0; i < 4; i++) {
- s4[i] ^= in4[i];
- }
- s4[4].xy ^= in4[4].xy;
- keccak_block_core(S);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement