keccak256-circom/go-keccak256-bits-impl/stepmappings.go
go-keccak256-bits-impl/stepmappings.goRaw
1package keccak
2
3var roundConstantsU64 = []uint64{
4 0x0000000000000001, 0x0000000000008082, 0x800000000000808A,
5 0x8000000080008000, 0x000000000000808B, 0x0000000080000001,
6 0x8000000080008081, 0x8000000000008009, 0x000000000000008A,
7 0x0000000000000088, 0x0000000080008009, 0x000000008000000A,
8 0x000000008000808B, 0x800000000000008B, 0x8000000000008089,
9 0x8000000000008003, 0x8000000000008002, 0x8000000000000080,
10 0x000000000000800A, 0x800000008000000A, 0x8000000080008081,
11 0x8000000000008080, 0x0000000080000001, 0x8000000080008008,
12}
13
14var roundConstants = u64ArrayToBits(roundConstantsU64)
15
16func theta(a [25 * 64]bool) [25 * 64]bool {
17 var c0, c1, c2, c3, c4, d [64]bool
18 var r [25 * 64]bool
19
20 copy(c0[:], xor(xor(xor(xor(a[0:1*64], a[5*64:6*64]), a[10*64:11*64]), a[15*64:16*64]), a[20*64:21*64]))
21 copy(c1[:], xor(xor(xor(xor(a[1*64:2*64], a[6*64:7*64]), a[11*64:12*64]), a[16*64:17*64]), a[21*64:22*64]))
22 copy(c2[:], xor(xor(xor(xor(a[2*64:3*64], a[7*64:8*64]), a[12*64:13*64]), a[17*64:18*64]), a[22*64:23*64]))
23 copy(c3[:], xor(xor(xor(xor(a[3*64:4*64], a[8*64:9*64]), a[13*64:14*64]), a[18*64:19*64]), a[23*64:24*64]))
24 copy(c4[:], xor(xor(xor(xor(a[4*64:5*64], a[9*64:10*64]), a[14*64:15*64]), a[19*64:20*64]), a[24*64:25*64]))
25
26 copy(d[:], xor(c4[:], or(leftShift(c1[:], 1), rightShift(c1[:], (64-1)))))
27 copy(r[0:1*64], xor(a[0:1*64], d[:]))
28 copy(r[5*64:6*64], xor(a[5*64:6*64], d[:]))
29 copy(r[10*64:11*64], xor(a[10*64:11*64], d[:]))
30 copy(r[15*64:16*64], xor(a[15*64:16*64], d[:]))
31 copy(r[20*64:21*64], xor(a[20*64:21*64], d[:]))
32
33 copy(d[:], xor(c0[:], or(leftShift(c2[:], 1), rightShift(c2[:], (64-1)))))
34 copy(r[1*64:2*64], xor(a[1*64:2*64], d[:]))
35 copy(r[6*64:7*64], xor(a[6*64:7*64], d[:]))
36 copy(r[11*64:12*64], xor(a[11*64:12*64], d[:]))
37 copy(r[16*64:17*64], xor(a[16*64:17*64], d[:]))
38 copy(r[21*64:22*64], xor(a[21*64:22*64], d[:]))
39
40 copy(d[:], xor(c1[:], or(leftShift(c3[:], 1), rightShift(c3[:], (64-1)))))
41 copy(r[2*64:3*64], xor(a[2*64:3*64], d[:]))
42 copy(r[7*64:8*64], xor(a[7*64:8*64], d[:]))
43 copy(r[12*64:13*64], xor(a[12*64:13*64], d[:]))
44 copy(r[17*64:18*64], xor(a[17*64:18*64], d[:]))
45 copy(r[22*64:23*64], xor(a[22*64:23*64], d[:]))
46
47 copy(d[:], xor(c2[:], or(leftShift(c4[:], 1), rightShift(c4[:], (64-1)))))
48 copy(r[3*64:4*64], xor(a[3*64:4*64], d[:]))
49 copy(r[8*64:9*64], xor(a[8*64:9*64], d[:]))
50 copy(r[13*64:14*64], xor(a[13*64:14*64], d[:]))
51 copy(r[18*64:19*64], xor(a[18*64:19*64], d[:]))
52 copy(r[23*64:24*64], xor(a[23*64:24*64], d[:]))
53
54 copy(d[:], xor(c3[:], or(leftShift(c0[:], 1), rightShift(c0[:], (64-1)))))
55 copy(r[4*64:5*64], xor(a[4*64:5*64], d[:]))
56 copy(r[9*64:10*64], xor(a[9*64:10*64], d[:]))
57 copy(r[14*64:15*64], xor(a[14*64:15*64], d[:]))
58 copy(r[19*64:20*64], xor(a[19*64:20*64], d[:]))
59 copy(r[24*64:25*64], xor(a[24*64:25*64], d[:]))
60 return r
61}
62
63func rhopi(a [25 * 64]bool) [25 * 64]bool {
64 var t, tAux [64]bool
65 var r [25 * 64]bool
66
67 copy(r[0:1*64], a[0:1*64])
68
69 copy(t[:], a[1*64:2*64])
70
71 copy(tAux[:], a[10*64:11*64])
72 copy(r[10*64:11*64], or(leftShift(t[:], 1), rightShift(t[:], 64-1)))
73 copy(t[:], tAux[:])
74
75 copy(tAux[:], a[7*64:8*64])
76 copy(r[7*64:8*64], or(leftShift(t[:], 3), rightShift(t[:], 64-3)))
77 copy(t[:], tAux[:])
78
79 copy(tAux[:], a[11*64:12*64])
80 copy(r[11*64:12*64], or(leftShift(t[:], 6), rightShift(t[:], 64-6)))
81 copy(t[:], tAux[:])
82
83 copy(tAux[:], a[17*64:18*64])
84 copy(r[17*64:18*64], or(leftShift(t[:], 10), rightShift(t[:], 64-10)))
85 copy(t[:], tAux[:])
86
87 copy(tAux[:], a[18*64:19*64])
88 copy(r[18*64:19*64], or(leftShift(t[:], 15), rightShift(t[:], 64-15)))
89 copy(t[:], tAux[:])
90
91 copy(tAux[:], a[3*64:4*64])
92 copy(r[3*64:4*64], or(leftShift(t[:], 21), rightShift(t[:], 64-21)))
93 copy(t[:], tAux[:])
94
95 copy(tAux[:], a[5*64:6*64])
96 copy(r[5*64:6*64], or(leftShift(t[:], 28), rightShift(t[:], 64-28)))
97 copy(t[:], tAux[:])
98
99 copy(tAux[:], a[16*64:17*64])
100 copy(r[16*64:17*64], or(leftShift(t[:], 36), rightShift(t[:], 64-36)))
101 copy(t[:], tAux[:])
102
103 copy(tAux[:], a[8*64:9*64])
104 copy(r[8*64:9*64], or(leftShift(t[:], 45), rightShift(t[:], 64-45)))
105 copy(t[:], tAux[:])
106
107 copy(tAux[:], a[21*64:22*64])
108 copy(r[21*64:22*64], or(leftShift(t[:], 55), rightShift(t[:], 64-55)))
109 copy(t[:], tAux[:])
110
111 copy(tAux[:], a[24*64:25*64])
112 copy(r[24*64:25*64], or(leftShift(t[:], 2), rightShift(t[:], 64-2)))
113 copy(t[:], tAux[:])
114
115 copy(tAux[:], a[4*64:5*64])
116 copy(r[4*64:5*64], or(leftShift(t[:], 14), rightShift(t[:], 64-14)))
117 copy(t[:], tAux[:])
118
119 copy(tAux[:], a[15*64:16*64])
120 copy(r[15*64:16*64], or(leftShift(t[:], 27), rightShift(t[:], 64-27)))
121 copy(t[:], tAux[:])
122
123 copy(tAux[:], a[23*64:24*64])
124 copy(r[23*64:24*64], or(leftShift(t[:], 41), rightShift(t[:], 64-41)))
125 copy(t[:], tAux[:])
126
127 copy(tAux[:], a[19*64:20*64])
128 copy(r[19*64:20*64], or(leftShift(t[:], 56), rightShift(t[:], 64-56)))
129 copy(t[:], tAux[:])
130
131 copy(tAux[:], a[13*64:14*64])
132 copy(r[13*64:14*64], or(leftShift(t[:], 8), rightShift(t[:], 64-8)))
133 copy(t[:], tAux[:])
134
135 copy(tAux[:], a[12*64:13*64])
136 copy(r[12*64:13*64], or(leftShift(t[:], 25), rightShift(t[:], 64-25)))
137 copy(t[:], tAux[:])
138
139 copy(tAux[:], a[2*64:3*64])
140 copy(r[2*64:3*64], or(leftShift(t[:], 43), rightShift(t[:], 64-43)))
141 copy(t[:], tAux[:])
142
143 copy(tAux[:], a[20*64:21*64])
144 copy(r[20*64:21*64], or(leftShift(t[:], 62), rightShift(t[:], 64-62)))
145 copy(t[:], tAux[:])
146
147 copy(tAux[:], a[14*64:15*64])
148 copy(r[14*64:15*64], or(leftShift(t[:], 18), rightShift(t[:], 64-18)))
149 copy(t[:], tAux[:])
150
151 copy(tAux[:], a[22*64:23*64])
152 copy(r[22*64:23*64], or(leftShift(t[:], 39), rightShift(t[:], 64-39)))
153 copy(t[:], tAux[:])
154
155 copy(tAux[:], a[9*64:10*64])
156 copy(r[9*64:10*64], or(leftShift(t[:], 61), rightShift(t[:], 64-61)))
157 copy(t[:], tAux[:])
158
159 copy(tAux[:], a[6*64:7*64])
160 copy(r[6*64:7*64], or(leftShift(t[:], 20), rightShift(t[:], 64-20)))
161 copy(t[:], tAux[:])
162
163 copy(r[1*64:2*64], or(leftShift(t[:], 44), rightShift(t[:], 64-44)))
164 return r
165}
166
167func chi(a [25 * 64]bool) [25 * 64]bool {
168 var c0, c1, c2, c3, c4 [64]bool
169 var r [25 * 64]bool
170
171 copy(c0[:], a[0:1*64])
172 copy(c1[:], a[1*64:2*64])
173 copy(c2[:], a[2*64:3*64])
174 copy(c3[:], a[3*64:4*64])
175 copy(c4[:], a[4*64:5*64])
176
177 copy(r[0:1*64], xor(a[0:1*64], and(xorSingle(c1[:]), c2[:])))
178 copy(r[1*64:2*64], xor(a[1*64:2*64], and(xorSingle(c2[:]), c3[:])))
179 copy(r[2*64:3*64], xor(a[2*64:3*64], and(xorSingle(c3[:]), c4[:])))
180 copy(r[3*64:4*64], xor(a[3*64:4*64], and(xorSingle(c4[:]), c0[:])))
181 copy(r[4*64:5*64], xor(a[4*64:5*64], and(xorSingle(c0[:]), c1[:])))
182
183 copy(c0[:], a[5*64:6*64])
184 copy(c1[:], a[6*64:7*64])
185 copy(c2[:], a[7*64:8*64])
186 copy(c3[:], a[8*64:9*64])
187 copy(c4[:], a[9*64:10*64])
188
189 copy(r[5*64:6*64], xor(a[5*64:6*64], and(xorSingle(c1[:]), c2[:])))
190 copy(r[6*64:7*64], xor(a[6*64:7*64], and(xorSingle(c2[:]), c3[:])))
191 copy(r[7*64:8*64], xor(a[7*64:8*64], and(xorSingle(c3[:]), c4[:])))
192 copy(r[8*64:9*64], xor(a[8*64:9*64], and(xorSingle(c4[:]), c0[:])))
193 copy(r[9*64:10*64], xor(a[9*64:10*64], and(xorSingle(c0[:]), c1[:])))
194
195 copy(c0[:], a[10*64:11*64])
196 copy(c1[:], a[11*64:12*64])
197 copy(c2[:], a[12*64:13*64])
198 copy(c3[:], a[13*64:14*64])
199 copy(c4[:], a[14*64:15*64])
200
201 copy(r[10*64:11*64], xor(a[10*64:11*64], and(xorSingle(c1[:]), c2[:])))
202 copy(r[11*64:12*64], xor(a[11*64:12*64], and(xorSingle(c2[:]), c3[:])))
203 copy(r[12*64:13*64], xor(a[12*64:13*64], and(xorSingle(c3[:]), c4[:])))
204 copy(r[13*64:14*64], xor(a[13*64:14*64], and(xorSingle(c4[:]), c0[:])))
205 copy(r[14*64:15*64], xor(a[14*64:15*64], and(xorSingle(c0[:]), c1[:])))
206
207 copy(c0[:], a[15*64:16*64])
208 copy(c1[:], a[16*64:17*64])
209 copy(c2[:], a[17*64:18*64])
210 copy(c3[:], a[18*64:19*64])
211 copy(c4[:], a[19*64:20*64])
212
213 copy(r[15*64:16*64], xor(a[15*64:16*64], and(xorSingle(c1[:]), c2[:])))
214 copy(r[16*64:17*64], xor(a[16*64:17*64], and(xorSingle(c2[:]), c3[:])))
215 copy(r[17*64:18*64], xor(a[17*64:18*64], and(xorSingle(c3[:]), c4[:])))
216 copy(r[18*64:19*64], xor(a[18*64:19*64], and(xorSingle(c4[:]), c0[:])))
217 copy(r[19*64:20*64], xor(a[19*64:20*64], and(xorSingle(c0[:]), c1[:])))
218
219 copy(c0[:], a[20*64:21*64])
220 copy(c1[:], a[21*64:22*64])
221 copy(c2[:], a[22*64:23*64])
222 copy(c3[:], a[23*64:24*64])
223 copy(c4[:], a[24*64:25*64])
224
225 copy(r[20*64:21*64], xor(a[20*64:21*64], and(xorSingle(c1[:]), c2[:])))
226 copy(r[21*64:22*64], xor(a[21*64:22*64], and(xorSingle(c2[:]), c3[:])))
227 copy(r[22*64:23*64], xor(a[22*64:23*64], and(xorSingle(c3[:]), c4[:])))
228 copy(r[23*64:24*64], xor(a[23*64:24*64], and(xorSingle(c4[:]), c0[:])))
229 copy(r[24*64:25*64], xor(a[24*64:25*64], and(xorSingle(c0[:]), c1[:])))
230 return r
231}
232
233func iot(a [25 * 64]bool, r int) [25 * 64]bool {
234 // iota
235 copy(a[0:64], xor(a[0:64], roundConstants[r*64:r*64+64]))
236 return a
237}