1 // Copyright 2015 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.
4
5 //go:build amd64 && !purego && gc
6
7 // This code was translated into a form compatible with 6a from the public
8 // domain sources at https://github.com/gvanas/KeccakCodePackage
9
10 // Offsets in state
11 #define _ba (0*8)
12 #define _be (1*8)
13 #define _bi (2*8)
14 #define _bo (3*8)
15 #define _bu (4*8)
16 #define _ga (5*8)
17 #define _ge (6*8)
18 #define _gi (7*8)
19 #define _go (8*8)
20 #define _gu (9*8)
21 #define _ka (10*8)
22 #define _ke (11*8)
23 #define _ki (12*8)
24 #define _ko (13*8)
25 #define _ku (14*8)
26 #define _ma (15*8)
27 #define _me (16*8)
28 #define _mi (17*8)
29 #define _mo (18*8)
30 #define _mu (19*8)
31 #define _sa (20*8)
32 #define _se (21*8)
33 #define _si (22*8)
34 #define _so (23*8)
35 #define _su (24*8)
36
37 // Temporary registers
38 #define rT1 AX
39
40 // Round vars
41 #define rpState DI
42 #define rpStack SP
43
44 #define rDa BX
45 #define rDe CX
46 #define rDi DX
47 #define rDo R8
48 #define rDu R9
49
50 #define rBa R10
51 #define rBe R11
52 #define rBi R12
53 #define rBo R13
54 #define rBu R14
55
56 #define rCa SI
57 #define rCe BP
58 #define rCi rBi
59 #define rCo rBo
60 #define rCu R15
61
62 #define MOVQ_RBI_RCE MOVQ rBi, rCe
63 #define XORQ_RT1_RCA XORQ rT1, rCa
64 #define XORQ_RT1_RCE XORQ rT1, rCe
65 #define XORQ_RBA_RCU XORQ rBa, rCu
66 #define XORQ_RBE_RCU XORQ rBe, rCu
67 #define XORQ_RDU_RCU XORQ rDu, rCu
68 #define XORQ_RDA_RCA XORQ rDa, rCa
69 #define XORQ_RDE_RCE XORQ rDe, rCe
70
71 #define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \
72 /* Prepare round */ \
73 MOVQ rCe, rDa; \
74 ROLQ $1, rDa; \
75 \
76 MOVQ _bi(iState), rCi; \
77 XORQ _gi(iState), rDi; \
78 XORQ rCu, rDa; \
79 XORQ _ki(iState), rCi; \
80 XORQ _mi(iState), rDi; \
81 XORQ rDi, rCi; \
82 \
83 MOVQ rCi, rDe; \
84 ROLQ $1, rDe; \
85 \
86 MOVQ _bo(iState), rCo; \
87 XORQ _go(iState), rDo; \
88 XORQ rCa, rDe; \
89 XORQ _ko(iState), rCo; \
90 XORQ _mo(iState), rDo; \
91 XORQ rDo, rCo; \
92 \
93 MOVQ rCo, rDi; \
94 ROLQ $1, rDi; \
95 \
96 MOVQ rCu, rDo; \
97 XORQ rCe, rDi; \
98 ROLQ $1, rDo; \
99 \
100 MOVQ rCa, rDu; \
101 XORQ rCi, rDo; \
102 ROLQ $1, rDu; \
103 \
104 /* Result b */ \
105 MOVQ _ba(iState), rBa; \
106 MOVQ _ge(iState), rBe; \
107 XORQ rCo, rDu; \
108 MOVQ _ki(iState), rBi; \
109 MOVQ _mo(iState), rBo; \
110 MOVQ _su(iState), rBu; \
111 XORQ rDe, rBe; \
112 ROLQ $44, rBe; \
113 XORQ rDi, rBi; \
114 XORQ rDa, rBa; \
115 ROLQ $43, rBi; \
116 \
117 MOVQ rBe, rCa; \
118 MOVQ rc, rT1; \
119 ORQ rBi, rCa; \
120 XORQ rBa, rT1; \
121 XORQ rT1, rCa; \
122 MOVQ rCa, _ba(oState); \
123 \
124 XORQ rDu, rBu; \
125 ROLQ $14, rBu; \
126 MOVQ rBa, rCu; \
127 ANDQ rBe, rCu; \
128 XORQ rBu, rCu; \
129 MOVQ rCu, _bu(oState); \
130 \
131 XORQ rDo, rBo; \
132 ROLQ $21, rBo; \
133 MOVQ rBo, rT1; \
134 ANDQ rBu, rT1; \
135 XORQ rBi, rT1; \
136 MOVQ rT1, _bi(oState); \
137 \
138 NOTQ rBi; \
139 ORQ rBa, rBu; \
140 ORQ rBo, rBi; \
141 XORQ rBo, rBu; \
142 XORQ rBe, rBi; \
143 MOVQ rBu, _bo(oState); \
144 MOVQ rBi, _be(oState); \
145 B_RBI_RCE; \
146 \
147 /* Result g */ \
148 MOVQ _gu(iState), rBe; \
149 XORQ rDu, rBe; \
150 MOVQ _ka(iState), rBi; \
151 ROLQ $20, rBe; \
152 XORQ rDa, rBi; \
153 ROLQ $3, rBi; \
154 MOVQ _bo(iState), rBa; \
155 MOVQ rBe, rT1; \
156 ORQ rBi, rT1; \
157 XORQ rDo, rBa; \
158 MOVQ _me(iState), rBo; \
159 MOVQ _si(iState), rBu; \
160 ROLQ $28, rBa; \
161 XORQ rBa, rT1; \
162 MOVQ rT1, _ga(oState); \
163 G_RT1_RCA; \
164 \
165 XORQ rDe, rBo; \
166 ROLQ $45, rBo; \
167 MOVQ rBi, rT1; \
168 ANDQ rBo, rT1; \
169 XORQ rBe, rT1; \
170 MOVQ rT1, _ge(oState); \
171 G_RT1_RCE; \
172 \
173 XORQ rDi, rBu; \
174 ROLQ $61, rBu; \
175 MOVQ rBu, rT1; \
176 ORQ rBa, rT1; \
177 XORQ rBo, rT1; \
178 MOVQ rT1, _go(oState); \
179 \
180 ANDQ rBe, rBa; \
181 XORQ rBu, rBa; \
182 MOVQ rBa, _gu(oState); \
183 NOTQ rBu; \
184 G_RBA_RCU; \
185 \
186 ORQ rBu, rBo; \
187 XORQ rBi, rBo; \
188 MOVQ rBo, _gi(oState); \
189 \
190 /* Result k */ \
191 MOVQ _be(iState), rBa; \
192 MOVQ _gi(iState), rBe; \
193 MOVQ _ko(iState), rBi; \
194 MOVQ _mu(iState), rBo; \
195 MOVQ _sa(iState), rBu; \
196 XORQ rDi, rBe; \
197 ROLQ $6, rBe; \
198 XORQ rDo, rBi; \
199 ROLQ $25, rBi; \
200 MOVQ rBe, rT1; \
201 ORQ rBi, rT1; \
202 XORQ rDe, rBa; \
203 ROLQ $1, rBa; \
204 XORQ rBa, rT1; \
205 MOVQ rT1, _ka(oState); \
206 K_RT1_RCA; \
207 \
208 XORQ rDu, rBo; \
209 ROLQ $8, rBo; \
210 MOVQ rBi, rT1; \
211 ANDQ rBo, rT1; \
212 XORQ rBe, rT1; \
213 MOVQ rT1, _ke(oState); \
214 K_RT1_RCE; \
215 \
216 XORQ rDa, rBu; \
217 ROLQ $18, rBu; \
218 NOTQ rBo; \
219 MOVQ rBo, rT1; \
220 ANDQ rBu, rT1; \
221 XORQ rBi, rT1; \
222 MOVQ rT1, _ki(oState); \
223 \
224 MOVQ rBu, rT1; \
225 ORQ rBa, rT1; \
226 XORQ rBo, rT1; \
227 MOVQ rT1, _ko(oState); \
228 \
229 ANDQ rBe, rBa; \
230 XORQ rBu, rBa; \
231 MOVQ rBa, _ku(oState); \
232 K_RBA_RCU; \
233 \
234 /* Result m */ \
235 MOVQ _ga(iState), rBe; \
236 XORQ rDa, rBe; \
237 MOVQ _ke(iState), rBi; \
238 ROLQ $36, rBe; \
239 XORQ rDe, rBi; \
240 MOVQ _bu(iState), rBa; \
241 ROLQ $10, rBi; \
242 MOVQ rBe, rT1; \
243 MOVQ _mi(iState), rBo; \
244 ANDQ rBi, rT1; \
245 XORQ rDu, rBa; \
246 MOVQ _so(iState), rBu; \
247 ROLQ $27, rBa; \
248 XORQ rBa, rT1; \
249 MOVQ rT1, _ma(oState); \
250 M_RT1_RCA; \
251 \
252 XORQ rDi, rBo; \
253 ROLQ $15, rBo; \
254 MOVQ rBi, rT1; \
255 ORQ rBo, rT1; \
256 XORQ rBe, rT1; \
257 MOVQ rT1, _me(oState); \
258 M_RT1_RCE; \
259 \
260 XORQ rDo, rBu; \
261 ROLQ $56, rBu; \
262 NOTQ rBo; \
263 MOVQ rBo, rT1; \
264 ORQ rBu, rT1; \
265 XORQ rBi, rT1; \
266 MOVQ rT1, _mi(oState); \
267 \
268 ORQ rBa, rBe; \
269 XORQ rBu, rBe; \
270 MOVQ rBe, _mu(oState); \
271 \
272 ANDQ rBa, rBu; \
273 XORQ rBo, rBu; \
274 MOVQ rBu, _mo(oState); \
275 M_RBE_RCU; \
276 \
277 /* Result s */ \
278 MOVQ _bi(iState), rBa; \
279 MOVQ _go(iState), rBe; \
280 MOVQ _ku(iState), rBi; \
281 XORQ rDi, rBa; \
282 MOVQ _ma(iState), rBo; \
283 ROLQ $62, rBa; \
284 XORQ rDo, rBe; \
285 MOVQ _se(iState), rBu; \
286 ROLQ $55, rBe; \
287 \
288 XORQ rDu, rBi; \
289 MOVQ rBa, rDu; \
290 XORQ rDe, rBu; \
291 ROLQ $2, rBu; \
292 ANDQ rBe, rDu; \
293 XORQ rBu, rDu; \
294 MOVQ rDu, _su(oState); \
295 \
296 ROLQ $39, rBi; \
297 S_RDU_RCU; \
298 NOTQ rBe; \
299 XORQ rDa, rBo; \
300 MOVQ rBe, rDa; \
301 ANDQ rBi, rDa; \
302 XORQ rBa, rDa; \
303 MOVQ rDa, _sa(oState); \
304 S_RDA_RCA; \
305 \
306 ROLQ $41, rBo; \
307 MOVQ rBi, rDe; \
308 ORQ rBo, rDe; \
309 XORQ rBe, rDe; \
310 MOVQ rDe, _se(oState); \
311 S_RDE_RCE; \
312 \
313 MOVQ rBo, rDi; \
314 MOVQ rBu, rDo; \
315 ANDQ rBu, rDi; \
316 ORQ rBa, rDo; \
317 XORQ rBi, rDi; \
318 XORQ rBo, rDo; \
319 MOVQ rDi, _si(oState); \
320 MOVQ rDo, _so(oState) \
321
322 // func keccakF1600(a *[25]uint64)
323 TEXT ·keccakF1600(SB), 0, $200-8
324 MOVQ a+0(FP), rpState
325
326 // Convert the user state into an internal state
327 NOTQ _be(rpState)
328 NOTQ _bi(rpState)
329 NOTQ _go(rpState)
330 NOTQ _ki(rpState)
331 NOTQ _mi(rpState)
332 NOTQ _sa(rpState)
333
334 // Execute the KeccakF permutation
335 MOVQ _ba(rpState), rCa
336 MOVQ _be(rpState), rCe
337 MOVQ _bu(rpState), rCu
338
339 XORQ _ga(rpState), rCa
340 XORQ _ge(rpState), rCe
341 XORQ _gu(rpState), rCu
342
343 XORQ _ka(rpState), rCa
344 XORQ _ke(rpState), rCe
345 XORQ _ku(rpState), rCu
346
347 XORQ _ma(rpState), rCa
348 XORQ _me(rpState), rCe
349 XORQ _mu(rpState), rCu
350
351 XORQ _sa(rpState), rCa
352 XORQ _se(rpState), rCe
353 MOVQ _si(rpState), rDi
354 MOVQ _so(rpState), rDo
355 XORQ _su(rpState), rCu
356
357 mKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
358 mKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
359 mKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
360 mKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
361 mKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
362 mKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
363 mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
364 mKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
365 mKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
366 mKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
367 mKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
368 mKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
369 mKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
370 mKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
371 mKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
372 mKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
373 mKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
374 mKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
375 mKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
376 mKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
377 mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
378 mKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
379 mKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
380 mKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP)
381
382 // Revert the internal state to the user state
383 NOTQ _be(rpState)
384 NOTQ _bi(rpState)
385 NOTQ _go(rpState)
386 NOTQ _ki(rpState)
387 NOTQ _mi(rpState)
388 NOTQ _sa(rpState)
389
390 RET
391
View as plain text