/* This file contains the byte & uint64 implementations that are used as reference to test the bits implementations of the other files. The methods in this file (thetaU64Version, rhopiU64Version, chiU64Version, iotU64Version) are modified versions of methods from: https://github.com/ebfe/keccak */ package keccak func thetaU64Version(a [25]uint64) [25]uint64 { var c0, c1, c2, c3, c4, d uint64 var r [25]uint64 c0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] c1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] c2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] c3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] c4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] d = c4 ^ (c1<<1 | c1>>(64-1)) r[0] = a[0] ^ d r[5] = a[5] ^ d r[10] = a[10] ^ d r[15] = a[15] ^ d r[20] = a[20] ^ d d = c0 ^ (c2<<1 | c2>>(64-1)) r[1] = a[1] ^ d r[6] = a[6] ^ d r[11] = a[11] ^ d r[16] = a[16] ^ d r[21] = a[21] ^ d d = c1 ^ (c3<<1 | c3>>(64-1)) r[2] = a[2] ^ d r[7] = a[7] ^ d r[12] = a[12] ^ d r[17] = a[17] ^ d r[22] = a[22] ^ d d = c2 ^ (c4<<1 | c4>>(64-1)) r[3] = a[3] ^ d r[8] = a[8] ^ d r[13] = a[13] ^ d r[18] = a[18] ^ d r[23] = a[23] ^ d d = c3 ^ (c0<<1 | c0>>(64-1)) r[4] = a[4] ^ d r[9] = a[9] ^ d r[14] = a[14] ^ d r[19] = a[19] ^ d r[24] = a[24] ^ d return r } func rhopiU64Version(a [25]uint64) [25]uint64 { var t uint64 t = a[1] t, a[10] = a[10], t<<1|t>>(64-1) t, a[7] = a[7], t<<3|t>>(64-3) t, a[11] = a[11], t<<6|t>>(64-6) t, a[17] = a[17], t<<10|t>>(64-10) t, a[18] = a[18], t<<15|t>>(64-15) t, a[3] = a[3], t<<21|t>>(64-21) t, a[5] = a[5], t<<28|t>>(64-28) t, a[16] = a[16], t<<36|t>>(64-36) t, a[8] = a[8], t<<45|t>>(64-45) t, a[21] = a[21], t<<55|t>>(64-55) t, a[24] = a[24], t<<2|t>>(64-2) t, a[4] = a[4], t<<14|t>>(64-14) t, a[15] = a[15], t<<27|t>>(64-27) t, a[23] = a[23], t<<41|t>>(64-41) t, a[19] = a[19], t<<56|t>>(64-56) t, a[13] = a[13], t<<8|t>>(64-8) t, a[12] = a[12], t<<25|t>>(64-25) t, a[2] = a[2], t<<43|t>>(64-43) t, a[20] = a[20], t<<62|t>>(64-62) t, a[14] = a[14], t<<18|t>>(64-18) t, a[22] = a[22], t<<39|t>>(64-39) t, a[9] = a[9], t<<61|t>>(64-61) t, a[6] = a[6], t<<20|t>>(64-20) a[1] = t<<44 | t>>(64-44) return a } func chiU64Version(a [25]uint64) [25]uint64 { var bc0, bc1, bc2, bc3, bc4 uint64 bc0 = a[0] bc1 = a[1] bc2 = a[2] bc3 = a[3] bc4 = a[4] a[0] ^= (^bc1) & bc2 a[1] ^= (^bc2) & bc3 a[2] ^= (^bc3) & bc4 a[3] ^= (^bc4) & bc0 a[4] ^= (^bc0) & bc1 bc0 = a[5] bc1 = a[6] bc2 = a[7] bc3 = a[8] bc4 = a[9] a[5] ^= (^bc1) & bc2 a[6] ^= (^bc2) & bc3 a[7] ^= (^bc3) & bc4 a[8] ^= (^bc4) & bc0 a[9] ^= (^bc0) & bc1 bc0 = a[10] bc1 = a[11] bc2 = a[12] bc3 = a[13] bc4 = a[14] a[10] ^= (^bc1) & bc2 a[11] ^= (^bc2) & bc3 a[12] ^= (^bc3) & bc4 a[13] ^= (^bc4) & bc0 a[14] ^= (^bc0) & bc1 bc0 = a[15] bc1 = a[16] bc2 = a[17] bc3 = a[18] bc4 = a[19] a[15] ^= (^bc1) & bc2 a[16] ^= (^bc2) & bc3 a[17] ^= (^bc3) & bc4 a[18] ^= (^bc4) & bc0 a[19] ^= (^bc0) & bc1 bc0 = a[20] bc1 = a[21] bc2 = a[22] bc3 = a[23] bc4 = a[24] a[20] ^= (^bc1) & bc2 a[21] ^= (^bc2) & bc3 a[22] ^= (^bc3) & bc4 a[23] ^= (^bc4) & bc0 a[24] ^= (^bc0) & bc1 return a } func iotU64Version(a [25]uint64, r int) [25]uint64 { // iota a[0] ^= roundConstantsU64[r] return a }