arnaucube
arnaucube/keccak256-circomPublic Self-hosted repository
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}