1
// Copyright 2014 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
5
//go:build !amd64 || purego || !gc
11
// rc stores the round constants for use in the ι step.
39
// keccakF1600 applies the Keccak permutation to a 1600b-wide
40
// state represented as a slice of 25 uint64s.
41
func keccakF1600(a *[25]uint64) {
42
// Implementation translated from Keccak-inplace.c
43
// in the keccak reference code.
44
var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64
46
for i := 0; i < 24; i += 4 {
47
// Combines the 5 steps in each round into 2 steps.
48
// Unrolls 4 rounds per loop and spreads some steps across rounds.
51
bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
52
bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
53
bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
54
bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
55
bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
56
d0 = bc4 ^ (bc1<<1 | bc1>>63)
57
d1 = bc0 ^ (bc2<<1 | bc2>>63)
58
d2 = bc1 ^ (bc3<<1 | bc3>>63)
59
d3 = bc2 ^ (bc4<<1 | bc4>>63)
60
d4 = bc3 ^ (bc0<<1 | bc0>>63)
64
bc1 = bits.RotateLeft64(t, 44)
66
bc2 = bits.RotateLeft64(t, 43)
68
bc3 = bits.RotateLeft64(t, 21)
70
bc4 = bits.RotateLeft64(t, 14)
71
a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i]
72
a[6] = bc1 ^ (bc3 &^ bc2)
73
a[12] = bc2 ^ (bc4 &^ bc3)
74
a[18] = bc3 ^ (bc0 &^ bc4)
75
a[24] = bc4 ^ (bc1 &^ bc0)
78
bc2 = bits.RotateLeft64(t, 3)
80
bc3 = bits.RotateLeft64(t, 45)
82
bc4 = bits.RotateLeft64(t, 61)
84
bc0 = bits.RotateLeft64(t, 28)
86
bc1 = bits.RotateLeft64(t, 20)
87
a[10] = bc0 ^ (bc2 &^ bc1)
88
a[16] = bc1 ^ (bc3 &^ bc2)
89
a[22] = bc2 ^ (bc4 &^ bc3)
90
a[3] = bc3 ^ (bc0 &^ bc4)
91
a[9] = bc4 ^ (bc1 &^ bc0)
94
bc4 = bits.RotateLeft64(t, 18)
96
bc0 = bits.RotateLeft64(t, 1)
98
bc1 = bits.RotateLeft64(t, 6)
100
bc2 = bits.RotateLeft64(t, 25)
102
bc3 = bits.RotateLeft64(t, 8)
103
a[20] = bc0 ^ (bc2 &^ bc1)
104
a[1] = bc1 ^ (bc3 &^ bc2)
105
a[7] = bc2 ^ (bc4 &^ bc3)
106
a[13] = bc3 ^ (bc0 &^ bc4)
107
a[19] = bc4 ^ (bc1 &^ bc0)
110
bc1 = bits.RotateLeft64(t, 36)
112
bc2 = bits.RotateLeft64(t, 10)
114
bc3 = bits.RotateLeft64(t, 15)
116
bc4 = bits.RotateLeft64(t, 56)
118
bc0 = bits.RotateLeft64(t, 27)
119
a[5] = bc0 ^ (bc2 &^ bc1)
120
a[11] = bc1 ^ (bc3 &^ bc2)
121
a[17] = bc2 ^ (bc4 &^ bc3)
122
a[23] = bc3 ^ (bc0 &^ bc4)
123
a[4] = bc4 ^ (bc1 &^ bc0)
126
bc3 = bits.RotateLeft64(t, 41)
128
bc4 = bits.RotateLeft64(t, 2)
130
bc0 = bits.RotateLeft64(t, 62)
132
bc1 = bits.RotateLeft64(t, 55)
134
bc2 = bits.RotateLeft64(t, 39)
135
a[15] = bc0 ^ (bc2 &^ bc1)
136
a[21] = bc1 ^ (bc3 &^ bc2)
137
a[2] = bc2 ^ (bc4 &^ bc3)
138
a[8] = bc3 ^ (bc0 &^ bc4)
139
a[14] = bc4 ^ (bc1 &^ bc0)
142
bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
143
bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
144
bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
145
bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
146
bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
147
d0 = bc4 ^ (bc1<<1 | bc1>>63)
148
d1 = bc0 ^ (bc2<<1 | bc2>>63)
149
d2 = bc1 ^ (bc3<<1 | bc3>>63)
150
d3 = bc2 ^ (bc4<<1 | bc4>>63)
151
d4 = bc3 ^ (bc0<<1 | bc0>>63)
155
bc1 = bits.RotateLeft64(t, 44)
157
bc2 = bits.RotateLeft64(t, 43)
159
bc3 = bits.RotateLeft64(t, 21)
161
bc4 = bits.RotateLeft64(t, 14)
162
a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1]
163
a[16] = bc1 ^ (bc3 &^ bc2)
164
a[7] = bc2 ^ (bc4 &^ bc3)
165
a[23] = bc3 ^ (bc0 &^ bc4)
166
a[14] = bc4 ^ (bc1 &^ bc0)
169
bc2 = bits.RotateLeft64(t, 3)
171
bc3 = bits.RotateLeft64(t, 45)
173
bc4 = bits.RotateLeft64(t, 61)
175
bc0 = bits.RotateLeft64(t, 28)
177
bc1 = bits.RotateLeft64(t, 20)
178
a[20] = bc0 ^ (bc2 &^ bc1)
179
a[11] = bc1 ^ (bc3 &^ bc2)
180
a[2] = bc2 ^ (bc4 &^ bc3)
181
a[18] = bc3 ^ (bc0 &^ bc4)
182
a[9] = bc4 ^ (bc1 &^ bc0)
185
bc4 = bits.RotateLeft64(t, 18)
187
bc0 = bits.RotateLeft64(t, 1)
189
bc1 = bits.RotateLeft64(t, 6)
191
bc2 = bits.RotateLeft64(t, 25)
193
bc3 = bits.RotateLeft64(t, 8)
194
a[15] = bc0 ^ (bc2 &^ bc1)
195
a[6] = bc1 ^ (bc3 &^ bc2)
196
a[22] = bc2 ^ (bc4 &^ bc3)
197
a[13] = bc3 ^ (bc0 &^ bc4)
198
a[4] = bc4 ^ (bc1 &^ bc0)
201
bc1 = bits.RotateLeft64(t, 36)
203
bc2 = bits.RotateLeft64(t, 10)
205
bc3 = bits.RotateLeft64(t, 15)
207
bc4 = bits.RotateLeft64(t, 56)
209
bc0 = bits.RotateLeft64(t, 27)
210
a[10] = bc0 ^ (bc2 &^ bc1)
211
a[1] = bc1 ^ (bc3 &^ bc2)
212
a[17] = bc2 ^ (bc4 &^ bc3)
213
a[8] = bc3 ^ (bc0 &^ bc4)
214
a[24] = bc4 ^ (bc1 &^ bc0)
217
bc3 = bits.RotateLeft64(t, 41)
219
bc4 = bits.RotateLeft64(t, 2)
221
bc0 = bits.RotateLeft64(t, 62)
223
bc1 = bits.RotateLeft64(t, 55)
225
bc2 = bits.RotateLeft64(t, 39)
226
a[5] = bc0 ^ (bc2 &^ bc1)
227
a[21] = bc1 ^ (bc3 &^ bc2)
228
a[12] = bc2 ^ (bc4 &^ bc3)
229
a[3] = bc3 ^ (bc0 &^ bc4)
230
a[19] = bc4 ^ (bc1 &^ bc0)
233
bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
234
bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
235
bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
236
bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
237
bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
238
d0 = bc4 ^ (bc1<<1 | bc1>>63)
239
d1 = bc0 ^ (bc2<<1 | bc2>>63)
240
d2 = bc1 ^ (bc3<<1 | bc3>>63)
241
d3 = bc2 ^ (bc4<<1 | bc4>>63)
242
d4 = bc3 ^ (bc0<<1 | bc0>>63)
246
bc1 = bits.RotateLeft64(t, 44)
248
bc2 = bits.RotateLeft64(t, 43)
250
bc3 = bits.RotateLeft64(t, 21)
252
bc4 = bits.RotateLeft64(t, 14)
253
a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2]
254
a[11] = bc1 ^ (bc3 &^ bc2)
255
a[22] = bc2 ^ (bc4 &^ bc3)
256
a[8] = bc3 ^ (bc0 &^ bc4)
257
a[19] = bc4 ^ (bc1 &^ bc0)
260
bc2 = bits.RotateLeft64(t, 3)
262
bc3 = bits.RotateLeft64(t, 45)
264
bc4 = bits.RotateLeft64(t, 61)
266
bc0 = bits.RotateLeft64(t, 28)
268
bc1 = bits.RotateLeft64(t, 20)
269
a[15] = bc0 ^ (bc2 &^ bc1)
270
a[1] = bc1 ^ (bc3 &^ bc2)
271
a[12] = bc2 ^ (bc4 &^ bc3)
272
a[23] = bc3 ^ (bc0 &^ bc4)
273
a[9] = bc4 ^ (bc1 &^ bc0)
276
bc4 = bits.RotateLeft64(t, 18)
278
bc0 = bits.RotateLeft64(t, 1)
280
bc1 = bits.RotateLeft64(t, 6)
282
bc2 = bits.RotateLeft64(t, 25)
284
bc3 = bits.RotateLeft64(t, 8)
285
a[5] = bc0 ^ (bc2 &^ bc1)
286
a[16] = bc1 ^ (bc3 &^ bc2)
287
a[2] = bc2 ^ (bc4 &^ bc3)
288
a[13] = bc3 ^ (bc0 &^ bc4)
289
a[24] = bc4 ^ (bc1 &^ bc0)
292
bc1 = bits.RotateLeft64(t, 36)
294
bc2 = bits.RotateLeft64(t, 10)
296
bc3 = bits.RotateLeft64(t, 15)
298
bc4 = bits.RotateLeft64(t, 56)
300
bc0 = bits.RotateLeft64(t, 27)
301
a[20] = bc0 ^ (bc2 &^ bc1)
302
a[6] = bc1 ^ (bc3 &^ bc2)
303
a[17] = bc2 ^ (bc4 &^ bc3)
304
a[3] = bc3 ^ (bc0 &^ bc4)
305
a[14] = bc4 ^ (bc1 &^ bc0)
308
bc3 = bits.RotateLeft64(t, 41)
310
bc4 = bits.RotateLeft64(t, 2)
312
bc0 = bits.RotateLeft64(t, 62)
314
bc1 = bits.RotateLeft64(t, 55)
316
bc2 = bits.RotateLeft64(t, 39)
317
a[10] = bc0 ^ (bc2 &^ bc1)
318
a[21] = bc1 ^ (bc3 &^ bc2)
319
a[7] = bc2 ^ (bc4 &^ bc3)
320
a[18] = bc3 ^ (bc0 &^ bc4)
321
a[4] = bc4 ^ (bc1 &^ bc0)
324
bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]
325
bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]
326
bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]
327
bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]
328
bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]
329
d0 = bc4 ^ (bc1<<1 | bc1>>63)
330
d1 = bc0 ^ (bc2<<1 | bc2>>63)
331
d2 = bc1 ^ (bc3<<1 | bc3>>63)
332
d3 = bc2 ^ (bc4<<1 | bc4>>63)
333
d4 = bc3 ^ (bc0<<1 | bc0>>63)
337
bc1 = bits.RotateLeft64(t, 44)
339
bc2 = bits.RotateLeft64(t, 43)
341
bc3 = bits.RotateLeft64(t, 21)
343
bc4 = bits.RotateLeft64(t, 14)
344
a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3]
345
a[1] = bc1 ^ (bc3 &^ bc2)
346
a[2] = bc2 ^ (bc4 &^ bc3)
347
a[3] = bc3 ^ (bc0 &^ bc4)
348
a[4] = bc4 ^ (bc1 &^ bc0)
351
bc2 = bits.RotateLeft64(t, 3)
353
bc3 = bits.RotateLeft64(t, 45)
355
bc4 = bits.RotateLeft64(t, 61)
357
bc0 = bits.RotateLeft64(t, 28)
359
bc1 = bits.RotateLeft64(t, 20)
360
a[5] = bc0 ^ (bc2 &^ bc1)
361
a[6] = bc1 ^ (bc3 &^ bc2)
362
a[7] = bc2 ^ (bc4 &^ bc3)
363
a[8] = bc3 ^ (bc0 &^ bc4)
364
a[9] = bc4 ^ (bc1 &^ bc0)
367
bc4 = bits.RotateLeft64(t, 18)
369
bc0 = bits.RotateLeft64(t, 1)
371
bc1 = bits.RotateLeft64(t, 6)
373
bc2 = bits.RotateLeft64(t, 25)
375
bc3 = bits.RotateLeft64(t, 8)
376
a[10] = bc0 ^ (bc2 &^ bc1)
377
a[11] = bc1 ^ (bc3 &^ bc2)
378
a[12] = bc2 ^ (bc4 &^ bc3)
379
a[13] = bc3 ^ (bc0 &^ bc4)
380
a[14] = bc4 ^ (bc1 &^ bc0)
383
bc1 = bits.RotateLeft64(t, 36)
385
bc2 = bits.RotateLeft64(t, 10)
387
bc3 = bits.RotateLeft64(t, 15)
389
bc4 = bits.RotateLeft64(t, 56)
391
bc0 = bits.RotateLeft64(t, 27)
392
a[15] = bc0 ^ (bc2 &^ bc1)
393
a[16] = bc1 ^ (bc3 &^ bc2)
394
a[17] = bc2 ^ (bc4 &^ bc3)
395
a[18] = bc3 ^ (bc0 &^ bc4)
396
a[19] = bc4 ^ (bc1 &^ bc0)
399
bc3 = bits.RotateLeft64(t, 41)
401
bc4 = bits.RotateLeft64(t, 2)
403
bc0 = bits.RotateLeft64(t, 62)
405
bc1 = bits.RotateLeft64(t, 55)
407
bc2 = bits.RotateLeft64(t, 39)
408
a[20] = bc0 ^ (bc2 &^ bc1)
409
a[21] = bc1 ^ (bc3 &^ bc2)
410
a[22] = bc2 ^ (bc4 &^ bc3)
411
a[23] = bc3 ^ (bc0 &^ bc4)
412
a[24] = bc4 ^ (bc1 &^ bc0)