Browse code

Change sha3 implementation used. Initial unsaved data API.

Dario Rodriguez authored on 02/03/2019 16:12:12
Showing 1 changed files
1 1
deleted file mode 100644
... ...
@@ -1,1162 +0,0 @@
1
-/*
2
-Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni,
3
-Joan Daemen, Michaƫl Peeters, Gilles Van Assche and Ronny Van Keer, hereby
4
-denoted as "the implementer".
5
-
6
-For more information, feedback or questions, please refer to our websites:
7
-http://keccak.noekeon.org/
8
-http://keyak.noekeon.org/
9
-http://ketje.noekeon.org/
10
-
11
-To the extent possible under law, the implementer has waived all copyright
12
-and related or neighboring rights to the source code in this file.
13
-http://creativecommons.org/publicdomain/zero/1.0/
14
-*/
15
-
16
-#include    <string.h>
17
-/* #include "brg_endian.h" */
18
-#include "KeccakP-1600-SnP.h"
19
-#include "SnP-Relaned.h"
20
-
21
-typedef unsigned char UINT8;
22
-typedef unsigned int UINT32;
23
-/* WARNING: on 8-bit and 16-bit platforms, this should be replaced by: */
24
-
25
-/*typedef unsigned long       UINT32; */
26
-
27
-
28
-#define ROL32(a, offset) ((((UINT32)a) << (offset)) ^ (((UINT32)a) >> (32-(offset))))
29
-
30
-/* Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
31
-
32
-#define prepareToBitInterleaving(low, high, temp, temp0, temp1) \
33
-        temp0 = (low); \
34
-        temp = (temp0 ^ (temp0 >>  1)) & 0x22222222UL;  temp0 = temp0 ^ temp ^ (temp <<  1); \
35
-        temp = (temp0 ^ (temp0 >>  2)) & 0x0C0C0C0CUL;  temp0 = temp0 ^ temp ^ (temp <<  2); \
36
-        temp = (temp0 ^ (temp0 >>  4)) & 0x00F000F0UL;  temp0 = temp0 ^ temp ^ (temp <<  4); \
37
-        temp = (temp0 ^ (temp0 >>  8)) & 0x0000FF00UL;  temp0 = temp0 ^ temp ^ (temp <<  8); \
38
-        temp1 = (high); \
39
-        temp = (temp1 ^ (temp1 >>  1)) & 0x22222222UL;  temp1 = temp1 ^ temp ^ (temp <<  1); \
40
-        temp = (temp1 ^ (temp1 >>  2)) & 0x0C0C0C0CUL;  temp1 = temp1 ^ temp ^ (temp <<  2); \
41
-        temp = (temp1 ^ (temp1 >>  4)) & 0x00F000F0UL;  temp1 = temp1 ^ temp ^ (temp <<  4); \
42
-        temp = (temp1 ^ (temp1 >>  8)) & 0x0000FF00UL;  temp1 = temp1 ^ temp ^ (temp <<  8);
43
-
44
-#define toBitInterleavingAndXOR(low, high, even, odd, temp, temp0, temp1) \
45
-        prepareToBitInterleaving(low, high, temp, temp0, temp1) \
46
-        even ^= (temp0 & 0x0000FFFF) | (temp1 << 16); \
47
-        odd ^= (temp0 >> 16) | (temp1 & 0xFFFF0000);
48
-
49
-#define toBitInterleavingAndAND(low, high, even, odd, temp, temp0, temp1) \
50
-        prepareToBitInterleaving(low, high, temp, temp0, temp1) \
51
-        even &= (temp0 & 0x0000FFFF) | (temp1 << 16); \
52
-        odd &= (temp0 >> 16) | (temp1 & 0xFFFF0000);
53
-
54
-#define toBitInterleavingAndSet(low, high, even, odd, temp, temp0, temp1) \
55
-        prepareToBitInterleaving(low, high, temp, temp0, temp1) \
56
-        even = (temp0 & 0x0000FFFF) | (temp1 << 16); \
57
-        odd = (temp0 >> 16) | (temp1 & 0xFFFF0000);
58
-
59
-/* Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
60
-
61
-#define prepareFromBitInterleaving(even, odd, temp, temp0, temp1) \
62
-        temp0 = (even); \
63
-        temp1 = (odd); \
64
-        temp = (temp0 & 0x0000FFFF) | (temp1 << 16); \
65
-        temp1 = (temp0 >> 16) | (temp1 & 0xFFFF0000); \
66
-        temp0 = temp; \
67
-        temp = (temp0 ^ (temp0 >>  8)) & 0x0000FF00UL;  temp0 = temp0 ^ temp ^ (temp <<  8); \
68
-        temp = (temp0 ^ (temp0 >>  4)) & 0x00F000F0UL;  temp0 = temp0 ^ temp ^ (temp <<  4); \
69
-        temp = (temp0 ^ (temp0 >>  2)) & 0x0C0C0C0CUL;  temp0 = temp0 ^ temp ^ (temp <<  2); \
70
-        temp = (temp0 ^ (temp0 >>  1)) & 0x22222222UL;  temp0 = temp0 ^ temp ^ (temp <<  1); \
71
-        temp = (temp1 ^ (temp1 >>  8)) & 0x0000FF00UL;  temp1 = temp1 ^ temp ^ (temp <<  8); \
72
-        temp = (temp1 ^ (temp1 >>  4)) & 0x00F000F0UL;  temp1 = temp1 ^ temp ^ (temp <<  4); \
73
-        temp = (temp1 ^ (temp1 >>  2)) & 0x0C0C0C0CUL;  temp1 = temp1 ^ temp ^ (temp <<  2); \
74
-        temp = (temp1 ^ (temp1 >>  1)) & 0x22222222UL;  temp1 = temp1 ^ temp ^ (temp <<  1);
75
-
76
-#define fromBitInterleaving(even, odd, low, high, temp, temp0, temp1) \
77
-        prepareFromBitInterleaving(even, odd, temp, temp0, temp1) \
78
-        low = temp0; \
79
-        high = temp1;
80
-
81
-#define fromBitInterleavingAndXOR(even, odd, lowIn, highIn, lowOut, highOut, temp, temp0, temp1) \
82
-        prepareFromBitInterleaving(even, odd, temp, temp0, temp1) \
83
-        lowOut = lowIn ^ temp0; \
84
-        highOut = highIn ^ temp1;
85
-
86
-void KeccakP1600_SetBytesInLaneToZero(void *state, unsigned int lanePosition, unsigned int offset, unsigned int length)
87
-{
88
-    UINT8 laneAsBytes[8];
89
-    UINT32 low, high;
90
-    UINT32 temp, temp0, temp1;
91
-    UINT32 *stateAsHalfLanes = (UINT32*)state;
92
-
93
-    memset(laneAsBytes, 0xFF, offset);
94
-    memset(laneAsBytes+offset, 0x00, length);
95
-    memset(laneAsBytes+offset+length, 0xFF, 8-offset-length);
96
-#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
97
-    low = *((UINT32*)(laneAsBytes+0));
98
-    high = *((UINT32*)(laneAsBytes+4));
99
-#else
100
-    low = laneAsBytes[0]
101
-        | ((UINT32)(laneAsBytes[1]) << 8)
102
-        | ((UINT32)(laneAsBytes[2]) << 16)
103
-        | ((UINT32)(laneAsBytes[3]) << 24);
104
-    high = laneAsBytes[4]
105
-        | ((UINT32)(laneAsBytes[5]) << 8)
106
-        | ((UINT32)(laneAsBytes[6]) << 16)
107
-        | ((UINT32)(laneAsBytes[7]) << 24);
108
-#endif
109
-    toBitInterleavingAndAND(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
110
-}
111
-
112
-/* ---------------------------------------------------------------- */
113
-
114
-void KeccakP1600_Initialize(void *state)
115
-{
116
-    memset(state, 0, 200);
117
-}
118
-
119
-/* ---------------------------------------------------------------- */
120
-
121
-void KeccakP1600_AddByte(void *state, unsigned char byte, unsigned int offset)
122
-{
123
-    unsigned int lanePosition = offset/8;
124
-    unsigned int offsetInLane = offset%8;
125
-    UINT32 low, high;
126
-    UINT32 temp, temp0, temp1;
127
-    UINT32 *stateAsHalfLanes = (UINT32*)state;
128
-
129
-    if (offsetInLane < 4) {
130
-        low = (UINT32)byte << (offsetInLane*8);
131
-        high = 0;
132
-    }
133
-    else {
134
-        low = 0;
135
-        high = (UINT32)byte << ((offsetInLane-4)*8);
136
-    }
137
-    toBitInterleavingAndXOR(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
138
-}
139
-
140
-/* ---------------------------------------------------------------- */
141
-
142
-void KeccakP1600_AddBytesInLane(void *state, unsigned int lanePosition, const unsigned char *data, unsigned int offset, unsigned int length)
143
-{
144
-    UINT8 laneAsBytes[8];
145
-    UINT32 low, high;
146
-    UINT32 temp, temp0, temp1;
147
-    UINT32 *stateAsHalfLanes = (UINT32*)state;
148
-
149
-    memset(laneAsBytes, 0, 8);
150
-    memcpy(laneAsBytes+offset, data, length);
151
-#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
152
-    low = *((UINT32*)(laneAsBytes+0));
153
-    high = *((UINT32*)(laneAsBytes+4));
154
-#else
155
-    low = laneAsBytes[0]
156
-        | ((UINT32)(laneAsBytes[1]) << 8)
157
-        | ((UINT32)(laneAsBytes[2]) << 16)
158
-        | ((UINT32)(laneAsBytes[3]) << 24);
159
-    high = laneAsBytes[4]
160
-        | ((UINT32)(laneAsBytes[5]) << 8)
161
-        | ((UINT32)(laneAsBytes[6]) << 16)
162
-        | ((UINT32)(laneAsBytes[7]) << 24);
163
-#endif
164
-    toBitInterleavingAndXOR(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
165
-}
166
-
167
-/* ---------------------------------------------------------------- */
168
-
169
-void KeccakP1600_AddLanes(void *state, const unsigned char *data, unsigned int laneCount)
170
-{
171
-#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
172
-    const UINT32 * pI = (const UINT32 *)data;
173
-    UINT32 * pS = (UINT32*)state;
174
-    UINT32 t, x0, x1;
175
-    int i;
176
-    for (i = laneCount-1; i >= 0; --i) {
177
-#ifdef NO_MISALIGNED_ACCESSES
178
-        UINT32 low;
179
-        UINT32 high;
180
-        memcpy(&low, pI++, 4);
181
-        memcpy(&high, pI++, 4);
182
-        toBitInterleavingAndXOR(low, high, *(pS++), *(pS++), t, x0, x1);
183
-#else
184
-        toBitInterleavingAndXOR(*(pI++), *(pI++), *(pS++), *(pS++), t, x0, x1)
185
-#endif
186
-    }
187
-#else
188
-    unsigned int lanePosition;
189
-    for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
190
-        UINT8 laneAsBytes[8];
191
-        UINT32 low, high, temp, temp0, temp1;
192
-        UINT32 *stateAsHalfLanes;
193
-        memcpy(laneAsBytes, data+lanePosition*8, 8);
194
-        low = laneAsBytes[0]
195
-            | ((UINT32)(laneAsBytes[1]) << 8)
196
-            | ((UINT32)(laneAsBytes[2]) << 16)
197
-            | ((UINT32)(laneAsBytes[3]) << 24);
198
-        high = laneAsBytes[4]
199
-            | ((UINT32)(laneAsBytes[5]) << 8)
200
-            | ((UINT32)(laneAsBytes[6]) << 16)
201
-            | ((UINT32)(laneAsBytes[7]) << 24);
202
-        stateAsHalfLanes = (UINT32*)state;
203
-        toBitInterleavingAndXOR(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
204
-    }
205
-#endif
206
-}
207
-
208
-/* ---------------------------------------------------------------- */
209
-
210
-void KeccakP1600_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
211
-{
212
-    SnP_AddBytes(state, data, offset, length, KeccakP1600_AddLanes, KeccakP1600_AddBytesInLane, 8);
213
-}
214
-
215
-/* ---------------------------------------------------------------- */
216
-
217
-void KeccakP1600_OverwriteBytesInLane(void *state, unsigned int lanePosition, const unsigned char *data, unsigned int offset, unsigned int length)
218
-{
219
-    KeccakP1600_SetBytesInLaneToZero(state, lanePosition, offset, length);
220
-    KeccakP1600_AddBytesInLane(state, lanePosition, data, offset, length);
221
-}
222
-
223
-/* ---------------------------------------------------------------- */
224
-
225
-void KeccakP1600_OverwriteLanes(void *state, const unsigned char *data, unsigned int laneCount)
226
-{
227
-#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
228
-    const UINT32 * pI = (const UINT32 *)data;
229
-    UINT32 * pS = (UINT32 *)state;
230
-    UINT32 t, x0, x1;
231
-    int i;
232
-    for (i = laneCount-1; i >= 0; --i) {
233
-#ifdef NO_MISALIGNED_ACCESSES
234
-        UINT32 low;
235
-        UINT32 high;
236
-        memcpy(&low, pI++, 4);
237
-        memcpy(&high, pI++, 4);
238
-        toBitInterleavingAndSet(low, high, *(pS++), *(pS++), t, x0, x1);
239
-#else
240
-        toBitInterleavingAndSet(*(pI++), *(pI++), *(pS++), *(pS++), t, x0, x1)
241
-#endif
242
-    }
243
-#else
244
-    unsigned int lanePosition;
245
-    for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
246
-        UINT8 laneAsBytes[8];
247
-        UINT32 low, high, temp, temp0, temp1;
248
-        UINT32 *stateAsHalfLanes;
249
-        memcpy(laneAsBytes, data+lanePosition*8, 8);
250
-        low = laneAsBytes[0]
251
-            | ((UINT32)(laneAsBytes[1]) << 8)
252
-            | ((UINT32)(laneAsBytes[2]) << 16)
253
-            | ((UINT32)(laneAsBytes[3]) << 24);
254
-        high = laneAsBytes[4]
255
-            | ((UINT32)(laneAsBytes[5]) << 8)
256
-            | ((UINT32)(laneAsBytes[6]) << 16)
257
-            | ((UINT32)(laneAsBytes[7]) << 24);
258
-        stateAsHalfLanes = (UINT32*)state;
259
-        toBitInterleavingAndSet(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
260
-    }
261
-#endif
262
-}
263
-
264
-/* ---------------------------------------------------------------- */
265
-
266
-void KeccakP1600_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
267
-{
268
-    SnP_OverwriteBytes(state, data, offset, length, KeccakP1600_OverwriteLanes, KeccakP1600_OverwriteBytesInLane, 8);
269
-}
270
-
271
-/* ---------------------------------------------------------------- */
272
-
273
-void KeccakP1600_OverwriteWithZeroes(void *state, unsigned int byteCount)
274
-{
275
-    UINT32 *stateAsHalfLanes = (UINT32*)state;
276
-    unsigned int i;
277
-
278
-    for(i=0; i<byteCount/8; i++) {
279
-        stateAsHalfLanes[i*2+0] = 0;
280
-        stateAsHalfLanes[i*2+1] = 0;
281
-    }
282
-    if (byteCount%8 != 0)
283
-        KeccakP1600_SetBytesInLaneToZero(state, byteCount/8, 0, byteCount%8);
284
-}
285
-
286
-/* ---------------------------------------------------------------- */
287
-
288
-void KeccakP1600_ExtractBytesInLane(const void *state, unsigned int lanePosition, unsigned char *data, unsigned int offset, unsigned int length)
289
-{
290
-    UINT32 *stateAsHalfLanes = (UINT32*)state;
291
-    UINT32 low, high, temp, temp0, temp1;
292
-    UINT8 laneAsBytes[8];
293
-
294
-    fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
295
-#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
296
-    *((UINT32*)(laneAsBytes+0)) = low;
297
-    *((UINT32*)(laneAsBytes+4)) = high;
298
-#else
299
-    laneAsBytes[0] = low & 0xFF;
300
-    laneAsBytes[1] = (low >> 8) & 0xFF;
301
-    laneAsBytes[2] = (low >> 16) & 0xFF;
302
-    laneAsBytes[3] = (low >> 24) & 0xFF;
303
-    laneAsBytes[4] = high & 0xFF;
304
-    laneAsBytes[5] = (high >> 8) & 0xFF;
305
-    laneAsBytes[6] = (high >> 16) & 0xFF;
306
-    laneAsBytes[7] = (high >> 24) & 0xFF;
307
-#endif
308
-    memcpy(data, laneAsBytes+offset, length);
309
-}
310
-
311
-/* ---------------------------------------------------------------- */
312
-
313
-void KeccakP1600_ExtractLanes(const void *state, unsigned char *data, unsigned int laneCount)
314
-{
315
-#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
316
-    UINT32 * pI = (UINT32 *)data;
317
-    const UINT32 * pS = ( const UINT32 *)state;
318
-    UINT32 t, x0, x1;
319
-    int i;
320
-    for (i = laneCount-1; i >= 0; --i) {
321
-#ifdef NO_MISALIGNED_ACCESSES
322
-        UINT32 low;
323
-        UINT32 high;
324
-        fromBitInterleaving(*(pS++), *(pS++), low, high, t, x0, x1);
325
-        memcpy(pI++, &low, 4);
326
-        memcpy(pI++, &high, 4);
327
-#else
328
-        fromBitInterleaving(*(pS++), *(pS++), *(pI++), *(pI++), t, x0, x1)
329
-#endif
330
-    }
331
-#else
332
-    unsigned int lanePosition;
333
-    for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
334
-        UINT32 *stateAsHalfLanes = (UINT32*)state;
335
-        UINT32 low, high, temp, temp0, temp1;
336
-        UINT8 laneAsBytes[8];
337
-        fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
338
-        laneAsBytes[0] = low & 0xFF;
339
-        laneAsBytes[1] = (low >> 8) & 0xFF;
340
-        laneAsBytes[2] = (low >> 16) & 0xFF;
341
-        laneAsBytes[3] = (low >> 24) & 0xFF;
342
-        laneAsBytes[4] = high & 0xFF;
343
-        laneAsBytes[5] = (high >> 8) & 0xFF;
344
-        laneAsBytes[6] = (high >> 16) & 0xFF;
345
-        laneAsBytes[7] = (high >> 24) & 0xFF;
346
-        memcpy(data+lanePosition*8, laneAsBytes, 8);
347
-    }
348
-#endif
349
-}
350
-
351
-/* ---------------------------------------------------------------- */
352
-
353
-void KeccakP1600_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length)
354
-{
355
-    SnP_ExtractBytes(state, data, offset, length, KeccakP1600_ExtractLanes, KeccakP1600_ExtractBytesInLane, 8);
356
-}
357
-
358
-/* ---------------------------------------------------------------- */
359
-
360
-void KeccakP1600_ExtractAndAddBytesInLane(const void *state, unsigned int lanePosition, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
361
-{
362
-    UINT32 *stateAsHalfLanes = (UINT32*)state;
363
-    UINT32 low, high, temp, temp0, temp1;
364
-    UINT8 laneAsBytes[8];
365
-    unsigned int i;
366
-
367
-    fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
368
-#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
369
-    *((UINT32*)(laneAsBytes+0)) = low;
370
-    *((UINT32*)(laneAsBytes+4)) = high;
371
-#else
372
-    laneAsBytes[0] = low & 0xFF;
373
-    laneAsBytes[1] = (low >> 8) & 0xFF;
374
-    laneAsBytes[2] = (low >> 16) & 0xFF;
375
-    laneAsBytes[3] = (low >> 24) & 0xFF;
376
-    laneAsBytes[4] = high & 0xFF;
377
-    laneAsBytes[5] = (high >> 8) & 0xFF;
378
-    laneAsBytes[6] = (high >> 16) & 0xFF;
379
-    laneAsBytes[7] = (high >> 24) & 0xFF;
380
-#endif
381
-    for(i=0; i<length; i++)
382
-        output[i] = input[i] ^ laneAsBytes[offset+i];
383
-}
384
-
385
-/* ---------------------------------------------------------------- */
386
-
387
-void KeccakP1600_ExtractAndAddLanes(const void *state, const unsigned char *input, unsigned char *output, unsigned int laneCount)
388
-{
389
-#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
390
-    const UINT32 * pI = (const UINT32 *)input;
391
-    UINT32 * pO = (UINT32 *)output;
392
-    const UINT32 * pS = (const UINT32 *)state;
393
-    UINT32 t, x0, x1;
394
-    int i;
395
-    for (i = laneCount-1; i >= 0; --i) {
396
-#ifdef NO_MISALIGNED_ACCESSES
397
-        UINT32 low;
398
-        UINT32 high;
399
-        fromBitInterleaving(*(pS++), *(pS++), low, high, t, x0, x1);
400
-        *(pO++) = *(pI++) ^ low;
401
-        *(pO++) = *(pI++) ^ high;
402
-#else
403
-        fromBitInterleavingAndXOR(*(pS++), *(pS++), *(pI++), *(pI++), *(pO++), *(pO++), t, x0, x1)
404
-#endif
405
-    }
406
-#else
407
-    unsigned int lanePosition;
408
-    for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
409
-        UINT32 *stateAsHalfLanes = (UINT32*)state;
410
-        UINT32 low, high, temp, temp0, temp1;
411
-        UINT8 laneAsBytes[8];
412
-        fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
413
-        laneAsBytes[0] = low & 0xFF;
414
-        laneAsBytes[1] = (low >> 8) & 0xFF;
415
-        laneAsBytes[2] = (low >> 16) & 0xFF;
416
-        laneAsBytes[3] = (low >> 24) & 0xFF;
417
-        laneAsBytes[4] = high & 0xFF;
418
-        laneAsBytes[5] = (high >> 8) & 0xFF;
419
-        laneAsBytes[6] = (high >> 16) & 0xFF;
420
-        laneAsBytes[7] = (high >> 24) & 0xFF;
421
-        ((UINT32*)(output+lanePosition*8))[0] = ((UINT32*)(input+lanePosition*8))[0] ^ (*(const UINT32*)(laneAsBytes+0));
422
-        ((UINT32*)(output+lanePosition*8))[1] = ((UINT32*)(input+lanePosition*8))[0] ^ (*(const UINT32*)(laneAsBytes+4));
423
-    }
424
-#endif
425
-}
426
-/* ---------------------------------------------------------------- */
427
-
428
-void KeccakP1600_ExtractAndAddBytes(const void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
429
-{
430
-    SnP_ExtractAndAddBytes(state, input, output, offset, length, KeccakP1600_ExtractAndAddLanes, KeccakP1600_ExtractAndAddBytesInLane, 8);
431
-}
432
-
433
-/* ---------------------------------------------------------------- */
434
-
435
-static const UINT32 KeccakF1600RoundConstants_int2[2*24+1] =
436
-{
437
-    0x00000001UL,    0x00000000UL,
438
-    0x00000000UL,    0x00000089UL,
439
-    0x00000000UL,    0x8000008bUL,
440
-    0x00000000UL,    0x80008080UL,
441
-    0x00000001UL,    0x0000008bUL,
442
-    0x00000001UL,    0x00008000UL,
443
-    0x00000001UL,    0x80008088UL,
444
-    0x00000001UL,    0x80000082UL,
445
-    0x00000000UL,    0x0000000bUL,
446
-    0x00000000UL,    0x0000000aUL,
447
-    0x00000001UL,    0x00008082UL,
448
-    0x00000000UL,    0x00008003UL,
449
-    0x00000001UL,    0x0000808bUL,
450
-    0x00000001UL,    0x8000000bUL,
451
-    0x00000001UL,    0x8000008aUL,
452
-    0x00000001UL,    0x80000081UL,
453
-    0x00000000UL,    0x80000081UL,
454
-    0x00000000UL,    0x80000008UL,
455
-    0x00000000UL,    0x00000083UL,
456
-    0x00000000UL,    0x80008003UL,
457
-    0x00000001UL,    0x80008088UL,
458
-    0x00000000UL,    0x80000088UL,
459
-    0x00000001UL,    0x00008000UL,
460
-    0x00000000UL,    0x80008082UL,
461
-    0x000000FFUL
462
-};
463
-
464
-#define KeccakAtoD_round0() \
465
-        Cx = Abu0^Agu0^Aku0^Amu0^Asu0; \
466
-        Du1 = Abe1^Age1^Ake1^Ame1^Ase1; \
467
-        Da0 = Cx^ROL32(Du1, 1); \
468
-        Cz = Abu1^Agu1^Aku1^Amu1^Asu1; \
469
-        Du0 = Abe0^Age0^Ake0^Ame0^Ase0; \
470
-        Da1 = Cz^Du0; \
471
-\
472
-        Cw = Abi0^Agi0^Aki0^Ami0^Asi0; \
473
-        Do0 = Cw^ROL32(Cz, 1); \
474
-        Cy = Abi1^Agi1^Aki1^Ami1^Asi1; \
475
-        Do1 = Cy^Cx; \
476
-\
477
-        Cx = Aba0^Aga0^Aka0^Ama0^Asa0; \
478
-        De0 = Cx^ROL32(Cy, 1); \
479
-        Cz = Aba1^Aga1^Aka1^Ama1^Asa1; \
480
-        De1 = Cz^Cw; \
481
-\
482
-        Cy = Abo1^Ago1^Ako1^Amo1^Aso1; \
483
-        Di0 = Du0^ROL32(Cy, 1); \
484
-        Cw = Abo0^Ago0^Ako0^Amo0^Aso0; \
485
-        Di1 = Du1^Cw; \
486
-\
487
-        Du0 = Cw^ROL32(Cz, 1); \
488
-        Du1 = Cy^Cx; \
489
-
490
-#define KeccakAtoD_round1() \
491
-        Cx = Asu0^Agu0^Amu0^Abu1^Aku1; \
492
-        Du1 = Age1^Ame0^Abe0^Ake1^Ase1; \
493
-        Da0 = Cx^ROL32(Du1, 1); \
494
-        Cz = Asu1^Agu1^Amu1^Abu0^Aku0; \
495
-        Du0 = Age0^Ame1^Abe1^Ake0^Ase0; \
496
-        Da1 = Cz^Du0; \
497
-\
498
-        Cw = Aki1^Asi1^Agi0^Ami1^Abi0; \
499
-        Do0 = Cw^ROL32(Cz, 1); \
500
-        Cy = Aki0^Asi0^Agi1^Ami0^Abi1; \
501
-        Do1 = Cy^Cx; \
502
-\
503
-        Cx = Aba0^Aka1^Asa0^Aga0^Ama1; \
504
-        De0 = Cx^ROL32(Cy, 1); \
505
-        Cz = Aba1^Aka0^Asa1^Aga1^Ama0; \
506
-        De1 = Cz^Cw; \
507
-\
508
-        Cy = Amo0^Abo1^Ako0^Aso1^Ago0; \
509
-        Di0 = Du0^ROL32(Cy, 1); \
510
-        Cw = Amo1^Abo0^Ako1^Aso0^Ago1; \
511
-        Di1 = Du1^Cw; \
512
-\
513
-        Du0 = Cw^ROL32(Cz, 1); \
514
-        Du1 = Cy^Cx; \
515
-
516
-#define KeccakAtoD_round2() \
517
-        Cx = Aku1^Agu0^Abu1^Asu1^Amu1; \
518
-        Du1 = Ame0^Ake0^Age0^Abe0^Ase1; \
519
-        Da0 = Cx^ROL32(Du1, 1); \
520
-        Cz = Aku0^Agu1^Abu0^Asu0^Amu0; \
521
-        Du0 = Ame1^Ake1^Age1^Abe1^Ase0; \
522
-        Da1 = Cz^Du0; \
523
-\
524
-        Cw = Agi1^Abi1^Asi1^Ami0^Aki1; \
525
-        Do0 = Cw^ROL32(Cz, 1); \
526
-        Cy = Agi0^Abi0^Asi0^Ami1^Aki0; \
527
-        Do1 = Cy^Cx; \
528
-\
529
-        Cx = Aba0^Asa1^Ama1^Aka1^Aga1; \
530
-        De0 = Cx^ROL32(Cy, 1); \
531
-        Cz = Aba1^Asa0^Ama0^Aka0^Aga0; \
532
-        De1 = Cz^Cw; \
533
-\
534
-        Cy = Aso0^Amo0^Ako1^Ago0^Abo0; \
535
-        Di0 = Du0^ROL32(Cy, 1); \
536
-        Cw = Aso1^Amo1^Ako0^Ago1^Abo1; \
537
-        Di1 = Du1^Cw; \
538
-\
539
-        Du0 = Cw^ROL32(Cz, 1); \
540
-        Du1 = Cy^Cx; \
541
-
542
-#define KeccakAtoD_round3() \
543
-        Cx = Amu1^Agu0^Asu1^Aku0^Abu0; \
544
-        Du1 = Ake0^Abe1^Ame1^Age0^Ase1; \
545
-        Da0 = Cx^ROL32(Du1, 1); \
546
-        Cz = Amu0^Agu1^Asu0^Aku1^Abu1; \
547
-        Du0 = Ake1^Abe0^Ame0^Age1^Ase0; \
548
-        Da1 = Cz^Du0; \
549
-\
550
-        Cw = Asi0^Aki0^Abi1^Ami1^Agi1; \
551
-        Do0 = Cw^ROL32(Cz, 1); \
552
-        Cy = Asi1^Aki1^Abi0^Ami0^Agi0; \
553
-        Do1 = Cy^Cx; \
554
-\
555
-        Cx = Aba0^Ama0^Aga1^Asa1^Aka0; \
556
-        De0 = Cx^ROL32(Cy, 1); \
557
-        Cz = Aba1^Ama1^Aga0^Asa0^Aka1; \
558
-        De1 = Cz^Cw; \
559
-\
560
-        Cy = Ago1^Aso0^Ako0^Abo0^Amo1; \
561
-        Di0 = Du0^ROL32(Cy, 1); \
562
-        Cw = Ago0^Aso1^Ako1^Abo1^Amo0; \
563
-        Di1 = Du1^Cw; \
564
-\
565
-        Du0 = Cw^ROL32(Cz, 1); \
566
-        Du1 = Cy^Cx; \
567
-
568
-void KeccakP1600_Permute_Nrounds(void *state, unsigned int nRounds)
569
-{
570
-    {
571
-        UINT32 Da0, De0, Di0, Do0, Du0;
572
-        UINT32 Da1, De1, Di1, Do1, Du1;
573
-        UINT32 Ca0, Ce0, Ci0, Co0, Cu0;
574
-        UINT32 Cx, Cy, Cz, Cw;
575
-        #define Ba Ca0
576
-        #define Be Ce0
577
-        #define Bi Ci0
578
-        #define Bo Co0
579
-        #define Bu Cu0
580
-        const UINT32 *pRoundConstants = KeccakF1600RoundConstants_int2+(24-nRounds)*2;
581
-        UINT32 *stateAsHalfLanes = (UINT32*)state;
582
-        #define Aba0 stateAsHalfLanes[ 0]
583
-        #define Aba1 stateAsHalfLanes[ 1]
584
-        #define Abe0 stateAsHalfLanes[ 2]
585
-        #define Abe1 stateAsHalfLanes[ 3]
586
-        #define Abi0 stateAsHalfLanes[ 4]
587
-        #define Abi1 stateAsHalfLanes[ 5]
588
-        #define Abo0 stateAsHalfLanes[ 6]
589
-        #define Abo1 stateAsHalfLanes[ 7]
590
-        #define Abu0 stateAsHalfLanes[ 8]
591
-        #define Abu1 stateAsHalfLanes[ 9]
592
-        #define Aga0 stateAsHalfLanes[10]
593
-        #define Aga1 stateAsHalfLanes[11]
594
-        #define Age0 stateAsHalfLanes[12]
595
-        #define Age1 stateAsHalfLanes[13]
596
-        #define Agi0 stateAsHalfLanes[14]
597
-        #define Agi1 stateAsHalfLanes[15]
598
-        #define Ago0 stateAsHalfLanes[16]
599
-        #define Ago1 stateAsHalfLanes[17]
600
-        #define Agu0 stateAsHalfLanes[18]
601
-        #define Agu1 stateAsHalfLanes[19]
602
-        #define Aka0 stateAsHalfLanes[20]
603
-        #define Aka1 stateAsHalfLanes[21]
604
-        #define Ake0 stateAsHalfLanes[22]
605
-        #define Ake1 stateAsHalfLanes[23]
606
-        #define Aki0 stateAsHalfLanes[24]
607
-        #define Aki1 stateAsHalfLanes[25]
608
-        #define Ako0 stateAsHalfLanes[26]
609
-        #define Ako1 stateAsHalfLanes[27]
610
-        #define Aku0 stateAsHalfLanes[28]
611
-        #define Aku1 stateAsHalfLanes[29]
612
-        #define Ama0 stateAsHalfLanes[30]
613
-        #define Ama1 stateAsHalfLanes[31]
614
-        #define Ame0 stateAsHalfLanes[32]
615
-        #define Ame1 stateAsHalfLanes[33]
616
-        #define Ami0 stateAsHalfLanes[34]
617
-        #define Ami1 stateAsHalfLanes[35]
618
-        #define Amo0 stateAsHalfLanes[36]
619
-        #define Amo1 stateAsHalfLanes[37]
620
-        #define Amu0 stateAsHalfLanes[38]
621
-        #define Amu1 stateAsHalfLanes[39]
622
-        #define Asa0 stateAsHalfLanes[40]
623
-        #define Asa1 stateAsHalfLanes[41]
624
-        #define Ase0 stateAsHalfLanes[42]
625
-        #define Ase1 stateAsHalfLanes[43]
626
-        #define Asi0 stateAsHalfLanes[44]
627
-        #define Asi1 stateAsHalfLanes[45]
628
-        #define Aso0 stateAsHalfLanes[46]
629
-        #define Aso1 stateAsHalfLanes[47]
630
-        #define Asu0 stateAsHalfLanes[48]
631
-        #define Asu1 stateAsHalfLanes[49]
632
-
633
-        do
634
-        {
635
-            /* --- Code for 4 rounds */
636
-
637
-            /* --- using factor 2 interleaving, 64-bit lanes mapped to 32-bit words */
638
-
639
-            KeccakAtoD_round0();
640
-
641
-            Ba = (Aba0^Da0);
642
-            Be = ROL32((Age0^De0), 22);
643
-            Bi = ROL32((Aki1^Di1), 22);
644
-            Bo = ROL32((Amo1^Do1), 11);
645
-            Bu = ROL32((Asu0^Du0), 7);
646
-            Aba0 =   Ba ^((~Be)&  Bi );
647
-            Aba0 ^= *(pRoundConstants++);
648
-            Age0 =   Be ^((~Bi)&  Bo );
649
-            Aki1 =   Bi ^((~Bo)&  Bu );
650
-            Amo1 =   Bo ^((~Bu)&  Ba );
651
-            Asu0 =   Bu ^((~Ba)&  Be );
652
-
653
-            Ba = (Aba1^Da1);
654
-            Be = ROL32((Age1^De1), 22);
655
-            Bi = ROL32((Aki0^Di0), 21);
656
-            Bo = ROL32((Amo0^Do0), 10);
657
-            Bu = ROL32((Asu1^Du1), 7);
658
-            Aba1 =   Ba ^((~Be)&  Bi );
659
-            Aba1 ^= *(pRoundConstants++);
660
-            Age1 =   Be ^((~Bi)&  Bo );
661
-            Aki0 =   Bi ^((~Bo)&  Bu );
662
-            Amo0 =   Bo ^((~Bu)&  Ba );
663
-            Asu1 =   Bu ^((~Ba)&  Be );
664
-
665
-            Bi = ROL32((Aka1^Da1), 2);
666
-            Bo = ROL32((Ame1^De1), 23);
667
-            Bu = ROL32((Asi1^Di1), 31);
668
-            Ba = ROL32((Abo0^Do0), 14);
669
-            Be = ROL32((Agu0^Du0), 10);
670
-            Aka1 =   Ba ^((~Be)&  Bi );
671
-            Ame1 =   Be ^((~Bi)&  Bo );
672
-            Asi1 =   Bi ^((~Bo)&  Bu );
673
-            Abo0 =   Bo ^((~Bu)&  Ba );
674
-            Agu0 =   Bu ^((~Ba)&  Be );
675
-
676
-            Bi = ROL32((Aka0^Da0), 1);
677
-            Bo = ROL32((Ame0^De0), 22);
678
-            Bu = ROL32((Asi0^Di0), 30);
679
-            Ba = ROL32((Abo1^Do1), 14);
680
-            Be = ROL32((Agu1^Du1), 10);
681
-            Aka0 =   Ba ^((~Be)&  Bi );
682
-            Ame0 =   Be ^((~Bi)&  Bo );
683
-            Asi0 =   Bi ^((~Bo)&  Bu );
684
-            Abo1 =   Bo ^((~Bu)&  Ba );
685
-            Agu1 =   Bu ^((~Ba)&  Be );
686
-
687
-            Bu = ROL32((Asa0^Da0), 9);
688
-            Ba = ROL32((Abe1^De1), 1);
689
-            Be = ROL32((Agi0^Di0), 3);
690
-            Bi = ROL32((Ako1^Do1), 13);
691
-            Bo = ROL32((Amu0^Du0), 4);
692
-            Asa0 =   Ba ^((~Be)&  Bi );
693
-            Abe1 =   Be ^((~Bi)&  Bo );
694
-            Agi0 =   Bi ^((~Bo)&  Bu );
695
-            Ako1 =   Bo ^((~Bu)&  Ba );
696
-            Amu0 =   Bu ^((~Ba)&  Be );
697
-
698
-            Bu = ROL32((Asa1^Da1), 9);
699
-            Ba = (Abe0^De0);
700
-            Be = ROL32((Agi1^Di1), 3);
701
-            Bi = ROL32((Ako0^Do0), 12);
702
-            Bo = ROL32((Amu1^Du1), 4);
703
-            Asa1 =   Ba ^((~Be)&  Bi );
704
-            Abe0 =   Be ^((~Bi)&  Bo );
705
-            Agi1 =   Bi ^((~Bo)&  Bu );
706
-            Ako0 =   Bo ^((~Bu)&  Ba );
707
-            Amu1 =   Bu ^((~Ba)&  Be );
708
-
709
-            Be = ROL32((Aga0^Da0), 18);
710
-            Bi = ROL32((Ake0^De0), 5);
711
-            Bo = ROL32((Ami1^Di1), 8);
712
-            Bu = ROL32((Aso0^Do0), 28);
713
-            Ba = ROL32((Abu1^Du1), 14);
714
-            Aga0 =   Ba ^((~Be)&  Bi );
715
-            Ake0 =   Be ^((~Bi)&  Bo );
716
-            Ami1 =   Bi ^((~Bo)&  Bu );
717
-            Aso0 =   Bo ^((~Bu)&  Ba );
718
-            Abu1 =   Bu ^((~Ba)&  Be );
719
-
720
-            Be = ROL32((Aga1^Da1), 18);
721
-            Bi = ROL32((Ake1^De1), 5);
722
-            Bo = ROL32((Ami0^Di0), 7);
723
-            Bu = ROL32((Aso1^Do1), 28);
724
-            Ba = ROL32((Abu0^Du0), 13);
725
-            Aga1 =   Ba ^((~Be)&  Bi );
726
-            Ake1 =   Be ^((~Bi)&  Bo );
727
-            Ami0 =   Bi ^((~Bo)&  Bu );
728
-            Aso1 =   Bo ^((~Bu)&  Ba );
729
-            Abu0 =   Bu ^((~Ba)&  Be );
730
-
731
-            Bo = ROL32((Ama1^Da1), 21);
732
-            Bu = ROL32((Ase0^De0), 1);
733
-            Ba = ROL32((Abi0^Di0), 31);
734
-            Be = ROL32((Ago1^Do1), 28);
735
-            Bi = ROL32((Aku1^Du1), 20);
736
-            Ama1 =   Ba ^((~Be)&  Bi );
737
-            Ase0 =   Be ^((~Bi)&  Bo );
738
-            Abi0 =   Bi ^((~Bo)&  Bu );
739
-            Ago1 =   Bo ^((~Bu)&  Ba );
740
-            Aku1 =   Bu ^((~Ba)&  Be );
741
-
742
-            Bo = ROL32((Ama0^Da0), 20);
743
-            Bu = ROL32((Ase1^De1), 1);
744
-            Ba = ROL32((Abi1^Di1), 31);
745
-            Be = ROL32((Ago0^Do0), 27);
746
-            Bi = ROL32((Aku0^Du0), 19);
747
-            Ama0 =   Ba ^((~Be)&  Bi );
748
-            Ase1 =   Be ^((~Bi)&  Bo );
749
-            Abi1 =   Bi ^((~Bo)&  Bu );
750
-            Ago0 =   Bo ^((~Bu)&  Ba );
751
-            Aku0 =   Bu ^((~Ba)&  Be );
752
-
753
-            KeccakAtoD_round1();
754
-
755
-            Ba = (Aba0^Da0);
756
-            Be = ROL32((Ame1^De0), 22);
757
-            Bi = ROL32((Agi1^Di1), 22);
758
-            Bo = ROL32((Aso1^Do1), 11);
759
-            Bu = ROL32((Aku1^Du0), 7);
760
-            Aba0 =   Ba ^((~Be)&  Bi );
761
-            Aba0 ^= *(pRoundConstants++);
762
-            Ame1 =   Be ^((~Bi)&  Bo );
763
-            Agi1 =   Bi ^((~Bo)&  Bu );
764
-            Aso1 =   Bo ^((~Bu)&  Ba );
765
-            Aku1 =   Bu ^((~Ba)&  Be );
766
-
767
-            Ba = (Aba1^Da1);
768
-            Be = ROL32((Ame0^De1), 22);
769
-            Bi = ROL32((Agi0^Di0), 21);
770
-            Bo = ROL32((Aso0^Do0), 10);
771
-            Bu = ROL32((Aku0^Du1), 7);
772
-            Aba1 =   Ba ^((~Be)&  Bi );
773
-            Aba1 ^= *(pRoundConstants++);
774
-            Ame0 =   Be ^((~Bi)&  Bo );
775
-            Agi0 =   Bi ^((~Bo)&  Bu );
776
-            Aso0 =   Bo ^((~Bu)&  Ba );
777
-            Aku0 =   Bu ^((~Ba)&  Be );
778
-
779
-            Bi = ROL32((Asa1^Da1), 2);
780
-            Bo = ROL32((Ake1^De1), 23);
781
-            Bu = ROL32((Abi1^Di1), 31);
782
-            Ba = ROL32((Amo1^Do0), 14);
783
-            Be = ROL32((Agu0^Du0), 10);
784
-            Asa1 =   Ba ^((~Be)&  Bi );
785
-            Ake1 =   Be ^((~Bi)&  Bo );
786
-            Abi1 =   Bi ^((~Bo)&  Bu );
787
-            Amo1 =   Bo ^((~Bu)&  Ba );
788
-            Agu0 =   Bu ^((~Ba)&  Be );
789
-
790
-            Bi = ROL32((Asa0^Da0), 1);
791
-            Bo = ROL32((Ake0^De0), 22);
792
-            Bu = ROL32((Abi0^Di0), 30);
793
-            Ba = ROL32((Amo0^Do1), 14);
794
-            Be = ROL32((Agu1^Du1), 10);
795
-            Asa0 =   Ba ^((~Be)&  Bi );
796
-            Ake0 =   Be ^((~Bi)&  Bo );
797
-            Abi0 =   Bi ^((~Bo)&  Bu );
798
-            Amo0 =   Bo ^((~Bu)&  Ba );
799
-            Agu1 =   Bu ^((~Ba)&  Be );
800
-
801
-            Bu = ROL32((Ama1^Da0), 9);
802
-            Ba = ROL32((Age1^De1), 1);
803
-            Be = ROL32((Asi1^Di0), 3);
804
-            Bi = ROL32((Ako0^Do1), 13);
805
-            Bo = ROL32((Abu1^Du0), 4);
806
-            Ama1 =   Ba ^((~Be)&  Bi );
807
-            Age1 =   Be ^((~Bi)&  Bo );
808
-            Asi1 =   Bi ^((~Bo)&  Bu );
809
-            Ako0 =   Bo ^((~Bu)&  Ba );
810
-            Abu1 =   Bu ^((~Ba)&  Be );
811
-
812
-            Bu = ROL32((Ama0^Da1), 9);
813
-            Ba = (Age0^De0);
814
-            Be = ROL32((Asi0^Di1), 3);
815
-            Bi = ROL32((Ako1^Do0), 12);
816
-            Bo = ROL32((Abu0^Du1), 4);
817
-            Ama0 =   Ba ^((~Be)&  Bi );
818
-            Age0 =   Be ^((~Bi)&  Bo );
819
-            Asi0 =   Bi ^((~Bo)&  Bu );
820
-            Ako1 =   Bo ^((~Bu)&  Ba );
821
-            Abu0 =   Bu ^((~Ba)&  Be );
822
-
823
-            Be = ROL32((Aka1^Da0), 18);
824
-            Bi = ROL32((Abe1^De0), 5);
825
-            Bo = ROL32((Ami0^Di1), 8);
826
-            Bu = ROL32((Ago1^Do0), 28);
827
-            Ba = ROL32((Asu1^Du1), 14);
828
-            Aka1 =   Ba ^((~Be)&  Bi );
829
-            Abe1 =   Be ^((~Bi)&  Bo );
830
-            Ami0 =   Bi ^((~Bo)&  Bu );
831
-            Ago1 =   Bo ^((~Bu)&  Ba );
832
-            Asu1 =   Bu ^((~Ba)&  Be );
833
-
834
-            Be = ROL32((Aka0^Da1), 18);
835
-            Bi = ROL32((Abe0^De1), 5);
836
-            Bo = ROL32((Ami1^Di0), 7);
837
-            Bu = ROL32((Ago0^Do1), 28);
838
-            Ba = ROL32((Asu0^Du0), 13);
839
-            Aka0 =   Ba ^((~Be)&  Bi );
840
-            Abe0 =   Be ^((~Bi)&  Bo );
841
-            Ami1 =   Bi ^((~Bo)&  Bu );
842
-            Ago0 =   Bo ^((~Bu)&  Ba );
843
-            Asu0 =   Bu ^((~Ba)&  Be );
844
-
845
-            Bo = ROL32((Aga1^Da1), 21);
846
-            Bu = ROL32((Ase0^De0), 1);
847
-            Ba = ROL32((Aki1^Di0), 31);
848
-            Be = ROL32((Abo1^Do1), 28);
849
-            Bi = ROL32((Amu1^Du1), 20);
850
-            Aga1 =   Ba ^((~Be)&  Bi );
851
-            Ase0 =   Be ^((~Bi)&  Bo );
852
-            Aki1 =   Bi ^((~Bo)&  Bu );
853
-            Abo1 =   Bo ^((~Bu)&  Ba );
854
-            Amu1 =   Bu ^((~Ba)&  Be );
855
-
856
-            Bo = ROL32((Aga0^Da0), 20);
857
-            Bu = ROL32((Ase1^De1), 1);
858
-            Ba = ROL32((Aki0^Di1), 31);
859
-            Be = ROL32((Abo0^Do0), 27);
860
-            Bi = ROL32((Amu0^Du0), 19);
861
-            Aga0 =   Ba ^((~Be)&  Bi );
862
-            Ase1 =   Be ^((~Bi)&  Bo );
863
-            Aki0 =   Bi ^((~Bo)&  Bu );
864
-            Abo0 =   Bo ^((~Bu)&  Ba );
865
-            Amu0 =   Bu ^((~Ba)&  Be );
866
-
867
-            KeccakAtoD_round2();
868
-
869
-            Ba = (Aba0^Da0);
870
-            Be = ROL32((Ake1^De0), 22);
871
-            Bi = ROL32((Asi0^Di1), 22);
872
-            Bo = ROL32((Ago0^Do1), 11);
873
-            Bu = ROL32((Amu1^Du0), 7);
874
-            Aba0 =   Ba ^((~Be)&  Bi );
875
-            Aba0 ^= *(pRoundConstants++);
876
-            Ake1 =   Be ^((~Bi)&  Bo );
877
-            Asi0 =   Bi ^((~Bo)&  Bu );
878
-            Ago0 =   Bo ^((~Bu)&  Ba );
879
-            Amu1 =   Bu ^((~Ba)&  Be );
880
-
881
-            Ba = (Aba1^Da1);
882
-            Be = ROL32((Ake0^De1), 22);
883
-            Bi = ROL32((Asi1^Di0), 21);
884
-            Bo = ROL32((Ago1^Do0), 10);
885
-            Bu = ROL32((Amu0^Du1), 7);
886
-            Aba1 =   Ba ^((~Be)&  Bi );
887
-            Aba1 ^= *(pRoundConstants++);
888
-            Ake0 =   Be ^((~Bi)&  Bo );
889
-            Asi1 =   Bi ^((~Bo)&  Bu );
890
-            Ago1 =   Bo ^((~Bu)&  Ba );
891
-            Amu0 =   Bu ^((~Ba)&  Be );
892
-
893
-            Bi = ROL32((Ama0^Da1), 2);
894
-            Bo = ROL32((Abe0^De1), 23);
895
-            Bu = ROL32((Aki0^Di1), 31);
896
-            Ba = ROL32((Aso1^Do0), 14);
897
-            Be = ROL32((Agu0^Du0), 10);
898
-            Ama0 =   Ba ^((~Be)&  Bi );
899
-            Abe0 =   Be ^((~Bi)&  Bo );
900
-            Aki0 =   Bi ^((~Bo)&  Bu );
901
-            Aso1 =   Bo ^((~Bu)&  Ba );
902
-            Agu0 =   Bu ^((~Ba)&  Be );
903
-
904
-            Bi = ROL32((Ama1^Da0), 1);
905
-            Bo = ROL32((Abe1^De0), 22);
906
-            Bu = ROL32((Aki1^Di0), 30);
907
-            Ba = ROL32((Aso0^Do1), 14);
908
-            Be = ROL32((Agu1^Du1), 10);
909
-            Ama1 =   Ba ^((~Be)&  Bi );
910
-            Abe1 =   Be ^((~Bi)&  Bo );
911
-            Aki1 =   Bi ^((~Bo)&  Bu );
912
-            Aso0 =   Bo ^((~Bu)&  Ba );
913
-            Agu1 =   Bu ^((~Ba)&  Be );
914
-
915
-            Bu = ROL32((Aga1^Da0), 9);
916
-            Ba = ROL32((Ame0^De1), 1);
917
-            Be = ROL32((Abi1^Di0), 3);
918
-            Bi = ROL32((Ako1^Do1), 13);
919
-            Bo = ROL32((Asu1^Du0), 4);
920
-            Aga1 =   Ba ^((~Be)&  Bi );
921
-            Ame0 =   Be ^((~Bi)&  Bo );
922
-            Abi1 =   Bi ^((~Bo)&  Bu );
923
-            Ako1 =   Bo ^((~Bu)&  Ba );
924
-            Asu1 =   Bu ^((~Ba)&  Be );
925
-
926
-            Bu = ROL32((Aga0^Da1), 9);
927
-            Ba = (Ame1^De0);
928
-            Be = ROL32((Abi0^Di1), 3);
929
-            Bi = ROL32((Ako0^Do0), 12);
930
-            Bo = ROL32((Asu0^Du1), 4);
931
-            Aga0 =   Ba ^((~Be)&  Bi );
932
-            Ame1 =   Be ^((~Bi)&  Bo );
933
-            Abi0 =   Bi ^((~Bo)&  Bu );
934
-            Ako0 =   Bo ^((~Bu)&  Ba );
935
-            Asu0 =   Bu ^((~Ba)&  Be );
936
-
937
-            Be = ROL32((Asa1^Da0), 18);
938
-            Bi = ROL32((Age1^De0), 5);
939
-            Bo = ROL32((Ami1^Di1), 8);
940
-            Bu = ROL32((Abo1^Do0), 28);
941
-            Ba = ROL32((Aku0^Du1), 14);
942
-            Asa1 =   Ba ^((~Be)&  Bi );
943
-            Age1 =   Be ^((~Bi)&  Bo );
944
-            Ami1 =   Bi ^((~Bo)&  Bu );
945
-            Abo1 =   Bo ^((~Bu)&  Ba );
946
-            Aku0 =   Bu ^((~Ba)&  Be );
947
-
948
-            Be = ROL32((Asa0^Da1), 18);
949
-            Bi = ROL32((Age0^De1), 5);
950
-            Bo = ROL32((Ami0^Di0), 7);
951
-            Bu = ROL32((Abo0^Do1), 28);
952
-            Ba = ROL32((Aku1^Du0), 13);
953
-            Asa0 =   Ba ^((~Be)&  Bi );
954
-            Age0 =   Be ^((~Bi)&  Bo );
955
-            Ami0 =   Bi ^((~Bo)&  Bu );
956
-            Abo0 =   Bo ^((~Bu)&  Ba );
957
-            Aku1 =   Bu ^((~Ba)&  Be );
958
-
959
-            Bo = ROL32((Aka0^Da1), 21);
960
-            Bu = ROL32((Ase0^De0), 1);
961
-            Ba = ROL32((Agi1^Di0), 31);
962
-            Be = ROL32((Amo0^Do1), 28);
963
-            Bi = ROL32((Abu0^Du1), 20);
964
-            Aka0 =   Ba ^((~Be)&  Bi );
965
-            Ase0 =   Be ^((~Bi)&  Bo );
966
-            Agi1 =   Bi ^((~Bo)&  Bu );
967
-            Amo0 =   Bo ^((~Bu)&  Ba );
968
-            Abu0 =   Bu ^((~Ba)&  Be );
969
-
970
-            Bo = ROL32((Aka1^Da0), 20);
971
-            Bu = ROL32((Ase1^De1), 1);
972
-            Ba = ROL32((Agi0^Di1), 31);
973
-            Be = ROL32((Amo1^Do0), 27);
974
-            Bi = ROL32((Abu1^Du0), 19);
975
-            Aka1 =   Ba ^((~Be)&  Bi );
976
-            Ase1 =   Be ^((~Bi)&  Bo );
977
-            Agi0 =   Bi ^((~Bo)&  Bu );
978
-            Amo1 =   Bo ^((~Bu)&  Ba );
979
-            Abu1 =   Bu ^((~Ba)&  Be );
980
-
981
-            KeccakAtoD_round3();
982
-
983
-            Ba = (Aba0^Da0);
984
-            Be = ROL32((Abe0^De0), 22);
985
-            Bi = ROL32((Abi0^Di1), 22);
986
-            Bo = ROL32((Abo0^Do1), 11);
987
-            Bu = ROL32((Abu0^Du0), 7);
988
-            Aba0 =   Ba ^((~Be)&  Bi );
989
-            Aba0 ^= *(pRoundConstants++);
990
-            Abe0 =   Be ^((~Bi)&  Bo );
991
-            Abi0 =   Bi ^((~Bo)&  Bu );
992
-            Abo0 =   Bo ^((~Bu)&  Ba );
993
-            Abu0 =   Bu ^((~Ba)&  Be );
994
-
995
-            Ba = (Aba1^Da1);
996
-            Be = ROL32((Abe1^De1), 22);
997
-            Bi = ROL32((Abi1^Di0), 21);
998
-            Bo = ROL32((Abo1^Do0), 10);
999
-            Bu = ROL32((Abu1^Du1), 7);
1000
-            Aba1 =   Ba ^((~Be)&  Bi );
1001
-            Aba1 ^= *(pRoundConstants++);
1002
-            Abe1 =   Be ^((~Bi)&  Bo );
1003
-            Abi1 =   Bi ^((~Bo)&  Bu );
1004
-            Abo1 =   Bo ^((~Bu)&  Ba );
1005
-            Abu1 =   Bu ^((~Ba)&  Be );
1006
-
1007
-            Bi = ROL32((Aga0^Da1), 2);
1008
-            Bo = ROL32((Age0^De1), 23);
1009
-            Bu = ROL32((Agi0^Di1), 31);
1010
-            Ba = ROL32((Ago0^Do0), 14);
1011
-            Be = ROL32((Agu0^Du0), 10);
1012
-            Aga0 =   Ba ^((~Be)&  Bi );
1013
-            Age0 =   Be ^((~Bi)&  Bo );
1014
-            Agi0 =   Bi ^((~Bo)&  Bu );
1015
-            Ago0 =   Bo ^((~Bu)&  Ba );
1016
-            Agu0 =   Bu ^((~Ba)&  Be );
1017
-
1018
-            Bi = ROL32((Aga1^Da0), 1);
1019
-            Bo = ROL32((Age1^De0), 22);
1020
-            Bu = ROL32((Agi1^Di0), 30);
1021
-            Ba = ROL32((Ago1^Do1), 14);
1022
-            Be = ROL32((Agu1^Du1), 10);
1023
-            Aga1 =   Ba ^((~Be)&  Bi );
1024
-            Age1 =   Be ^((~Bi)&  Bo );
1025
-            Agi1 =   Bi ^((~Bo)&  Bu );
1026
-            Ago1 =   Bo ^((~Bu)&  Ba );
1027
-            Agu1 =   Bu ^((~Ba)&  Be );
1028
-
1029
-            Bu = ROL32((Aka0^Da0), 9);
1030
-            Ba = ROL32((Ake0^De1), 1);
1031
-            Be = ROL32((Aki0^Di0), 3);
1032
-            Bi = ROL32((Ako0^Do1), 13);
1033
-            Bo = ROL32((Aku0^Du0), 4);
1034
-            Aka0 =   Ba ^((~Be)&  Bi );
1035
-            Ake0 =   Be ^((~Bi)&  Bo );
1036
-            Aki0 =   Bi ^((~Bo)&  Bu );
1037
-            Ako0 =   Bo ^((~Bu)&  Ba );
1038
-            Aku0 =   Bu ^((~Ba)&  Be );
1039
-
1040
-            Bu = ROL32((Aka1^Da1), 9);
1041
-            Ba = (Ake1^De0);
1042
-            Be = ROL32((Aki1^Di1), 3);
1043
-            Bi = ROL32((Ako1^Do0), 12);
1044
-            Bo = ROL32((Aku1^Du1), 4);
1045
-            Aka1 =   Ba ^((~Be)&  Bi );
1046
-            Ake1 =   Be ^((~Bi)&  Bo );
1047
-            Aki1 =   Bi ^((~Bo)&  Bu );
1048
-            Ako1 =   Bo ^((~Bu)&  Ba );
1049
-            Aku1 =   Bu ^((~Ba)&  Be );
1050
-
1051
-            Be = ROL32((Ama0^Da0), 18);
1052
-            Bi = ROL32((Ame0^De0), 5);
1053
-            Bo = ROL32((Ami0^Di1), 8);
1054
-            Bu = ROL32((Amo0^Do0), 28);
1055
-            Ba = ROL32((Amu0^Du1), 14);
1056
-            Ama0 =   Ba ^((~Be)&  Bi );
1057
-            Ame0 =   Be ^((~Bi)&  Bo );
1058
-            Ami0 =   Bi ^((~Bo)&  Bu );
1059
-            Amo0 =   Bo ^((~Bu)&  Ba );
1060
-            Amu0 =   Bu ^((~Ba)&  Be );
1061
-
1062
-            Be = ROL32((Ama1^Da1), 18);
1063
-            Bi = ROL32((Ame1^De1), 5);
1064
-            Bo = ROL32((Ami1^Di0), 7);
1065
-            Bu = ROL32((Amo1^Do1), 28);
1066
-            Ba = ROL32((Amu1^Du0), 13);
1067
-            Ama1 =   Ba ^((~Be)&  Bi );
1068
-            Ame1 =   Be ^((~Bi)&  Bo );
1069
-            Ami1 =   Bi ^((~Bo)&  Bu );
1070
-            Amo1 =   Bo ^((~Bu)&  Ba );
1071
-            Amu1 =   Bu ^((~Ba)&  Be );
1072
-
1073
-            Bo = ROL32((Asa0^Da1), 21);
1074
-            Bu = ROL32((Ase0^De0), 1);
1075
-            Ba = ROL32((Asi0^Di0), 31);
1076
-            Be = ROL32((Aso0^Do1), 28);
1077
-            Bi = ROL32((Asu0^Du1), 20);
1078
-            Asa0 =   Ba ^((~Be)&  Bi );
1079
-            Ase0 =   Be ^((~Bi)&  Bo );
1080
-            Asi0 =   Bi ^((~Bo)&  Bu );
1081
-            Aso0 =   Bo ^((~Bu)&  Ba );
1082
-            Asu0 =   Bu ^((~Ba)&  Be );
1083
-
1084
-            Bo = ROL32((Asa1^Da0), 20);
1085
-            Bu = ROL32((Ase1^De1), 1);
1086
-            Ba = ROL32((Asi1^Di1), 31);
1087
-            Be = ROL32((Aso1^Do0), 27);
1088
-            Bi = ROL32((Asu1^Du0), 19);
1089
-            Asa1 =   Ba ^((~Be)&  Bi );
1090
-            Ase1 =   Be ^((~Bi)&  Bo );
1091
-            Asi1 =   Bi ^((~Bo)&  Bu );
1092
-            Aso1 =   Bo ^((~Bu)&  Ba );
1093
-            Asu1 =   Bu ^((~Ba)&  Be );
1094
-        }
1095
-        while ( *pRoundConstants != 0xFF );
1096
-
1097
-        #undef Aba0
1098
-        #undef Aba1
1099
-        #undef Abe0
1100
-        #undef Abe1
1101
-        #undef Abi0
1102
-        #undef Abi1
1103
-        #undef Abo0
1104
-        #undef Abo1
1105
-        #undef Abu0
1106
-        #undef Abu1
1107
-        #undef Aga0
1108
-        #undef Aga1
1109
-        #undef Age0
1110
-        #undef Age1
1111
-        #undef Agi0
1112
-        #undef Agi1
1113
-        #undef Ago0
1114
-        #undef Ago1
1115
-        #undef Agu0
1116
-        #undef Agu1
1117
-        #undef Aka0
1118
-        #undef Aka1
1119
-        #undef Ake0
1120
-        #undef Ake1
1121
-        #undef Aki0
1122
-        #undef Aki1
1123
-        #undef Ako0
1124
-        #undef Ako1
1125
-        #undef Aku0
1126
-        #undef Aku1
1127
-        #undef Ama0
1128
-        #undef Ama1
1129
-        #undef Ame0
1130
-        #undef Ame1
1131
-        #undef Ami0
1132
-        #undef Ami1
1133
-        #undef Amo0
1134
-        #undef Amo1
1135
-        #undef Amu0
1136
-        #undef Amu1
1137
-        #undef Asa0
1138
-        #undef Asa1
1139
-        #undef Ase0
1140
-        #undef Ase1
1141
-        #undef Asi0
1142
-        #undef Asi1
1143
-        #undef Aso0
1144
-        #undef Aso1
1145
-        #undef Asu0
1146
-        #undef Asu1
1147
-    }
1148
-}
1149
-
1150
-/* ---------------------------------------------------------------- */
1151
-
1152
-void KeccakP1600_Permute_12rounds(void *state)
1153
-{
1154
-     KeccakP1600_Permute_Nrounds(state, 12);
1155
-}
1156
-
1157
-/* ---------------------------------------------------------------- */
1158
-
1159
-void KeccakP1600_Permute_24rounds(void *state)
1160
-{
1161
-     KeccakP1600_Permute_Nrounds(state, 24);
1162
-}
Browse code

start implementation of undo and unsaved in redata. tentative sha3-512 support for unsaved integrity check

Dario Rodriguez authored on 26/02/2019 21:26:05
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,1162 @@
1
+/*
2
+Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni,
3
+Joan Daemen, Michaƫl Peeters, Gilles Van Assche and Ronny Van Keer, hereby
4
+denoted as "the implementer".
5
+
6
+For more information, feedback or questions, please refer to our websites:
7
+http://keccak.noekeon.org/
8
+http://keyak.noekeon.org/
9
+http://ketje.noekeon.org/
10
+
11
+To the extent possible under law, the implementer has waived all copyright
12
+and related or neighboring rights to the source code in this file.
13
+http://creativecommons.org/publicdomain/zero/1.0/
14
+*/
15
+
16
+#include    <string.h>
17
+/* #include "brg_endian.h" */
18
+#include "KeccakP-1600-SnP.h"
19
+#include "SnP-Relaned.h"
20
+
21
+typedef unsigned char UINT8;
22
+typedef unsigned int UINT32;
23
+/* WARNING: on 8-bit and 16-bit platforms, this should be replaced by: */
24
+
25
+/*typedef unsigned long       UINT32; */
26
+
27
+
28
+#define ROL32(a, offset) ((((UINT32)a) << (offset)) ^ (((UINT32)a) >> (32-(offset))))
29
+
30
+/* Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
31
+
32
+#define prepareToBitInterleaving(low, high, temp, temp0, temp1) \
33
+        temp0 = (low); \
34
+        temp = (temp0 ^ (temp0 >>  1)) & 0x22222222UL;  temp0 = temp0 ^ temp ^ (temp <<  1); \
35
+        temp = (temp0 ^ (temp0 >>  2)) & 0x0C0C0C0CUL;  temp0 = temp0 ^ temp ^ (temp <<  2); \
36
+        temp = (temp0 ^ (temp0 >>  4)) & 0x00F000F0UL;  temp0 = temp0 ^ temp ^ (temp <<  4); \
37
+        temp = (temp0 ^ (temp0 >>  8)) & 0x0000FF00UL;  temp0 = temp0 ^ temp ^ (temp <<  8); \
38
+        temp1 = (high); \
39
+        temp = (temp1 ^ (temp1 >>  1)) & 0x22222222UL;  temp1 = temp1 ^ temp ^ (temp <<  1); \
40
+        temp = (temp1 ^ (temp1 >>  2)) & 0x0C0C0C0CUL;  temp1 = temp1 ^ temp ^ (temp <<  2); \
41
+        temp = (temp1 ^ (temp1 >>  4)) & 0x00F000F0UL;  temp1 = temp1 ^ temp ^ (temp <<  4); \
42
+        temp = (temp1 ^ (temp1 >>  8)) & 0x0000FF00UL;  temp1 = temp1 ^ temp ^ (temp <<  8);
43
+
44
+#define toBitInterleavingAndXOR(low, high, even, odd, temp, temp0, temp1) \
45
+        prepareToBitInterleaving(low, high, temp, temp0, temp1) \
46
+        even ^= (temp0 & 0x0000FFFF) | (temp1 << 16); \
47
+        odd ^= (temp0 >> 16) | (temp1 & 0xFFFF0000);
48
+
49
+#define toBitInterleavingAndAND(low, high, even, odd, temp, temp0, temp1) \
50
+        prepareToBitInterleaving(low, high, temp, temp0, temp1) \
51
+        even &= (temp0 & 0x0000FFFF) | (temp1 << 16); \
52
+        odd &= (temp0 >> 16) | (temp1 & 0xFFFF0000);
53
+
54
+#define toBitInterleavingAndSet(low, high, even, odd, temp, temp0, temp1) \
55
+        prepareToBitInterleaving(low, high, temp, temp0, temp1) \
56
+        even = (temp0 & 0x0000FFFF) | (temp1 << 16); \
57
+        odd = (temp0 >> 16) | (temp1 & 0xFFFF0000);
58
+
59
+/* Credit to Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
60
+
61
+#define prepareFromBitInterleaving(even, odd, temp, temp0, temp1) \
62
+        temp0 = (even); \
63
+        temp1 = (odd); \
64
+        temp = (temp0 & 0x0000FFFF) | (temp1 << 16); \
65
+        temp1 = (temp0 >> 16) | (temp1 & 0xFFFF0000); \
66
+        temp0 = temp; \
67
+        temp = (temp0 ^ (temp0 >>  8)) & 0x0000FF00UL;  temp0 = temp0 ^ temp ^ (temp <<  8); \
68
+        temp = (temp0 ^ (temp0 >>  4)) & 0x00F000F0UL;  temp0 = temp0 ^ temp ^ (temp <<  4); \
69
+        temp = (temp0 ^ (temp0 >>  2)) & 0x0C0C0C0CUL;  temp0 = temp0 ^ temp ^ (temp <<  2); \
70
+        temp = (temp0 ^ (temp0 >>  1)) & 0x22222222UL;  temp0 = temp0 ^ temp ^ (temp <<  1); \
71
+        temp = (temp1 ^ (temp1 >>  8)) & 0x0000FF00UL;  temp1 = temp1 ^ temp ^ (temp <<  8); \
72
+        temp = (temp1 ^ (temp1 >>  4)) & 0x00F000F0UL;  temp1 = temp1 ^ temp ^ (temp <<  4); \
73
+        temp = (temp1 ^ (temp1 >>  2)) & 0x0C0C0C0CUL;  temp1 = temp1 ^ temp ^ (temp <<  2); \
74
+        temp = (temp1 ^ (temp1 >>  1)) & 0x22222222UL;  temp1 = temp1 ^ temp ^ (temp <<  1);
75
+
76
+#define fromBitInterleaving(even, odd, low, high, temp, temp0, temp1) \
77
+        prepareFromBitInterleaving(even, odd, temp, temp0, temp1) \
78
+        low = temp0; \
79
+        high = temp1;
80
+
81
+#define fromBitInterleavingAndXOR(even, odd, lowIn, highIn, lowOut, highOut, temp, temp0, temp1) \
82
+        prepareFromBitInterleaving(even, odd, temp, temp0, temp1) \
83
+        lowOut = lowIn ^ temp0; \
84
+        highOut = highIn ^ temp1;
85
+
86
+void KeccakP1600_SetBytesInLaneToZero(void *state, unsigned int lanePosition, unsigned int offset, unsigned int length)
87
+{
88
+    UINT8 laneAsBytes[8];
89
+    UINT32 low, high;
90
+    UINT32 temp, temp0, temp1;
91
+    UINT32 *stateAsHalfLanes = (UINT32*)state;
92
+
93
+    memset(laneAsBytes, 0xFF, offset);
94
+    memset(laneAsBytes+offset, 0x00, length);
95
+    memset(laneAsBytes+offset+length, 0xFF, 8-offset-length);
96
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
97
+    low = *((UINT32*)(laneAsBytes+0));
98
+    high = *((UINT32*)(laneAsBytes+4));
99
+#else
100
+    low = laneAsBytes[0]
101
+        | ((UINT32)(laneAsBytes[1]) << 8)
102
+        | ((UINT32)(laneAsBytes[2]) << 16)
103
+        | ((UINT32)(laneAsBytes[3]) << 24);
104
+    high = laneAsBytes[4]
105
+        | ((UINT32)(laneAsBytes[5]) << 8)
106
+        | ((UINT32)(laneAsBytes[6]) << 16)
107
+        | ((UINT32)(laneAsBytes[7]) << 24);
108
+#endif
109
+    toBitInterleavingAndAND(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
110
+}
111
+
112
+/* ---------------------------------------------------------------- */
113
+
114
+void KeccakP1600_Initialize(void *state)
115
+{
116
+    memset(state, 0, 200);
117
+}
118
+
119
+/* ---------------------------------------------------------------- */
120
+
121
+void KeccakP1600_AddByte(void *state, unsigned char byte, unsigned int offset)
122
+{
123
+    unsigned int lanePosition = offset/8;
124
+    unsigned int offsetInLane = offset%8;
125
+    UINT32 low, high;
126
+    UINT32 temp, temp0, temp1;
127
+    UINT32 *stateAsHalfLanes = (UINT32*)state;
128
+
129
+    if (offsetInLane < 4) {
130
+        low = (UINT32)byte << (offsetInLane*8);
131
+        high = 0;
132
+    }
133
+    else {
134
+        low = 0;
135
+        high = (UINT32)byte << ((offsetInLane-4)*8);
136
+    }
137
+    toBitInterleavingAndXOR(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
138
+}
139
+
140
+/* ---------------------------------------------------------------- */
141
+
142
+void KeccakP1600_AddBytesInLane(void *state, unsigned int lanePosition, const unsigned char *data, unsigned int offset, unsigned int length)
143
+{
144
+    UINT8 laneAsBytes[8];
145
+    UINT32 low, high;
146
+    UINT32 temp, temp0, temp1;
147
+    UINT32 *stateAsHalfLanes = (UINT32*)state;
148
+
149
+    memset(laneAsBytes, 0, 8);
150
+    memcpy(laneAsBytes+offset, data, length);
151
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
152
+    low = *((UINT32*)(laneAsBytes+0));
153
+    high = *((UINT32*)(laneAsBytes+4));
154
+#else
155
+    low = laneAsBytes[0]
156
+        | ((UINT32)(laneAsBytes[1]) << 8)
157
+        | ((UINT32)(laneAsBytes[2]) << 16)
158
+        | ((UINT32)(laneAsBytes[3]) << 24);
159
+    high = laneAsBytes[4]
160
+        | ((UINT32)(laneAsBytes[5]) << 8)
161
+        | ((UINT32)(laneAsBytes[6]) << 16)
162
+        | ((UINT32)(laneAsBytes[7]) << 24);
163
+#endif
164
+    toBitInterleavingAndXOR(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
165
+}
166
+
167
+/* ---------------------------------------------------------------- */
168
+
169
+void KeccakP1600_AddLanes(void *state, const unsigned char *data, unsigned int laneCount)
170
+{
171
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
172
+    const UINT32 * pI = (const UINT32 *)data;
173
+    UINT32 * pS = (UINT32*)state;
174
+    UINT32 t, x0, x1;
175
+    int i;
176
+    for (i = laneCount-1; i >= 0; --i) {
177
+#ifdef NO_MISALIGNED_ACCESSES
178
+        UINT32 low;
179
+        UINT32 high;
180
+        memcpy(&low, pI++, 4);
181
+        memcpy(&high, pI++, 4);
182
+        toBitInterleavingAndXOR(low, high, *(pS++), *(pS++), t, x0, x1);
183
+#else
184
+        toBitInterleavingAndXOR(*(pI++), *(pI++), *(pS++), *(pS++), t, x0, x1)
185
+#endif
186
+    }
187
+#else
188
+    unsigned int lanePosition;
189
+    for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
190
+        UINT8 laneAsBytes[8];
191
+        UINT32 low, high, temp, temp0, temp1;
192
+        UINT32 *stateAsHalfLanes;
193
+        memcpy(laneAsBytes, data+lanePosition*8, 8);
194
+        low = laneAsBytes[0]
195
+            | ((UINT32)(laneAsBytes[1]) << 8)
196
+            | ((UINT32)(laneAsBytes[2]) << 16)
197
+            | ((UINT32)(laneAsBytes[3]) << 24);
198
+        high = laneAsBytes[4]
199
+            | ((UINT32)(laneAsBytes[5]) << 8)
200
+            | ((UINT32)(laneAsBytes[6]) << 16)
201
+            | ((UINT32)(laneAsBytes[7]) << 24);
202
+        stateAsHalfLanes = (UINT32*)state;
203
+        toBitInterleavingAndXOR(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
204
+    }
205
+#endif
206
+}
207
+
208
+/* ---------------------------------------------------------------- */
209
+
210
+void KeccakP1600_AddBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
211
+{
212
+    SnP_AddBytes(state, data, offset, length, KeccakP1600_AddLanes, KeccakP1600_AddBytesInLane, 8);
213
+}
214
+
215
+/* ---------------------------------------------------------------- */
216
+
217
+void KeccakP1600_OverwriteBytesInLane(void *state, unsigned int lanePosition, const unsigned char *data, unsigned int offset, unsigned int length)
218
+{
219
+    KeccakP1600_SetBytesInLaneToZero(state, lanePosition, offset, length);
220
+    KeccakP1600_AddBytesInLane(state, lanePosition, data, offset, length);
221
+}
222
+
223
+/* ---------------------------------------------------------------- */
224
+
225
+void KeccakP1600_OverwriteLanes(void *state, const unsigned char *data, unsigned int laneCount)
226
+{
227
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
228
+    const UINT32 * pI = (const UINT32 *)data;
229
+    UINT32 * pS = (UINT32 *)state;
230
+    UINT32 t, x0, x1;
231
+    int i;
232
+    for (i = laneCount-1; i >= 0; --i) {
233
+#ifdef NO_MISALIGNED_ACCESSES
234
+        UINT32 low;
235
+        UINT32 high;
236
+        memcpy(&low, pI++, 4);
237
+        memcpy(&high, pI++, 4);
238
+        toBitInterleavingAndSet(low, high, *(pS++), *(pS++), t, x0, x1);
239
+#else
240
+        toBitInterleavingAndSet(*(pI++), *(pI++), *(pS++), *(pS++), t, x0, x1)
241
+#endif
242
+    }
243
+#else
244
+    unsigned int lanePosition;
245
+    for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
246
+        UINT8 laneAsBytes[8];
247
+        UINT32 low, high, temp, temp0, temp1;
248
+        UINT32 *stateAsHalfLanes;
249
+        memcpy(laneAsBytes, data+lanePosition*8, 8);
250
+        low = laneAsBytes[0]
251
+            | ((UINT32)(laneAsBytes[1]) << 8)
252
+            | ((UINT32)(laneAsBytes[2]) << 16)
253
+            | ((UINT32)(laneAsBytes[3]) << 24);
254
+        high = laneAsBytes[4]
255
+            | ((UINT32)(laneAsBytes[5]) << 8)
256
+            | ((UINT32)(laneAsBytes[6]) << 16)
257
+            | ((UINT32)(laneAsBytes[7]) << 24);
258
+        stateAsHalfLanes = (UINT32*)state;
259
+        toBitInterleavingAndSet(low, high, stateAsHalfLanes[lanePosition*2+0], stateAsHalfLanes[lanePosition*2+1], temp, temp0, temp1);
260
+    }
261
+#endif
262
+}
263
+
264
+/* ---------------------------------------------------------------- */
265
+
266
+void KeccakP1600_OverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
267
+{
268
+    SnP_OverwriteBytes(state, data, offset, length, KeccakP1600_OverwriteLanes, KeccakP1600_OverwriteBytesInLane, 8);
269
+}
270
+
271
+/* ---------------------------------------------------------------- */
272
+
273
+void KeccakP1600_OverwriteWithZeroes(void *state, unsigned int byteCount)
274
+{
275
+    UINT32 *stateAsHalfLanes = (UINT32*)state;
276
+    unsigned int i;
277
+
278
+    for(i=0; i<byteCount/8; i++) {
279
+        stateAsHalfLanes[i*2+0] = 0;
280
+        stateAsHalfLanes[i*2+1] = 0;
281
+    }
282
+    if (byteCount%8 != 0)
283
+        KeccakP1600_SetBytesInLaneToZero(state, byteCount/8, 0, byteCount%8);
284
+}
285
+
286
+/* ---------------------------------------------------------------- */
287
+
288
+void KeccakP1600_ExtractBytesInLane(const void *state, unsigned int lanePosition, unsigned char *data, unsigned int offset, unsigned int length)
289
+{
290
+    UINT32 *stateAsHalfLanes = (UINT32*)state;
291
+    UINT32 low, high, temp, temp0, temp1;
292
+    UINT8 laneAsBytes[8];
293
+
294
+    fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
295
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
296
+    *((UINT32*)(laneAsBytes+0)) = low;
297
+    *((UINT32*)(laneAsBytes+4)) = high;
298
+#else
299
+    laneAsBytes[0] = low & 0xFF;
300
+    laneAsBytes[1] = (low >> 8) & 0xFF;
301
+    laneAsBytes[2] = (low >> 16) & 0xFF;
302
+    laneAsBytes[3] = (low >> 24) & 0xFF;
303
+    laneAsBytes[4] = high & 0xFF;
304
+    laneAsBytes[5] = (high >> 8) & 0xFF;
305
+    laneAsBytes[6] = (high >> 16) & 0xFF;
306
+    laneAsBytes[7] = (high >> 24) & 0xFF;
307
+#endif
308
+    memcpy(data, laneAsBytes+offset, length);
309
+}
310
+
311
+/* ---------------------------------------------------------------- */
312
+
313
+void KeccakP1600_ExtractLanes(const void *state, unsigned char *data, unsigned int laneCount)
314
+{
315
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
316
+    UINT32 * pI = (UINT32 *)data;
317
+    const UINT32 * pS = ( const UINT32 *)state;
318
+    UINT32 t, x0, x1;
319
+    int i;
320
+    for (i = laneCount-1; i >= 0; --i) {
321
+#ifdef NO_MISALIGNED_ACCESSES
322
+        UINT32 low;
323
+        UINT32 high;
324
+        fromBitInterleaving(*(pS++), *(pS++), low, high, t, x0, x1);
325
+        memcpy(pI++, &low, 4);
326
+        memcpy(pI++, &high, 4);
327
+#else
328
+        fromBitInterleaving(*(pS++), *(pS++), *(pI++), *(pI++), t, x0, x1)
329
+#endif
330
+    }
331
+#else
332
+    unsigned int lanePosition;
333
+    for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
334
+        UINT32 *stateAsHalfLanes = (UINT32*)state;
335
+        UINT32 low, high, temp, temp0, temp1;
336
+        UINT8 laneAsBytes[8];
337
+        fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
338
+        laneAsBytes[0] = low & 0xFF;
339
+        laneAsBytes[1] = (low >> 8) & 0xFF;
340
+        laneAsBytes[2] = (low >> 16) & 0xFF;
341
+        laneAsBytes[3] = (low >> 24) & 0xFF;
342
+        laneAsBytes[4] = high & 0xFF;
343
+        laneAsBytes[5] = (high >> 8) & 0xFF;
344
+        laneAsBytes[6] = (high >> 16) & 0xFF;
345
+        laneAsBytes[7] = (high >> 24) & 0xFF;
346
+        memcpy(data+lanePosition*8, laneAsBytes, 8);
347
+    }
348
+#endif
349
+}
350
+
351
+/* ---------------------------------------------------------------- */
352
+
353
+void KeccakP1600_ExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length)
354
+{
355
+    SnP_ExtractBytes(state, data, offset, length, KeccakP1600_ExtractLanes, KeccakP1600_ExtractBytesInLane, 8);
356
+}
357
+
358
+/* ---------------------------------------------------------------- */
359
+
360
+void KeccakP1600_ExtractAndAddBytesInLane(const void *state, unsigned int lanePosition, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
361
+{
362
+    UINT32 *stateAsHalfLanes = (UINT32*)state;
363
+    UINT32 low, high, temp, temp0, temp1;
364
+    UINT8 laneAsBytes[8];
365
+    unsigned int i;
366
+
367
+    fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
368
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
369
+    *((UINT32*)(laneAsBytes+0)) = low;
370
+    *((UINT32*)(laneAsBytes+4)) = high;
371
+#else
372
+    laneAsBytes[0] = low & 0xFF;
373
+    laneAsBytes[1] = (low >> 8) & 0xFF;
374
+    laneAsBytes[2] = (low >> 16) & 0xFF;
375
+    laneAsBytes[3] = (low >> 24) & 0xFF;
376
+    laneAsBytes[4] = high & 0xFF;
377
+    laneAsBytes[5] = (high >> 8) & 0xFF;
378
+    laneAsBytes[6] = (high >> 16) & 0xFF;
379
+    laneAsBytes[7] = (high >> 24) & 0xFF;
380
+#endif
381
+    for(i=0; i<length; i++)
382
+        output[i] = input[i] ^ laneAsBytes[offset+i];
383
+}
384
+
385
+/* ---------------------------------------------------------------- */
386
+
387
+void KeccakP1600_ExtractAndAddLanes(const void *state, const unsigned char *input, unsigned char *output, unsigned int laneCount)
388
+{
389
+#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
390
+    const UINT32 * pI = (const UINT32 *)input;
391
+    UINT32 * pO = (UINT32 *)output;
392
+    const UINT32 * pS = (const UINT32 *)state;
393
+    UINT32 t, x0, x1;
394
+    int i;
395
+    for (i = laneCount-1; i >= 0; --i) {
396
+#ifdef NO_MISALIGNED_ACCESSES
397
+        UINT32 low;
398
+        UINT32 high;
399
+        fromBitInterleaving(*(pS++), *(pS++), low, high, t, x0, x1);
400
+        *(pO++) = *(pI++) ^ low;
401
+        *(pO++) = *(pI++) ^ high;
402
+#else
403
+        fromBitInterleavingAndXOR(*(pS++), *(pS++), *(pI++), *(pI++), *(pO++), *(pO++), t, x0, x1)
404
+#endif
405
+    }
406
+#else
407
+    unsigned int lanePosition;
408
+    for(lanePosition=0; lanePosition<laneCount; lanePosition++) {
409
+        UINT32 *stateAsHalfLanes = (UINT32*)state;
410
+        UINT32 low, high, temp, temp0, temp1;
411
+        UINT8 laneAsBytes[8];
412
+        fromBitInterleaving(stateAsHalfLanes[lanePosition*2], stateAsHalfLanes[lanePosition*2+1], low, high, temp, temp0, temp1);
413
+        laneAsBytes[0] = low & 0xFF;
414
+        laneAsBytes[1] = (low >> 8) & 0xFF;
415
+        laneAsBytes[2] = (low >> 16) & 0xFF;
416
+        laneAsBytes[3] = (low >> 24) & 0xFF;
417
+        laneAsBytes[4] = high & 0xFF;
418
+        laneAsBytes[5] = (high >> 8) & 0xFF;
419
+        laneAsBytes[6] = (high >> 16) & 0xFF;
420
+        laneAsBytes[7] = (high >> 24) & 0xFF;
421
+        ((UINT32*)(output+lanePosition*8))[0] = ((UINT32*)(input+lanePosition*8))[0] ^ (*(const UINT32*)(laneAsBytes+0));
422
+        ((UINT32*)(output+lanePosition*8))[1] = ((UINT32*)(input+lanePosition*8))[0] ^ (*(const UINT32*)(laneAsBytes+4));
423
+    }
424
+#endif
425
+}
426
+/* ---------------------------------------------------------------- */
427
+
428
+void KeccakP1600_ExtractAndAddBytes(const void *state, const unsigned char *input, unsigned char *output, unsigned int offset, unsigned int length)
429
+{
430
+    SnP_ExtractAndAddBytes(state, input, output, offset, length, KeccakP1600_ExtractAndAddLanes, KeccakP1600_ExtractAndAddBytesInLane, 8);
431
+}
432
+
433
+/* ---------------------------------------------------------------- */
434
+
435
+static const UINT32 KeccakF1600RoundConstants_int2[2*24+1] =
436
+{
437
+    0x00000001UL,    0x00000000UL,
438
+    0x00000000UL,    0x00000089UL,
439
+    0x00000000UL,    0x8000008bUL,
440
+    0x00000000UL,    0x80008080UL,
441
+    0x00000001UL,    0x0000008bUL,
442
+    0x00000001UL,    0x00008000UL,
443
+    0x00000001UL,    0x80008088UL,
444
+    0x00000001UL,    0x80000082UL,
445
+    0x00000000UL,    0x0000000bUL,
446
+    0x00000000UL,    0x0000000aUL,
447
+    0x00000001UL,    0x00008082UL,
448
+    0x00000000UL,    0x00008003UL,
449
+    0x00000001UL,    0x0000808bUL,
450
+    0x00000001UL,    0x8000000bUL,
451
+    0x00000001UL,    0x8000008aUL,
452
+    0x00000001UL,    0x80000081UL,
453
+    0x00000000UL,    0x80000081UL,
454
+    0x00000000UL,    0x80000008UL,
455
+    0x00000000UL,    0x00000083UL,
456
+    0x00000000UL,    0x80008003UL,
457
+    0x00000001UL,    0x80008088UL,
458
+    0x00000000UL,    0x80000088UL,
459
+    0x00000001UL,    0x00008000UL,
460
+    0x00000000UL,    0x80008082UL,
461
+    0x000000FFUL
462
+};
463
+
464
+#define KeccakAtoD_round0() \
465
+        Cx = Abu0^Agu0^Aku0^Amu0^Asu0; \
466
+        Du1 = Abe1^Age1^Ake1^Ame1^Ase1; \
467
+        Da0 = Cx^ROL32(Du1, 1); \
468
+        Cz = Abu1^Agu1^Aku1^Amu1^Asu1; \
469
+        Du0 = Abe0^Age0^Ake0^Ame0^Ase0; \
470
+        Da1 = Cz^Du0; \
471
+\
472
+        Cw = Abi0^Agi0^Aki0^Ami0^Asi0; \
473
+        Do0 = Cw^ROL32(Cz, 1); \
474
+        Cy = Abi1^Agi1^Aki1^Ami1^Asi1; \
475
+        Do1 = Cy^Cx; \
476
+\
477
+        Cx = Aba0^Aga0^Aka0^Ama0^Asa0; \
478
+        De0 = Cx^ROL32(Cy, 1); \
479
+        Cz = Aba1^Aga1^Aka1^Ama1^Asa1; \
480
+        De1 = Cz^Cw; \
481
+\
482
+        Cy = Abo1^Ago1^Ako1^Amo1^Aso1; \
483
+        Di0 = Du0^ROL32(Cy, 1); \
484
+        Cw = Abo0^Ago0^Ako0^Amo0^Aso0; \
485
+        Di1 = Du1^Cw; \
486
+\
487
+        Du0 = Cw^ROL32(Cz, 1); \
488
+        Du1 = Cy^Cx; \
489
+
490
+#define KeccakAtoD_round1() \
491
+        Cx = Asu0^Agu0^Amu0^Abu1^Aku1; \
492
+        Du1 = Age1^Ame0^Abe0^Ake1^Ase1; \
493
+        Da0 = Cx^ROL32(Du1, 1); \
494
+        Cz = Asu1^Agu1^Amu1^Abu0^Aku0; \
495
+        Du0 = Age0^Ame1^Abe1^Ake0^Ase0; \
496
+        Da1 = Cz^Du0; \
497
+\
498
+        Cw = Aki1^Asi1^Agi0^Ami1^Abi0; \
499
+        Do0 = Cw^ROL32(Cz, 1); \
500
+        Cy = Aki0^Asi0^Agi1^Ami0^Abi1; \
501
+        Do1 = Cy^Cx; \
502
+\
503
+        Cx = Aba0^Aka1^Asa0^Aga0^Ama1; \
504
+        De0 = Cx^ROL32(Cy, 1); \
505
+        Cz = Aba1^Aka0^Asa1^Aga1^Ama0; \
506
+        De1 = Cz^Cw; \
507
+\
508
+        Cy = Amo0^Abo1^Ako0^Aso1^Ago0; \
509
+        Di0 = Du0^ROL32(Cy, 1); \
510
+        Cw = Amo1^Abo0^Ako1^Aso0^Ago1; \
511
+        Di1 = Du1^Cw; \
512
+\
513
+        Du0 = Cw^ROL32(Cz, 1); \
514
+        Du1 = Cy^Cx; \
515
+
516
+#define KeccakAtoD_round2() \
517
+        Cx = Aku1^Agu0^Abu1^Asu1^Amu1; \
518
+        Du1 = Ame0^Ake0^Age0^Abe0^Ase1; \
519
+        Da0 = Cx^ROL32(Du1, 1); \
520
+        Cz = Aku0^Agu1^Abu0^Asu0^Amu0; \
521
+        Du0 = Ame1^Ake1^Age1^Abe1^Ase0; \
522
+        Da1 = Cz^Du0; \
523
+\
524
+        Cw = Agi1^Abi1^Asi1^Ami0^Aki1; \
525
+        Do0 = Cw^ROL32(Cz, 1); \
526
+        Cy = Agi0^Abi0^Asi0^Ami1^Aki0; \
527
+        Do1 = Cy^Cx; \
528
+\
529
+        Cx = Aba0^Asa1^Ama1^Aka1^Aga1; \
530
+        De0 = Cx^ROL32(Cy, 1); \
531
+        Cz = Aba1^Asa0^Ama0^Aka0^Aga0; \
532
+        De1 = Cz^Cw; \
533
+\
534
+        Cy = Aso0^Amo0^Ako1^Ago0^Abo0; \
535
+        Di0 = Du0^ROL32(Cy, 1); \
536
+        Cw = Aso1^Amo1^Ako0^Ago1^Abo1; \
537
+        Di1 = Du1^Cw; \
538
+\
539
+        Du0 = Cw^ROL32(Cz, 1); \
540
+        Du1 = Cy^Cx; \
541
+
542
+#define KeccakAtoD_round3() \
543
+        Cx = Amu1^Agu0^Asu1^Aku0^Abu0; \
544
+        Du1 = Ake0^Abe1^Ame1^Age0^Ase1; \
545
+        Da0 = Cx^ROL32(Du1, 1); \
546
+        Cz = Amu0^Agu1^Asu0^Aku1^Abu1; \
547
+        Du0 = Ake1^Abe0^Ame0^Age1^Ase0; \
548
+        Da1 = Cz^Du0; \
549
+\
550
+        Cw = Asi0^Aki0^Abi1^Ami1^Agi1; \
551
+        Do0 = Cw^ROL32(Cz, 1); \
552
+        Cy = Asi1^Aki1^Abi0^Ami0^Agi0; \
553
+        Do1 = Cy^Cx; \
554
+\
555
+        Cx = Aba0^Ama0^Aga1^Asa1^Aka0; \
556
+        De0 = Cx^ROL32(Cy, 1); \
557
+        Cz = Aba1^Ama1^Aga0^Asa0^Aka1; \
558
+        De1 = Cz^Cw; \
559
+\
560
+        Cy = Ago1^Aso0^Ako0^Abo0^Amo1; \
561
+        Di0 = Du0^ROL32(Cy, 1); \
562
+        Cw = Ago0^Aso1^Ako1^Abo1^Amo0; \
563
+        Di1 = Du1^Cw; \
564
+\
565
+        Du0 = Cw^ROL32(Cz, 1); \
566
+        Du1 = Cy^Cx; \
567
+
568
+void KeccakP1600_Permute_Nrounds(void *state, unsigned int nRounds)
569
+{
570
+    {
571
+        UINT32 Da0, De0, Di0, Do0, Du0;
572
+        UINT32 Da1, De1, Di1, Do1, Du1;
573
+        UINT32 Ca0, Ce0, Ci0, Co0, Cu0;
574
+        UINT32 Cx, Cy, Cz, Cw;
575
+        #define Ba Ca0
576
+        #define Be Ce0
577
+        #define Bi Ci0
578
+        #define Bo Co0
579
+        #define Bu Cu0
580
+        const UINT32 *pRoundConstants = KeccakF1600RoundConstants_int2+(24-nRounds)*2;
581
+        UINT32 *stateAsHalfLanes = (UINT32*)state;
582
+        #define Aba0 stateAsHalfLanes[ 0]
583
+        #define Aba1 stateAsHalfLanes[ 1]
584
+        #define Abe0 stateAsHalfLanes[ 2]
585
+        #define Abe1 stateAsHalfLanes[ 3]
586
+        #define Abi0 stateAsHalfLanes[ 4]
587
+        #define Abi1 stateAsHalfLanes[ 5]
588
+        #define Abo0 stateAsHalfLanes[ 6]
589
+        #define Abo1 stateAsHalfLanes[ 7]
590
+        #define Abu0 stateAsHalfLanes[ 8]
591
+        #define Abu1 stateAsHalfLanes[ 9]
592
+        #define Aga0 stateAsHalfLanes[10]
593
+        #define Aga1 stateAsHalfLanes[11]
594
+        #define Age0 stateAsHalfLanes[12]
595
+        #define Age1 stateAsHalfLanes[13]
596
+        #define Agi0 stateAsHalfLanes[14]
597
+        #define Agi1 stateAsHalfLanes[15]
598
+        #define Ago0 stateAsHalfLanes[16]
599
+        #define Ago1 stateAsHalfLanes[17]
600
+        #define Agu0 stateAsHalfLanes[18]
601
+        #define Agu1 stateAsHalfLanes[19]
602
+        #define Aka0 stateAsHalfLanes[20]
603
+        #define Aka1 stateAsHalfLanes[21]
604
+        #define Ake0 stateAsHalfLanes[22]
605
+        #define Ake1 stateAsHalfLanes[23]
606
+        #define Aki0 stateAsHalfLanes[24]
607
+        #define Aki1 stateAsHalfLanes[25]
608
+        #define Ako0 stateAsHalfLanes[26]
609
+        #define Ako1 stateAsHalfLanes[27]
610
+        #define Aku0 stateAsHalfLanes[28]
611
+        #define Aku1 stateAsHalfLanes[29]
612
+        #define Ama0 stateAsHalfLanes[30]
613
+        #define Ama1 stateAsHalfLanes[31]
614
+        #define Ame0 stateAsHalfLanes[32]
615
+        #define Ame1 stateAsHalfLanes[33]
616
+        #define Ami0 stateAsHalfLanes[34]
617
+        #define Ami1 stateAsHalfLanes[35]
618
+        #define Amo0 stateAsHalfLanes[36]
619
+        #define Amo1 stateAsHalfLanes[37]
620
+        #define Amu0 stateAsHalfLanes[38]
621
+        #define Amu1 stateAsHalfLanes[39]
622
+        #define Asa0 stateAsHalfLanes[40]
623
+        #define Asa1 stateAsHalfLanes[41]
624
+        #define Ase0 stateAsHalfLanes[42]
625
+        #define Ase1 stateAsHalfLanes[43]
626
+        #define Asi0 stateAsHalfLanes[44]
627
+        #define Asi1 stateAsHalfLanes[45]
628
+        #define Aso0 stateAsHalfLanes[46]
629
+        #define Aso1 stateAsHalfLanes[47]
630
+        #define Asu0 stateAsHalfLanes[48]
631
+        #define Asu1 stateAsHalfLanes[49]
632
+
633
+        do
634
+        {
635
+            /* --- Code for 4 rounds */
636
+
637
+            /* --- using factor 2 interleaving, 64-bit lanes mapped to 32-bit words */
638
+
639
+            KeccakAtoD_round0();
640
+
641
+            Ba = (Aba0^Da0);
642
+            Be = ROL32((Age0^De0), 22);
643
+            Bi = ROL32((Aki1^Di1), 22);
644
+            Bo = ROL32((Amo1^Do1), 11);
645
+            Bu = ROL32((Asu0^Du0), 7);
646
+            Aba0 =   Ba ^((~Be)&  Bi );
647
+            Aba0 ^= *(pRoundConstants++);
648
+            Age0 =   Be ^((~Bi)&  Bo );
649
+            Aki1 =   Bi ^((~Bo)&  Bu );
650
+            Amo1 =   Bo ^((~Bu)&  Ba );
651
+            Asu0 =   Bu ^((~Ba)&  Be );
652
+
653
+            Ba = (Aba1^Da1);
654
+            Be = ROL32((Age1^De1), 22);
655
+            Bi = ROL32((Aki0^Di0), 21);
656
+            Bo = ROL32((Amo0^Do0), 10);
657
+            Bu = ROL32((Asu1^Du1), 7);
658
+            Aba1 =   Ba ^((~Be)&  Bi );
659
+            Aba1 ^= *(pRoundConstants++);
660
+            Age1 =   Be ^((~Bi)&  Bo );
661
+            Aki0 =   Bi ^((~Bo)&  Bu );
662
+            Amo0 =   Bo ^((~Bu)&  Ba );
663
+            Asu1 =   Bu ^((~Ba)&  Be );
664
+
665
+            Bi = ROL32((Aka1^Da1), 2);
666
+            Bo = ROL32((Ame1^De1), 23);
667
+            Bu = ROL32((Asi1^Di1), 31);
668
+            Ba = ROL32((Abo0^Do0), 14);
669
+            Be = ROL32((Agu0^Du0), 10);
670
+            Aka1 =   Ba ^((~Be)&  Bi );
671
+            Ame1 =   Be ^((~Bi)&  Bo );
672
+            Asi1 =   Bi ^((~Bo)&  Bu );
673
+            Abo0 =   Bo ^((~Bu)&  Ba );
674
+            Agu0 =   Bu ^((~Ba)&  Be );
675
+
676
+            Bi = ROL32((Aka0^Da0), 1);
677
+            Bo = ROL32((Ame0^De0), 22);
678
+            Bu = ROL32((Asi0^Di0), 30);
679
+            Ba = ROL32((Abo1^Do1), 14);
680
+            Be = ROL32((Agu1^Du1), 10);
681
+            Aka0 =   Ba ^((~Be)&  Bi );
682
+            Ame0 =   Be ^((~Bi)&  Bo );
683
+            Asi0 =   Bi ^((~Bo)&  Bu );
684
+            Abo1 =   Bo ^((~Bu)&  Ba );
685
+            Agu1 =   Bu ^((~Ba)&  Be );
686
+
687
+            Bu = ROL32((Asa0^Da0), 9);
688
+            Ba = ROL32((Abe1^De1), 1);
689
+            Be = ROL32((Agi0^Di0), 3);
690
+            Bi = ROL32((Ako1^Do1), 13);
691
+            Bo = ROL32((Amu0^Du0), 4);
692
+            Asa0 =   Ba ^((~Be)&  Bi );
693
+            Abe1 =   Be ^((~Bi)&  Bo );
694
+            Agi0 =   Bi ^((~Bo)&  Bu );
695
+            Ako1 =   Bo ^((~Bu)&  Ba );
696
+            Amu0 =   Bu ^((~Ba)&  Be );
697
+
698
+            Bu = ROL32((Asa1^Da1), 9);
699
+            Ba = (Abe0^De0);
700
+            Be = ROL32((Agi1^Di1), 3);
701
+            Bi = ROL32((Ako0^Do0), 12);
702
+            Bo = ROL32((Amu1^Du1), 4);
703
+            Asa1 =   Ba ^((~Be)&  Bi );
704
+            Abe0 =   Be ^((~Bi)&  Bo );
705
+            Agi1 =   Bi ^((~Bo)&  Bu );
706
+            Ako0 =   Bo ^((~Bu)&  Ba );
707
+            Amu1 =   Bu ^((~Ba)&  Be );
708
+
709
+            Be = ROL32((Aga0^Da0), 18);
710
+            Bi = ROL32((Ake0^De0), 5);
711
+            Bo = ROL32((Ami1^Di1), 8);
712
+            Bu = ROL32((Aso0^Do0), 28);
713
+            Ba = ROL32((Abu1^Du1), 14);
714
+            Aga0 =   Ba ^((~Be)&  Bi );
715
+            Ake0 =   Be ^((~Bi)&  Bo );
716
+            Ami1 =   Bi ^((~Bo)&  Bu );
717
+            Aso0 =   Bo ^((~Bu)&  Ba );
718
+            Abu1 =   Bu ^((~Ba)&  Be );
719
+
720
+            Be = ROL32((Aga1^Da1), 18);
721
+            Bi = ROL32((Ake1^De1), 5);
722
+            Bo = ROL32((Ami0^Di0), 7);
723
+            Bu = ROL32((Aso1^Do1), 28);
724
+            Ba = ROL32((Abu0^Du0), 13);
725
+            Aga1 =   Ba ^((~Be)&  Bi );
726
+            Ake1 =   Be ^((~Bi)&  Bo );
727
+            Ami0 =   Bi ^((~Bo)&  Bu );
728
+            Aso1 =   Bo ^((~Bu)&  Ba );
729
+            Abu0 =   Bu ^((~Ba)&  Be );
730
+
731
+            Bo = ROL32((Ama1^Da1), 21);
732
+            Bu = ROL32((Ase0^De0), 1);
733
+            Ba = ROL32((Abi0^Di0), 31);
734
+            Be = ROL32((Ago1^Do1), 28);
735
+            Bi = ROL32((Aku1^Du1), 20);
736
+            Ama1 =   Ba ^((~Be)&  Bi );
737
+            Ase0 =   Be ^((~Bi)&  Bo );
738
+            Abi0 =   Bi ^((~Bo)&  Bu );
739
+            Ago1 =   Bo ^((~Bu)&  Ba );
740
+            Aku1 =   Bu ^((~Ba)&  Be );
741
+
742
+            Bo = ROL32((Ama0^Da0), 20);
743
+            Bu = ROL32((Ase1^De1), 1);
744
+            Ba = ROL32((Abi1^Di1), 31);
745
+            Be = ROL32((Ago0^Do0), 27);
746
+            Bi = ROL32((Aku0^Du0), 19);
747
+            Ama0 =   Ba ^((~Be)&  Bi );
748
+            Ase1 =   Be ^((~Bi)&  Bo );
749
+            Abi1 =   Bi ^((~Bo)&  Bu );
750
+            Ago0 =   Bo ^((~Bu)&  Ba );
751
+            Aku0 =   Bu ^((~Ba)&  Be );
752
+
753
+            KeccakAtoD_round1();
754
+
755
+            Ba = (Aba0^Da0);
756
+            Be = ROL32((Ame1^De0), 22);
757
+            Bi = ROL32((Agi1^Di1), 22);
758
+            Bo = ROL32((Aso1^Do1), 11);
759
+            Bu = ROL32((Aku1^Du0), 7);
760
+            Aba0 =   Ba ^((~Be)&  Bi );
761
+            Aba0 ^= *(pRoundConstants++);
762
+            Ame1 =   Be ^((~Bi)&  Bo );
763
+            Agi1 =   Bi ^((~Bo)&  Bu );
764
+            Aso1 =   Bo ^((~Bu)&  Ba );
765
+            Aku1 =   Bu ^((~Ba)&  Be );
766
+
767
+            Ba = (Aba1^Da1);
768
+            Be = ROL32((Ame0^De1), 22);
769
+            Bi = ROL32((Agi0^Di0), 21);
770
+            Bo = ROL32((Aso0^Do0), 10);
771
+            Bu = ROL32((Aku0^Du1), 7);
772
+            Aba1 =   Ba ^((~Be)&  Bi );
773
+            Aba1 ^= *(pRoundConstants++);
774
+            Ame0 =   Be ^((~Bi)&  Bo );
775
+            Agi0 =   Bi ^((~Bo)&  Bu );
776
+            Aso0 =   Bo ^((~Bu)&  Ba );
777
+            Aku0 =   Bu ^((~Ba)&  Be );
778
+
779
+            Bi = ROL32((Asa1^Da1), 2);
780
+            Bo = ROL32((Ake1^De1), 23);
781
+            Bu = ROL32((Abi1^Di1), 31);
782
+            Ba = ROL32((Amo1^Do0), 14);
783
+            Be = ROL32((Agu0^Du0), 10);
784
+            Asa1 =   Ba ^((~Be)&  Bi );
785
+            Ake1 =   Be ^((~Bi)&  Bo );
786
+            Abi1 =   Bi ^((~Bo)&  Bu );
787
+            Amo1 =   Bo ^((~Bu)&  Ba );
788
+            Agu0 =   Bu ^((~Ba)&  Be );
789
+
790
+            Bi = ROL32((Asa0^Da0), 1);
791
+            Bo = ROL32((Ake0^De0), 22);
792
+            Bu = ROL32((Abi0^Di0), 30);
793
+            Ba = ROL32((Amo0^Do1), 14);
794
+            Be = ROL32((Agu1^Du1), 10);
795
+            Asa0 =   Ba ^((~Be)&  Bi );
796
+            Ake0 =   Be ^((~Bi)&  Bo );
797
+            Abi0 =   Bi ^((~Bo)&  Bu );
798
+            Amo0 =   Bo ^((~Bu)&  Ba );
799
+            Agu1 =   Bu ^((~Ba)&  Be );
800
+
801
+            Bu = ROL32((Ama1^Da0), 9);
802
+            Ba = ROL32((Age1^De1), 1);
803
+            Be = ROL32((Asi1^Di0), 3);
804
+            Bi = ROL32((Ako0^Do1), 13);
805
+            Bo = ROL32((Abu1^Du0), 4);
806
+            Ama1 =   Ba ^((~Be)&  Bi );
807
+            Age1 =   Be ^((~Bi)&  Bo );
808
+            Asi1 =   Bi ^((~Bo)&  Bu );
809
+            Ako0 =   Bo ^((~Bu)&  Ba );
810
+            Abu1 =   Bu ^((~Ba)&  Be );
811
+
812
+            Bu = ROL32((Ama0^Da1), 9);
813
+            Ba = (Age0^De0);
814
+            Be = ROL32((Asi0^Di1), 3);
815
+            Bi = ROL32((Ako1^Do0), 12);
816
+            Bo = ROL32((Abu0^Du1), 4);
817
+            Ama0 =   Ba ^((~Be)&  Bi );
818
+            Age0 =   Be ^((~Bi)&  Bo );
819
+            Asi0 =   Bi ^((~Bo)&  Bu );
820
+            Ako1 =   Bo ^((~Bu)&  Ba );
821
+            Abu0 =   Bu ^((~Ba)&  Be );
822
+
823
+            Be = ROL32((Aka1^Da0), 18);
824
+            Bi = ROL32((Abe1^De0), 5);
825
+            Bo = ROL32((Ami0^Di1), 8);
826
+            Bu = ROL32((Ago1^Do0), 28);
827
+            Ba = ROL32((Asu1^Du1), 14);
828
+            Aka1 =   Ba ^((~Be)&  Bi );
829
+            Abe1 =   Be ^((~Bi)&  Bo );
830
+            Ami0 =   Bi ^((~Bo)&  Bu );
831
+            Ago1 =   Bo ^((~Bu)&  Ba );
832
+            Asu1 =   Bu ^((~Ba)&  Be );
833
+
834
+            Be = ROL32((Aka0^Da1), 18);
835
+            Bi = ROL32((Abe0^De1), 5);
836
+            Bo = ROL32((Ami1^Di0), 7);
837
+            Bu = ROL32((Ago0^Do1), 28);
838
+            Ba = ROL32((Asu0^Du0), 13);
839
+            Aka0 =   Ba ^((~Be)&  Bi );
840
+            Abe0 =   Be ^((~Bi)&  Bo );
841
+            Ami1 =   Bi ^((~Bo)&  Bu );
842
+            Ago0 =   Bo ^((~Bu)&  Ba );
843
+            Asu0 =   Bu ^((~Ba)&  Be );
844
+
845
+            Bo = ROL32((Aga1^Da1), 21);
846
+            Bu = ROL32((Ase0^De0), 1);
847
+            Ba = ROL32((Aki1^Di0), 31);
848
+            Be = ROL32((Abo1^Do1), 28);
849
+            Bi = ROL32((Amu1^Du1), 20);
850
+            Aga1 =   Ba ^((~Be)&  Bi );
851
+            Ase0 =   Be ^((~Bi)&  Bo );
852
+            Aki1 =   Bi ^((~Bo)&  Bu );
853
+            Abo1 =   Bo ^((~Bu)&  Ba );
854
+            Amu1 =   Bu ^((~Ba)&  Be );
855
+
856
+            Bo = ROL32((Aga0^Da0), 20);
857
+            Bu = ROL32((Ase1^De1), 1);
858
+            Ba = ROL32((Aki0^Di1), 31);
859
+            Be = ROL32((Abo0^Do0), 27);
860
+            Bi = ROL32((Amu0^Du0), 19);
861
+            Aga0 =   Ba ^((~Be)&  Bi );
862
+            Ase1 =   Be ^((~Bi)&  Bo );
863
+            Aki0 =   Bi ^((~Bo)&  Bu );
864
+            Abo0 =   Bo ^((~Bu)&  Ba );
865
+            Amu0 =   Bu ^((~Ba)&  Be );
866
+
867
+            KeccakAtoD_round2();
868
+
869
+            Ba = (Aba0^Da0);
870
+            Be = ROL32((Ake1^De0), 22);
871
+            Bi = ROL32((Asi0^Di1), 22);
872
+            Bo = ROL32((Ago0^Do1), 11);
873
+            Bu = ROL32((Amu1^Du0), 7);
874
+            Aba0 =   Ba ^((~Be)&  Bi );
875
+            Aba0 ^= *(pRoundConstants++);
876
+            Ake1 =   Be ^((~Bi)&  Bo );
877
+            Asi0 =   Bi ^((~Bo)&  Bu );
878
+            Ago0 =   Bo ^((~Bu)&  Ba );
879
+            Amu1 =   Bu ^((~Ba)&  Be );
880
+
881
+            Ba = (Aba1^Da1);
882
+            Be = ROL32((Ake0^De1), 22);
883
+            Bi = ROL32((Asi1^Di0), 21);
884
+            Bo = ROL32((Ago1^Do0), 10);
885
+            Bu = ROL32((Amu0^Du1), 7);
886
+            Aba1 =   Ba ^((~Be)&  Bi );
887
+            Aba1 ^= *(pRoundConstants++);
888
+            Ake0 =   Be ^((~Bi)&  Bo );
889
+            Asi1 =   Bi ^((~Bo)&  Bu );
890
+            Ago1 =   Bo ^((~Bu)&  Ba );
891
+            Amu0 =   Bu ^((~Ba)&  Be );
892
+
893
+            Bi = ROL32((Ama0^Da1), 2);
894
+            Bo = ROL32((Abe0^De1), 23);
895
+            Bu = ROL32((Aki0^Di1), 31);
896
+            Ba = ROL32((Aso1^Do0), 14);
897
+            Be = ROL32((Agu0^Du0), 10);
898
+            Ama0 =   Ba ^((~Be)&  Bi );
899
+            Abe0 =   Be ^((~Bi)&  Bo );
900
+            Aki0 =   Bi ^((~Bo)&  Bu );
901
+            Aso1 =   Bo ^((~Bu)&  Ba );
902
+            Agu0 =   Bu ^((~Ba)&  Be );
903
+
904
+            Bi = ROL32((Ama1^Da0), 1);
905
+            Bo = ROL32((Abe1^De0), 22);
906
+            Bu = ROL32((Aki1^Di0), 30);
907
+            Ba = ROL32((Aso0^Do1), 14);
908
+            Be = ROL32((Agu1^Du1), 10);
909
+            Ama1 =   Ba ^((~Be)&  Bi );
910
+            Abe1 =   Be ^((~Bi)&  Bo );
911
+            Aki1 =   Bi ^((~Bo)&  Bu );
912
+            Aso0 =   Bo ^((~Bu)&  Ba );
913
+            Agu1 =   Bu ^((~Ba)&  Be );
914
+
915
+            Bu = ROL32((Aga1^Da0), 9);
916
+            Ba = ROL32((Ame0^De1), 1);
917
+            Be = ROL32((Abi1^Di0), 3);
918
+            Bi = ROL32((Ako1^Do1), 13);
919
+            Bo = ROL32((Asu1^Du0), 4);
920
+            Aga1 =   Ba ^((~Be)&  Bi );
921
+            Ame0 =   Be ^((~Bi)&  Bo );
922
+            Abi1 =   Bi ^((~Bo)&  Bu );
923
+            Ako1 =   Bo ^((~Bu)&  Ba );
924
+            Asu1 =   Bu ^((~Ba)&  Be );
925
+
926
+            Bu = ROL32((Aga0^Da1), 9);
927
+            Ba = (Ame1^De0);
928
+            Be = ROL32((Abi0^Di1), 3);
929
+            Bi = ROL32((Ako0^Do0), 12);
930
+            Bo = ROL32((Asu0^Du1), 4);
931
+            Aga0 =   Ba ^((~Be)&  Bi );
932
+            Ame1 =   Be ^((~Bi)&  Bo );
933
+            Abi0 =   Bi ^((~Bo)&  Bu );
934
+            Ako0 =   Bo ^((~Bu)&  Ba );
935
+            Asu0 =   Bu ^((~Ba)&  Be );
936
+
937
+            Be = ROL32((Asa1^Da0), 18);
938
+            Bi = ROL32((Age1^De0), 5);
939
+            Bo = ROL32((Ami1^Di1), 8);
940
+            Bu = ROL32((Abo1^Do0), 28);
941
+            Ba = ROL32((Aku0^Du1), 14);
942
+            Asa1 =   Ba ^((~Be)&  Bi );
943
+            Age1 =   Be ^((~Bi)&  Bo );
944
+            Ami1 =   Bi ^((~Bo)&  Bu );
945
+            Abo1 =   Bo ^((~Bu)&  Ba );
946
+            Aku0 =   Bu ^((~Ba)&  Be );
947
+
948
+            Be = ROL32((Asa0^Da1), 18);
949
+            Bi = ROL32((Age0^De1), 5);
950
+            Bo = ROL32((Ami0^Di0), 7);
951
+            Bu = ROL32((Abo0^Do1), 28);
952
+            Ba = ROL32((Aku1^Du0), 13);
953
+            Asa0 =   Ba ^((~Be)&  Bi );
954
+            Age0 =   Be ^((~Bi)&  Bo );
955
+            Ami0 =   Bi ^((~Bo)&  Bu );
956
+            Abo0 =   Bo ^((~Bu)&  Ba );
957
+            Aku1 =   Bu ^((~Ba)&  Be );
958
+
959
+            Bo = ROL32((Aka0^Da1), 21);
960
+            Bu = ROL32((Ase0^De0), 1);
961
+            Ba = ROL32((Agi1^Di0), 31);
962
+            Be = ROL32((Amo0^Do1), 28);
963
+            Bi = ROL32((Abu0^Du1), 20);
964
+            Aka0 =   Ba ^((~Be)&  Bi );
965
+            Ase0 =   Be ^((~Bi)&  Bo );
966
+            Agi1 =   Bi ^((~Bo)&  Bu );
967
+            Amo0 =   Bo ^((~Bu)&  Ba );
968
+            Abu0 =   Bu ^((~Ba)&  Be );
969
+
970
+            Bo = ROL32((Aka1^Da0), 20);
971
+            Bu = ROL32((Ase1^De1), 1);
972
+            Ba = ROL32((Agi0^Di1), 31);
973
+            Be = ROL32((Amo1^Do0), 27);
974
+            Bi = ROL32((Abu1^Du0), 19);
975
+            Aka1 =   Ba ^((~Be)&  Bi );
976
+            Ase1 =   Be ^((~Bi)&  Bo );
977
+            Agi0 =   Bi ^((~Bo)&  Bu );
978
+            Amo1 =   Bo ^((~Bu)&  Ba );
979
+            Abu1 =   Bu ^((~Ba)&  Be );
980
+
981
+            KeccakAtoD_round3();
982
+
983
+            Ba = (Aba0^Da0);
984
+            Be = ROL32((Abe0^De0), 22);
985
+            Bi = ROL32((Abi0^Di1), 22);
986
+            Bo = ROL32((Abo0^Do1), 11);
987
+            Bu = ROL32((Abu0^Du0), 7);
988
+            Aba0 =   Ba ^((~Be)&  Bi );
989
+            Aba0 ^= *(pRoundConstants++);
990
+            Abe0 =   Be ^((~Bi)&  Bo );
991
+            Abi0 =   Bi ^((~Bo)&  Bu );
992
+            Abo0 =   Bo ^((~Bu)&  Ba );
993
+            Abu0 =   Bu ^((~Ba)&  Be );
994
+
995
+            Ba = (Aba1^Da1);
996
+            Be = ROL32((Abe1^De1), 22);
997
+            Bi = ROL32((Abi1^Di0), 21);
998
+            Bo = ROL32((Abo1^Do0), 10);
999
+            Bu = ROL32((Abu1^Du1), 7);
1000
+            Aba1 =   Ba ^((~Be)&  Bi );
1001
+            Aba1 ^= *(pRoundConstants++);
1002
+            Abe1 =   Be ^((~Bi)&  Bo );
1003
+            Abi1 =   Bi ^((~Bo)&  Bu );
1004
+            Abo1 =   Bo ^((~Bu)&  Ba );
1005
+            Abu1 =   Bu ^((~Ba)&  Be );
1006
+
1007
+            Bi = ROL32((Aga0^Da1), 2);
1008
+            Bo = ROL32((Age0^De1), 23);
1009
+            Bu = ROL32((Agi0^Di1), 31);
1010
+            Ba = ROL32((Ago0^Do0), 14);
1011
+            Be = ROL32((Agu0^Du0), 10);
1012
+            Aga0 =   Ba ^((~Be)&  Bi );
1013
+            Age0 =   Be ^((~Bi)&  Bo );
1014
+            Agi0 =   Bi ^((~Bo)&  Bu );
1015
+            Ago0 =   Bo ^((~Bu)&  Ba );
1016
+            Agu0 =   Bu ^((~Ba)&  Be );
1017
+
1018
+            Bi = ROL32((Aga1^Da0), 1);
1019
+            Bo = ROL32((Age1^De0), 22);
1020
+            Bu = ROL32((Agi1^Di0), 30);
1021
+            Ba = ROL32((Ago1^Do1), 14);
1022
+            Be = ROL32((Agu1^Du1), 10);
1023
+            Aga1 =   Ba ^((~Be)&  Bi );
1024
+            Age1 =   Be ^((~Bi)&  Bo );
1025
+            Agi1 =   Bi ^((~Bo)&  Bu );
1026
+            Ago1 =   Bo ^((~Bu)&  Ba );
1027
+            Agu1 =   Bu ^((~Ba)&  Be );
1028
+
1029
+            Bu = ROL32((Aka0^Da0), 9);
1030
+            Ba = ROL32((Ake0^De1), 1);
1031
+            Be = ROL32((Aki0^Di0), 3);
1032
+            Bi = ROL32((Ako0^Do1), 13);
1033
+            Bo = ROL32((Aku0^Du0), 4);
1034
+            Aka0 =   Ba ^((~Be)&  Bi );
1035
+            Ake0 =   Be ^((~Bi)&  Bo );
1036
+            Aki0 =   Bi ^((~Bo)&  Bu );
1037
+            Ako0 =   Bo ^((~Bu)&  Ba );
1038
+            Aku0 =   Bu ^((~Ba)&  Be );
1039
+
1040
+            Bu = ROL32((Aka1^Da1), 9);
1041
+            Ba = (Ake1^De0);
1042
+            Be = ROL32((Aki1^Di1), 3);
1043
+            Bi = ROL32((Ako1^Do0), 12);
1044
+            Bo = ROL32((Aku1^Du1), 4);
1045
+            Aka1 =   Ba ^((~Be)&  Bi );
1046
+            Ake1 =   Be ^((~Bi)&  Bo );
1047
+            Aki1 =   Bi ^((~Bo)&  Bu );
1048
+            Ako1 =   Bo ^((~Bu)&  Ba );
1049
+            Aku1 =   Bu ^((~Ba)&  Be );
1050
+
1051
+            Be = ROL32((Ama0^Da0), 18);
1052
+            Bi = ROL32((Ame0^De0), 5);
1053
+            Bo = ROL32((Ami0^Di1), 8);
1054
+            Bu = ROL32((Amo0^Do0), 28);
1055
+            Ba = ROL32((Amu0^Du1), 14);
1056
+            Ama0 =   Ba ^((~Be)&  Bi );
1057
+            Ame0 =   Be ^((~Bi)&  Bo );
1058
+            Ami0 =   Bi ^((~Bo)&  Bu );
1059
+            Amo0 =   Bo ^((~Bu)&  Ba );
1060
+            Amu0 =   Bu ^((~Ba)&  Be );
1061
+
1062
+            Be = ROL32((Ama1^Da1), 18);
1063
+            Bi = ROL32((Ame1^De1), 5);
1064
+            Bo = ROL32((Ami1^Di0), 7);
1065
+            Bu = ROL32((Amo1^Do1), 28);
1066
+            Ba = ROL32((Amu1^Du0), 13);
1067
+            Ama1 =   Ba ^((~Be)&  Bi );
1068
+            Ame1 =   Be ^((~Bi)&  Bo );
1069
+            Ami1 =   Bi ^((~Bo)&  Bu );
1070
+            Amo1 =   Bo ^((~Bu)&  Ba );
1071
+            Amu1 =   Bu ^((~Ba)&  Be );
1072
+
1073
+            Bo = ROL32((Asa0^Da1), 21);
1074
+            Bu = ROL32((Ase0^De0), 1);
1075
+            Ba = ROL32((Asi0^Di0), 31);
1076
+            Be = ROL32((Aso0^Do1), 28);
1077
+            Bi = ROL32((Asu0^Du1), 20);
1078
+            Asa0 =   Ba ^((~Be)&  Bi );
1079
+            Ase0 =   Be ^((~Bi)&  Bo );
1080
+            Asi0 =   Bi ^((~Bo)&  Bu );
1081
+            Aso0 =   Bo ^((~Bu)&  Ba );
1082
+            Asu0 =   Bu ^((~Ba)&  Be );
1083
+
1084
+            Bo = ROL32((Asa1^Da0), 20);
1085
+            Bu = ROL32((Ase1^De1), 1);
1086
+            Ba = ROL32((Asi1^Di1), 31);
1087
+            Be = ROL32((Aso1^Do0), 27);
1088
+            Bi = ROL32((Asu1^Du0), 19);
1089
+            Asa1 =   Ba ^((~Be)&  Bi );
1090
+            Ase1 =   Be ^((~Bi)&  Bo );
1091
+            Asi1 =   Bi ^((~Bo)&  Bu );
1092
+            Aso1 =   Bo ^((~Bu)&  Ba );
1093
+            Asu1 =   Bu ^((~Ba)&  Be );
1094
+        }
1095
+        while ( *pRoundConstants != 0xFF );
1096
+
1097
+        #undef Aba0
1098
+        #undef Aba1
1099
+        #undef Abe0
1100
+        #undef Abe1
1101
+        #undef Abi0
1102
+        #undef Abi1
1103
+        #undef Abo0
1104
+        #undef Abo1
1105
+        #undef Abu0
1106
+        #undef Abu1
1107
+        #undef Aga0
1108
+        #undef Aga1
1109
+        #undef Age0
1110
+        #undef Age1
1111
+        #undef Agi0
1112
+        #undef Agi1
1113
+        #undef Ago0
1114
+        #undef Ago1
1115
+        #undef Agu0
1116
+        #undef Agu1
1117
+        #undef Aka0
1118
+        #undef Aka1
1119
+        #undef Ake0
1120
+        #undef Ake1
1121
+        #undef Aki0
1122
+        #undef Aki1
1123
+        #undef Ako0
1124
+        #undef Ako1
1125
+        #undef Aku0
1126
+        #undef Aku1
1127
+        #undef Ama0
1128
+        #undef Ama1
1129
+        #undef Ame0
1130
+        #undef Ame1
1131
+        #undef Ami0
1132
+        #undef Ami1
1133
+        #undef Amo0
1134
+        #undef Amo1
1135
+        #undef Amu0
1136
+        #undef Amu1
1137
+        #undef Asa0
1138
+        #undef Asa1
1139
+        #undef Ase0
1140
+        #undef Ase1
1141
+        #undef Asi0
1142
+        #undef Asi1
1143
+        #undef Aso0
1144
+        #undef Aso1
1145
+        #undef Asu0
1146
+        #undef Asu1
1147
+    }
1148
+}
1149
+
1150
+/* ---------------------------------------------------------------- */
1151
+
1152
+void KeccakP1600_Permute_12rounds(void *state)
1153
+{
1154
+     KeccakP1600_Permute_Nrounds(state, 12);
1155
+}
1156
+
1157
+/* ---------------------------------------------------------------- */
1158
+
1159
+void KeccakP1600_Permute_24rounds(void *state)
1160
+{
1161
+     KeccakP1600_Permute_Nrounds(state, 24);
1162
+}