Add ARMv8/CE acceleration for AES-XTS
[libgcrypt.git] / cipher / keccak_permute_32.h
1 /* keccak_permute_32.h - Keccak permute function (simple 32bit bit-interleaved)
2  * Copyright (C) 2015 Jussi Kivilinna <jussi.kivilinna@iki.fi>
3  *
4  * This file is part of Libgcrypt.
5  *
6  * Libgcrypt is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser general Public License as
8  * published by the Free Software Foundation; either version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * Libgcrypt is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 /* The code is based on public-domain/CC0 "keccakc1024/simple32bi/
21  * Keccak-simple32BI.c" implementation by Ronny Van Keer from SUPERCOP toolkit
22  * package.
23  */
24
25 /* Function that computes the Keccak-f[1600] permutation on the given state. */
26 static unsigned int
27 KECCAK_F1600_PERMUTE_FUNC_NAME(KECCAK_STATE *hd)
28 {
29   const u32 *round_consts = round_consts_32bit;
30   const u32 *round_consts_end = round_consts_32bit + 2 * 24;
31   u32 Aba0, Abe0, Abi0, Abo0, Abu0;
32   u32 Aba1, Abe1, Abi1, Abo1, Abu1;
33   u32 Aga0, Age0, Agi0, Ago0, Agu0;
34   u32 Aga1, Age1, Agi1, Ago1, Agu1;
35   u32 Aka0, Ake0, Aki0, Ako0, Aku0;
36   u32 Aka1, Ake1, Aki1, Ako1, Aku1;
37   u32 Ama0, Ame0, Ami0, Amo0, Amu0;
38   u32 Ama1, Ame1, Ami1, Amo1, Amu1;
39   u32 Asa0, Ase0, Asi0, Aso0, Asu0;
40   u32 Asa1, Ase1, Asi1, Aso1, Asu1;
41   u32 BCa0, BCe0, BCi0, BCo0, BCu0;
42   u32 BCa1, BCe1, BCi1, BCo1, BCu1;
43   u32 Da0, De0, Di0, Do0, Du0;
44   u32 Da1, De1, Di1, Do1, Du1;
45   u32 Eba0, Ebe0, Ebi0, Ebo0, Ebu0;
46   u32 Eba1, Ebe1, Ebi1, Ebo1, Ebu1;
47   u32 Ega0, Ege0, Egi0, Ego0, Egu0;
48   u32 Ega1, Ege1, Egi1, Ego1, Egu1;
49   u32 Eka0, Eke0, Eki0, Eko0, Eku0;
50   u32 Eka1, Eke1, Eki1, Eko1, Eku1;
51   u32 Ema0, Eme0, Emi0, Emo0, Emu0;
52   u32 Ema1, Eme1, Emi1, Emo1, Emu1;
53   u32 Esa0, Ese0, Esi0, Eso0, Esu0;
54   u32 Esa1, Ese1, Esi1, Eso1, Esu1;
55   u32 *state = hd->u.state32bi;
56
57   Aba0 = state[0];
58   Aba1 = state[1];
59   Abe0 = state[2];
60   Abe1 = state[3];
61   Abi0 = state[4];
62   Abi1 = state[5];
63   Abo0 = state[6];
64   Abo1 = state[7];
65   Abu0 = state[8];
66   Abu1 = state[9];
67   Aga0 = state[10];
68   Aga1 = state[11];
69   Age0 = state[12];
70   Age1 = state[13];
71   Agi0 = state[14];
72   Agi1 = state[15];
73   Ago0 = state[16];
74   Ago1 = state[17];
75   Agu0 = state[18];
76   Agu1 = state[19];
77   Aka0 = state[20];
78   Aka1 = state[21];
79   Ake0 = state[22];
80   Ake1 = state[23];
81   Aki0 = state[24];
82   Aki1 = state[25];
83   Ako0 = state[26];
84   Ako1 = state[27];
85   Aku0 = state[28];
86   Aku1 = state[29];
87   Ama0 = state[30];
88   Ama1 = state[31];
89   Ame0 = state[32];
90   Ame1 = state[33];
91   Ami0 = state[34];
92   Ami1 = state[35];
93   Amo0 = state[36];
94   Amo1 = state[37];
95   Amu0 = state[38];
96   Amu1 = state[39];
97   Asa0 = state[40];
98   Asa1 = state[41];
99   Ase0 = state[42];
100   Ase1 = state[43];
101   Asi0 = state[44];
102   Asi1 = state[45];
103   Aso0 = state[46];
104   Aso1 = state[47];
105   Asu0 = state[48];
106   Asu1 = state[49];
107
108   do
109     {
110       /* prepareTheta */
111       BCa0 = Aba0 ^ Aga0 ^ Aka0 ^ Ama0 ^ Asa0;
112       BCa1 = Aba1 ^ Aga1 ^ Aka1 ^ Ama1 ^ Asa1;
113       BCe0 = Abe0 ^ Age0 ^ Ake0 ^ Ame0 ^ Ase0;
114       BCe1 = Abe1 ^ Age1 ^ Ake1 ^ Ame1 ^ Ase1;
115       BCi0 = Abi0 ^ Agi0 ^ Aki0 ^ Ami0 ^ Asi0;
116       BCi1 = Abi1 ^ Agi1 ^ Aki1 ^ Ami1 ^ Asi1;
117       BCo0 = Abo0 ^ Ago0 ^ Ako0 ^ Amo0 ^ Aso0;
118       BCo1 = Abo1 ^ Ago1 ^ Ako1 ^ Amo1 ^ Aso1;
119       BCu0 = Abu0 ^ Agu0 ^ Aku0 ^ Amu0 ^ Asu0;
120       BCu1 = Abu1 ^ Agu1 ^ Aku1 ^ Amu1 ^ Asu1;
121
122       /* thetaRhoPiChiIota(round  , A, E) */
123       Da0 = BCu0 ^ ROL32(BCe1, 1);
124       Da1 = BCu1 ^ BCe0;
125       De0 = BCa0 ^ ROL32(BCi1, 1);
126       De1 = BCa1 ^ BCi0;
127       Di0 = BCe0 ^ ROL32(BCo1, 1);
128       Di1 = BCe1 ^ BCo0;
129       Do0 = BCi0 ^ ROL32(BCu1, 1);
130       Do1 = BCi1 ^ BCu0;
131       Du0 = BCo0 ^ ROL32(BCa1, 1);
132       Du1 = BCo1 ^ BCa0;
133
134       Aba0 ^= Da0;
135       BCa0 = Aba0;
136       Age0 ^= De0;
137       BCe0 = ROL32(Age0, 22);
138       Aki1 ^= Di1;
139       BCi0 = ROL32(Aki1, 22);
140       Amo1 ^= Do1;
141       BCo0 = ROL32(Amo1, 11);
142       Asu0 ^= Du0;
143       BCu0 = ROL32(Asu0, 7);
144       Eba0 = BCa0 ^ ANDN32(BCe0, BCi0);
145       Eba0 ^= *(round_consts++);
146       Ebe0 = BCe0 ^ ANDN32(BCi0, BCo0);
147       Ebi0 = BCi0 ^ ANDN32(BCo0, BCu0);
148       Ebo0 = BCo0 ^ ANDN32(BCu0, BCa0);
149       Ebu0 = BCu0 ^ ANDN32(BCa0, BCe0);
150
151       Aba1 ^= Da1;
152       BCa1 = Aba1;
153       Age1 ^= De1;
154       BCe1 = ROL32(Age1, 22);
155       Aki0 ^= Di0;
156       BCi1 = ROL32(Aki0, 21);
157       Amo0 ^= Do0;
158       BCo1 = ROL32(Amo0, 10);
159       Asu1 ^= Du1;
160       BCu1 = ROL32(Asu1, 7);
161       Eba1 = BCa1 ^ ANDN32(BCe1, BCi1);
162       Eba1 ^= *(round_consts++);
163       Ebe1 = BCe1 ^ ANDN32(BCi1, BCo1);
164       Ebi1 = BCi1 ^ ANDN32(BCo1, BCu1);
165       Ebo1 = BCo1 ^ ANDN32(BCu1, BCa1);
166       Ebu1 = BCu1 ^ ANDN32(BCa1, BCe1);
167
168       Abo0 ^= Do0;
169       BCa0 = ROL32(Abo0, 14);
170       Agu0 ^= Du0;
171       BCe0 = ROL32(Agu0, 10);
172       Aka1 ^= Da1;
173       BCi0 = ROL32(Aka1, 2);
174       Ame1 ^= De1;
175       BCo0 = ROL32(Ame1, 23);
176       Asi1 ^= Di1;
177       BCu0 = ROL32(Asi1, 31);
178       Ega0 = BCa0 ^ ANDN32(BCe0, BCi0);
179       Ege0 = BCe0 ^ ANDN32(BCi0, BCo0);
180       Egi0 = BCi0 ^ ANDN32(BCo0, BCu0);
181       Ego0 = BCo0 ^ ANDN32(BCu0, BCa0);
182       Egu0 = BCu0 ^ ANDN32(BCa0, BCe0);
183
184       Abo1 ^= Do1;
185       BCa1 = ROL32(Abo1, 14);
186       Agu1 ^= Du1;
187       BCe1 = ROL32(Agu1, 10);
188       Aka0 ^= Da0;
189       BCi1 = ROL32(Aka0, 1);
190       Ame0 ^= De0;
191       BCo1 = ROL32(Ame0, 22);
192       Asi0 ^= Di0;
193       BCu1 = ROL32(Asi0, 30);
194       Ega1 = BCa1 ^ ANDN32(BCe1, BCi1);
195       Ege1 = BCe1 ^ ANDN32(BCi1, BCo1);
196       Egi1 = BCi1 ^ ANDN32(BCo1, BCu1);
197       Ego1 = BCo1 ^ ANDN32(BCu1, BCa1);
198       Egu1 = BCu1 ^ ANDN32(BCa1, BCe1);
199
200       Abe1 ^= De1;
201       BCa0 = ROL32(Abe1, 1);
202       Agi0 ^= Di0;
203       BCe0 = ROL32(Agi0, 3);
204       Ako1 ^= Do1;
205       BCi0 = ROL32(Ako1, 13);
206       Amu0 ^= Du0;
207       BCo0 = ROL32(Amu0, 4);
208       Asa0 ^= Da0;
209       BCu0 = ROL32(Asa0, 9);
210       Eka0 = BCa0 ^ ANDN32(BCe0, BCi0);
211       Eke0 = BCe0 ^ ANDN32(BCi0, BCo0);
212       Eki0 = BCi0 ^ ANDN32(BCo0, BCu0);
213       Eko0 = BCo0 ^ ANDN32(BCu0, BCa0);
214       Eku0 = BCu0 ^ ANDN32(BCa0, BCe0);
215
216       Abe0 ^= De0;
217       BCa1 = Abe0;
218       Agi1 ^= Di1;
219       BCe1 = ROL32(Agi1, 3);
220       Ako0 ^= Do0;
221       BCi1 = ROL32(Ako0, 12);
222       Amu1 ^= Du1;
223       BCo1 = ROL32(Amu1, 4);
224       Asa1 ^= Da1;
225       BCu1 = ROL32(Asa1, 9);
226       Eka1 = BCa1 ^ ANDN32(BCe1, BCi1);
227       Eke1 = BCe1 ^ ANDN32(BCi1, BCo1);
228       Eki1 = BCi1 ^ ANDN32(BCo1, BCu1);
229       Eko1 = BCo1 ^ ANDN32(BCu1, BCa1);
230       Eku1 = BCu1 ^ ANDN32(BCa1, BCe1);
231
232       Abu1 ^= Du1;
233       BCa0 = ROL32(Abu1, 14);
234       Aga0 ^= Da0;
235       BCe0 = ROL32(Aga0, 18);
236       Ake0 ^= De0;
237       BCi0 = ROL32(Ake0, 5);
238       Ami1 ^= Di1;
239       BCo0 = ROL32(Ami1, 8);
240       Aso0 ^= Do0;
241       BCu0 = ROL32(Aso0, 28);
242       Ema0 = BCa0 ^ ANDN32(BCe0, BCi0);
243       Eme0 = BCe0 ^ ANDN32(BCi0, BCo0);
244       Emi0 = BCi0 ^ ANDN32(BCo0, BCu0);
245       Emo0 = BCo0 ^ ANDN32(BCu0, BCa0);
246       Emu0 = BCu0 ^ ANDN32(BCa0, BCe0);
247
248       Abu0 ^= Du0;
249       BCa1 = ROL32(Abu0, 13);
250       Aga1 ^= Da1;
251       BCe1 = ROL32(Aga1, 18);
252       Ake1 ^= De1;
253       BCi1 = ROL32(Ake1, 5);
254       Ami0 ^= Di0;
255       BCo1 = ROL32(Ami0, 7);
256       Aso1 ^= Do1;
257       BCu1 = ROL32(Aso1, 28);
258       Ema1 = BCa1 ^ ANDN32(BCe1, BCi1);
259       Eme1 = BCe1 ^ ANDN32(BCi1, BCo1);
260       Emi1 = BCi1 ^ ANDN32(BCo1, BCu1);
261       Emo1 = BCo1 ^ ANDN32(BCu1, BCa1);
262       Emu1 = BCu1 ^ ANDN32(BCa1, BCe1);
263
264       Abi0 ^= Di0;
265       BCa0 = ROL32(Abi0, 31);
266       Ago1 ^= Do1;
267       BCe0 = ROL32(Ago1, 28);
268       Aku1 ^= Du1;
269       BCi0 = ROL32(Aku1, 20);
270       Ama1 ^= Da1;
271       BCo0 = ROL32(Ama1, 21);
272       Ase0 ^= De0;
273       BCu0 = ROL32(Ase0, 1);
274       Esa0 = BCa0 ^ ANDN32(BCe0, BCi0);
275       Ese0 = BCe0 ^ ANDN32(BCi0, BCo0);
276       Esi0 = BCi0 ^ ANDN32(BCo0, BCu0);
277       Eso0 = BCo0 ^ ANDN32(BCu0, BCa0);
278       Esu0 = BCu0 ^ ANDN32(BCa0, BCe0);
279
280       Abi1 ^= Di1;
281       BCa1 = ROL32(Abi1, 31);
282       Ago0 ^= Do0;
283       BCe1 = ROL32(Ago0, 27);
284       Aku0 ^= Du0;
285       BCi1 = ROL32(Aku0, 19);
286       Ama0 ^= Da0;
287       BCo1 = ROL32(Ama0, 20);
288       Ase1 ^= De1;
289       BCu1 = ROL32(Ase1, 1);
290       Esa1 = BCa1 ^ ANDN32(BCe1, BCi1);
291       Ese1 = BCe1 ^ ANDN32(BCi1, BCo1);
292       Esi1 = BCi1 ^ ANDN32(BCo1, BCu1);
293       Eso1 = BCo1 ^ ANDN32(BCu1, BCa1);
294       Esu1 = BCu1 ^ ANDN32(BCa1, BCe1);
295
296       /* prepareTheta */
297       BCa0 = Eba0 ^ Ega0 ^ Eka0 ^ Ema0 ^ Esa0;
298       BCa1 = Eba1 ^ Ega1 ^ Eka1 ^ Ema1 ^ Esa1;
299       BCe0 = Ebe0 ^ Ege0 ^ Eke0 ^ Eme0 ^ Ese0;
300       BCe1 = Ebe1 ^ Ege1 ^ Eke1 ^ Eme1 ^ Ese1;
301       BCi0 = Ebi0 ^ Egi0 ^ Eki0 ^ Emi0 ^ Esi0;
302       BCi1 = Ebi1 ^ Egi1 ^ Eki1 ^ Emi1 ^ Esi1;
303       BCo0 = Ebo0 ^ Ego0 ^ Eko0 ^ Emo0 ^ Eso0;
304       BCo1 = Ebo1 ^ Ego1 ^ Eko1 ^ Emo1 ^ Eso1;
305       BCu0 = Ebu0 ^ Egu0 ^ Eku0 ^ Emu0 ^ Esu0;
306       BCu1 = Ebu1 ^ Egu1 ^ Eku1 ^ Emu1 ^ Esu1;
307
308       /* thetaRhoPiChiIota(round+1, E, A) */
309       Da0 = BCu0 ^ ROL32(BCe1, 1);
310       Da1 = BCu1 ^ BCe0;
311       De0 = BCa0 ^ ROL32(BCi1, 1);
312       De1 = BCa1 ^ BCi0;
313       Di0 = BCe0 ^ ROL32(BCo1, 1);
314       Di1 = BCe1 ^ BCo0;
315       Do0 = BCi0 ^ ROL32(BCu1, 1);
316       Do1 = BCi1 ^ BCu0;
317       Du0 = BCo0 ^ ROL32(BCa1, 1);
318       Du1 = BCo1 ^ BCa0;
319
320       Eba0 ^= Da0;
321       BCa0 = Eba0;
322       Ege0 ^= De0;
323       BCe0 = ROL32(Ege0, 22);
324       Eki1 ^= Di1;
325       BCi0 = ROL32(Eki1, 22);
326       Emo1 ^= Do1;
327       BCo0 = ROL32(Emo1, 11);
328       Esu0 ^= Du0;
329       BCu0 = ROL32(Esu0, 7);
330       Aba0 = BCa0 ^ ANDN32(BCe0, BCi0);
331       Aba0 ^= *(round_consts++);
332       Abe0 = BCe0 ^ ANDN32(BCi0, BCo0);
333       Abi0 = BCi0 ^ ANDN32(BCo0, BCu0);
334       Abo0 = BCo0 ^ ANDN32(BCu0, BCa0);
335       Abu0 = BCu0 ^ ANDN32(BCa0, BCe0);
336
337       Eba1 ^= Da1;
338       BCa1 = Eba1;
339       Ege1 ^= De1;
340       BCe1 = ROL32(Ege1, 22);
341       Eki0 ^= Di0;
342       BCi1 = ROL32(Eki0, 21);
343       Emo0 ^= Do0;
344       BCo1 = ROL32(Emo0, 10);
345       Esu1 ^= Du1;
346       BCu1 = ROL32(Esu1, 7);
347       Aba1 = BCa1 ^ ANDN32(BCe1, BCi1);
348       Aba1 ^= *(round_consts++);
349       Abe1 = BCe1 ^ ANDN32(BCi1, BCo1);
350       Abi1 = BCi1 ^ ANDN32(BCo1, BCu1);
351       Abo1 = BCo1 ^ ANDN32(BCu1, BCa1);
352       Abu1 = BCu1 ^ ANDN32(BCa1, BCe1);
353
354       Ebo0 ^= Do0;
355       BCa0 = ROL32(Ebo0, 14);
356       Egu0 ^= Du0;
357       BCe0 = ROL32(Egu0, 10);
358       Eka1 ^= Da1;
359       BCi0 = ROL32(Eka1, 2);
360       Eme1 ^= De1;
361       BCo0 = ROL32(Eme1, 23);
362       Esi1 ^= Di1;
363       BCu0 = ROL32(Esi1, 31);
364       Aga0 = BCa0 ^ ANDN32(BCe0, BCi0);
365       Age0 = BCe0 ^ ANDN32(BCi0, BCo0);
366       Agi0 = BCi0 ^ ANDN32(BCo0, BCu0);
367       Ago0 = BCo0 ^ ANDN32(BCu0, BCa0);
368       Agu0 = BCu0 ^ ANDN32(BCa0, BCe0);
369
370       Ebo1 ^= Do1;
371       BCa1 = ROL32(Ebo1, 14);
372       Egu1 ^= Du1;
373       BCe1 = ROL32(Egu1, 10);
374       Eka0 ^= Da0;
375       BCi1 = ROL32(Eka0, 1);
376       Eme0 ^= De0;
377       BCo1 = ROL32(Eme0, 22);
378       Esi0 ^= Di0;
379       BCu1 = ROL32(Esi0, 30);
380       Aga1 = BCa1 ^ ANDN32(BCe1, BCi1);
381       Age1 = BCe1 ^ ANDN32(BCi1, BCo1);
382       Agi1 = BCi1 ^ ANDN32(BCo1, BCu1);
383       Ago1 = BCo1 ^ ANDN32(BCu1, BCa1);
384       Agu1 = BCu1 ^ ANDN32(BCa1, BCe1);
385
386       Ebe1 ^= De1;
387       BCa0 = ROL32(Ebe1, 1);
388       Egi0 ^= Di0;
389       BCe0 = ROL32(Egi0, 3);
390       Eko1 ^= Do1;
391       BCi0 = ROL32(Eko1, 13);
392       Emu0 ^= Du0;
393       BCo0 = ROL32(Emu0, 4);
394       Esa0 ^= Da0;
395       BCu0 = ROL32(Esa0, 9);
396       Aka0 = BCa0 ^ ANDN32(BCe0, BCi0);
397       Ake0 = BCe0 ^ ANDN32(BCi0, BCo0);
398       Aki0 = BCi0 ^ ANDN32(BCo0, BCu0);
399       Ako0 = BCo0 ^ ANDN32(BCu0, BCa0);
400       Aku0 = BCu0 ^ ANDN32(BCa0, BCe0);
401
402       Ebe0 ^= De0;
403       BCa1 = Ebe0;
404       Egi1 ^= Di1;
405       BCe1 = ROL32(Egi1, 3);
406       Eko0 ^= Do0;
407       BCi1 = ROL32(Eko0, 12);
408       Emu1 ^= Du1;
409       BCo1 = ROL32(Emu1, 4);
410       Esa1 ^= Da1;
411       BCu1 = ROL32(Esa1, 9);
412       Aka1 = BCa1 ^ ANDN32(BCe1, BCi1);
413       Ake1 = BCe1 ^ ANDN32(BCi1, BCo1);
414       Aki1 = BCi1 ^ ANDN32(BCo1, BCu1);
415       Ako1 = BCo1 ^ ANDN32(BCu1, BCa1);
416       Aku1 = BCu1 ^ ANDN32(BCa1, BCe1);
417
418       Ebu1 ^= Du1;
419       BCa0 = ROL32(Ebu1, 14);
420       Ega0 ^= Da0;
421       BCe0 = ROL32(Ega0, 18);
422       Eke0 ^= De0;
423       BCi0 = ROL32(Eke0, 5);
424       Emi1 ^= Di1;
425       BCo0 = ROL32(Emi1, 8);
426       Eso0 ^= Do0;
427       BCu0 = ROL32(Eso0, 28);
428       Ama0 = BCa0 ^ ANDN32(BCe0, BCi0);
429       Ame0 = BCe0 ^ ANDN32(BCi0, BCo0);
430       Ami0 = BCi0 ^ ANDN32(BCo0, BCu0);
431       Amo0 = BCo0 ^ ANDN32(BCu0, BCa0);
432       Amu0 = BCu0 ^ ANDN32(BCa0, BCe0);
433
434       Ebu0 ^= Du0;
435       BCa1 = ROL32(Ebu0, 13);
436       Ega1 ^= Da1;
437       BCe1 = ROL32(Ega1, 18);
438       Eke1 ^= De1;
439       BCi1 = ROL32(Eke1, 5);
440       Emi0 ^= Di0;
441       BCo1 = ROL32(Emi0, 7);
442       Eso1 ^= Do1;
443       BCu1 = ROL32(Eso1, 28);
444       Ama1 = BCa1 ^ ANDN32(BCe1, BCi1);
445       Ame1 = BCe1 ^ ANDN32(BCi1, BCo1);
446       Ami1 = BCi1 ^ ANDN32(BCo1, BCu1);
447       Amo1 = BCo1 ^ ANDN32(BCu1, BCa1);
448       Amu1 = BCu1 ^ ANDN32(BCa1, BCe1);
449
450       Ebi0 ^= Di0;
451       BCa0 = ROL32(Ebi0, 31);
452       Ego1 ^= Do1;
453       BCe0 = ROL32(Ego1, 28);
454       Eku1 ^= Du1;
455       BCi0 = ROL32(Eku1, 20);
456       Ema1 ^= Da1;
457       BCo0 = ROL32(Ema1, 21);
458       Ese0 ^= De0;
459       BCu0 = ROL32(Ese0, 1);
460       Asa0 = BCa0 ^ ANDN32(BCe0, BCi0);
461       Ase0 = BCe0 ^ ANDN32(BCi0, BCo0);
462       Asi0 = BCi0 ^ ANDN32(BCo0, BCu0);
463       Aso0 = BCo0 ^ ANDN32(BCu0, BCa0);
464       Asu0 = BCu0 ^ ANDN32(BCa0, BCe0);
465
466       Ebi1 ^= Di1;
467       BCa1 = ROL32(Ebi1, 31);
468       Ego0 ^= Do0;
469       BCe1 = ROL32(Ego0, 27);
470       Eku0 ^= Du0;
471       BCi1 = ROL32(Eku0, 19);
472       Ema0 ^= Da0;
473       BCo1 = ROL32(Ema0, 20);
474       Ese1 ^= De1;
475       BCu1 = ROL32(Ese1, 1);
476       Asa1 = BCa1 ^ ANDN32(BCe1, BCi1);
477       Ase1 = BCe1 ^ ANDN32(BCi1, BCo1);
478       Asi1 = BCi1 ^ ANDN32(BCo1, BCu1);
479       Aso1 = BCo1 ^ ANDN32(BCu1, BCa1);
480       Asu1 = BCu1 ^ ANDN32(BCa1, BCe1);
481     }
482   while (round_consts < round_consts_end);
483
484   state[0] = Aba0;
485   state[1] = Aba1;
486   state[2] = Abe0;
487   state[3] = Abe1;
488   state[4] = Abi0;
489   state[5] = Abi1;
490   state[6] = Abo0;
491   state[7] = Abo1;
492   state[8] = Abu0;
493   state[9] = Abu1;
494   state[10] = Aga0;
495   state[11] = Aga1;
496   state[12] = Age0;
497   state[13] = Age1;
498   state[14] = Agi0;
499   state[15] = Agi1;
500   state[16] = Ago0;
501   state[17] = Ago1;
502   state[18] = Agu0;
503   state[19] = Agu1;
504   state[20] = Aka0;
505   state[21] = Aka1;
506   state[22] = Ake0;
507   state[23] = Ake1;
508   state[24] = Aki0;
509   state[25] = Aki1;
510   state[26] = Ako0;
511   state[27] = Ako1;
512   state[28] = Aku0;
513   state[29] = Aku1;
514   state[30] = Ama0;
515   state[31] = Ama1;
516   state[32] = Ame0;
517   state[33] = Ame1;
518   state[34] = Ami0;
519   state[35] = Ami1;
520   state[36] = Amo0;
521   state[37] = Amo1;
522   state[38] = Amu0;
523   state[39] = Amu1;
524   state[40] = Asa0;
525   state[41] = Asa1;
526   state[42] = Ase0;
527   state[43] = Ase1;
528   state[44] = Asi0;
529   state[45] = Asi1;
530   state[46] = Aso0;
531   state[47] = Aso1;
532   state[48] = Asu0;
533   state[49] = Asu1;
534
535   return sizeof(void *) * 4 + sizeof(u32) * 12 * 5 * 2;
536 }