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