arnaucube
arnaucube/keccak256-circomPublic Self-hosted repository
keccak256-circom/go-keccak256-bits-impl/stepmappingsRef.go
go-keccak256-bits-impl/stepmappingsRef.goRaw
  1/*
  2This file contains the byte & uint64 implementations that are used as reference
  3to test the bits implementations of the other files.
  4
  5The methods in this file (thetaU64Version, rhopiU64Version, chiU64Version,
  6iotU64Version) are modified versions of methods from: https://github.com/ebfe/keccak
  7*/
  8package keccak
  9
 10func thetaU64Version(a [25]uint64) [25]uint64 {
 11	var c0, c1, c2, c3, c4, d uint64
 12	var r [25]uint64
 13	c0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
 14	c1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
 15	c2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
 16	c3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
 17	c4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
 18
 19	d = c4 ^ (c1<<1 | c1>>(64-1))
 20	r[0] = a[0] ^ d
 21	r[5] = a[5] ^ d
 22	r[10] = a[10] ^ d
 23	r[15] = a[15] ^ d
 24	r[20] = a[20] ^ d
 25
 26	d = c0 ^ (c2<<1 | c2>>(64-1))
 27	r[1] = a[1] ^ d
 28	r[6] = a[6] ^ d
 29	r[11] = a[11] ^ d
 30	r[16] = a[16] ^ d
 31	r[21] = a[21] ^ d
 32
 33	d = c1 ^ (c3<<1 | c3>>(64-1))
 34	r[2] = a[2] ^ d
 35	r[7] = a[7] ^ d
 36	r[12] = a[12] ^ d
 37	r[17] = a[17] ^ d
 38	r[22] = a[22] ^ d
 39
 40	d = c2 ^ (c4<<1 | c4>>(64-1))
 41	r[3] = a[3] ^ d
 42	r[8] = a[8] ^ d
 43	r[13] = a[13] ^ d
 44	r[18] = a[18] ^ d
 45	r[23] = a[23] ^ d
 46
 47	d = c3 ^ (c0<<1 | c0>>(64-1))
 48	r[4] = a[4] ^ d
 49	r[9] = a[9] ^ d
 50	r[14] = a[14] ^ d
 51	r[19] = a[19] ^ d
 52	r[24] = a[24] ^ d
 53	return r
 54}
 55
 56func rhopiU64Version(a [25]uint64) [25]uint64 {
 57	var t uint64
 58	t = a[1]
 59	t, a[10] = a[10], t<<1|t>>(64-1)
 60	t, a[7] = a[7], t<<3|t>>(64-3)
 61	t, a[11] = a[11], t<<6|t>>(64-6)
 62	t, a[17] = a[17], t<<10|t>>(64-10)
 63	t, a[18] = a[18], t<<15|t>>(64-15)
 64	t, a[3] = a[3], t<<21|t>>(64-21)
 65	t, a[5] = a[5], t<<28|t>>(64-28)
 66	t, a[16] = a[16], t<<36|t>>(64-36)
 67	t, a[8] = a[8], t<<45|t>>(64-45)
 68	t, a[21] = a[21], t<<55|t>>(64-55)
 69	t, a[24] = a[24], t<<2|t>>(64-2)
 70	t, a[4] = a[4], t<<14|t>>(64-14)
 71	t, a[15] = a[15], t<<27|t>>(64-27)
 72	t, a[23] = a[23], t<<41|t>>(64-41)
 73	t, a[19] = a[19], t<<56|t>>(64-56)
 74	t, a[13] = a[13], t<<8|t>>(64-8)
 75	t, a[12] = a[12], t<<25|t>>(64-25)
 76	t, a[2] = a[2], t<<43|t>>(64-43)
 77	t, a[20] = a[20], t<<62|t>>(64-62)
 78	t, a[14] = a[14], t<<18|t>>(64-18)
 79	t, a[22] = a[22], t<<39|t>>(64-39)
 80	t, a[9] = a[9], t<<61|t>>(64-61)
 81	t, a[6] = a[6], t<<20|t>>(64-20)
 82	a[1] = t<<44 | t>>(64-44)
 83	return a
 84}
 85
 86func chiU64Version(a [25]uint64) [25]uint64 {
 87	var bc0, bc1, bc2, bc3, bc4 uint64
 88	bc0 = a[0]
 89	bc1 = a[1]
 90	bc2 = a[2]
 91	bc3 = a[3]
 92	bc4 = a[4]
 93	a[0] ^= (^bc1) & bc2
 94	a[1] ^= (^bc2) & bc3
 95	a[2] ^= (^bc3) & bc4
 96	a[3] ^= (^bc4) & bc0
 97	a[4] ^= (^bc0) & bc1
 98	bc0 = a[5]
 99	bc1 = a[6]
100	bc2 = a[7]
101	bc3 = a[8]
102	bc4 = a[9]
103	a[5] ^= (^bc1) & bc2
104	a[6] ^= (^bc2) & bc3
105	a[7] ^= (^bc3) & bc4
106	a[8] ^= (^bc4) & bc0
107	a[9] ^= (^bc0) & bc1
108	bc0 = a[10]
109	bc1 = a[11]
110	bc2 = a[12]
111	bc3 = a[13]
112	bc4 = a[14]
113	a[10] ^= (^bc1) & bc2
114	a[11] ^= (^bc2) & bc3
115	a[12] ^= (^bc3) & bc4
116	a[13] ^= (^bc4) & bc0
117	a[14] ^= (^bc0) & bc1
118	bc0 = a[15]
119	bc1 = a[16]
120	bc2 = a[17]
121	bc3 = a[18]
122	bc4 = a[19]
123	a[15] ^= (^bc1) & bc2
124	a[16] ^= (^bc2) & bc3
125	a[17] ^= (^bc3) & bc4
126	a[18] ^= (^bc4) & bc0
127	a[19] ^= (^bc0) & bc1
128	bc0 = a[20]
129	bc1 = a[21]
130	bc2 = a[22]
131	bc3 = a[23]
132	bc4 = a[24]
133	a[20] ^= (^bc1) & bc2
134	a[21] ^= (^bc2) & bc3
135	a[22] ^= (^bc3) & bc4
136	a[23] ^= (^bc4) & bc0
137	a[24] ^= (^bc0) & bc1
138	return a
139}
140
141func iotU64Version(a [25]uint64, r int) [25]uint64 {
142	// iota
143	a[0] ^= roundConstantsU64[r]
144	return a
145}