You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

145 lines
3.2 KiB

/*
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
}