»Core Development>Code coverage>Modules/_sha3/keccak/KeccakF-1600-opt32.c

Python code coverage for Modules/_sha3/keccak/KeccakF-1600-opt32.c

#countcontent
1n/a/*
2n/aThe Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
3n/aMichaël Peeters and Gilles Van Assche. For more information, feedback or
4n/aquestions, please refer to our website: http://keccak.noekeon.org/
5n/a
6n/aImplementation by the designers,
7n/ahereby denoted as "the implementer".
8n/a
9n/aTo the extent possible under law, the implementer has waived all copyright
10n/aand related or neighboring rights to the source code in this file.
11n/ahttp://creativecommons.org/publicdomain/zero/1.0/
12n/a*/
13n/a
14n/a#include <string.h>
15n/a/* #include "brg_endian.h" */
16n/a#include "KeccakF-1600-opt32-settings.h"
17n/a#include "KeccakF-1600-interface.h"
18n/a
19n/atypedef unsigned char UINT8;
20n/atypedef unsigned short UINT16;
21n/atypedef unsigned int UINT32;
22n/a/* typedef unsigned long long int UINT64; */
23n/a
24n/a#ifdef UseInterleaveTables
25n/astatic int interleaveTablesBuilt = 0;
26n/astatic UINT16 interleaveTable[65536];
27n/astatic UINT16 deinterleaveTable[65536];
28n/a
29n/astatic void buildInterleaveTables()
30n/a{
31n/a UINT32 i, j;
32n/a UINT16 x;
33n/a
34n/a if (!interleaveTablesBuilt) {
35n/a for(i=0; i<65536; i++) {
36n/a x = 0;
37n/a for(j=0; j<16; j++) {
38n/a if (i & (1 << j))
39n/a x |= (1 << (j/2 + 8*(j%2)));
40n/a }
41n/a interleaveTable[i] = x;
42n/a deinterleaveTable[x] = (UINT16)i;
43n/a }
44n/a interleaveTablesBuilt = 1;
45n/a }
46n/a}
47n/a
48n/a#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
49n/a
50n/a#define xor2bytesIntoInterleavedWords(even, odd, source, j) \
51n/a i##j = interleaveTable[((const UINT16*)source)[j]]; \
52n/a ((UINT8*)even)[j] ^= i##j & 0xFF; \
53n/a ((UINT8*)odd)[j] ^= i##j >> 8;
54n/a
55n/a#define setInterleavedWordsInto2bytes(dest, even, odd, j) \
56n/a d##j = deinterleaveTable[((even >> (j*8)) & 0xFF) ^ (((odd >> (j*8)) & 0xFF) << 8)]; \
57n/a ((UINT16*)dest)[j] = d##j;
58n/a
59n/a#else /* (PLATFORM_BYTE_ORDER == IS_BIG_ENDIAN) */
60n/a
61n/a#define xor2bytesIntoInterleavedWords(even, odd, source, j) \
62n/a i##j = interleaveTable[source[2*j] ^ ((UINT16)source[2*j+1] << 8)]; \
63n/a *even ^= (i##j & 0xFF) << (j*8); \
64n/a *odd ^= ((i##j >> 8) & 0xFF) << (j*8);
65n/a
66n/a#define setInterleavedWordsInto2bytes(dest, even, odd, j) \
67n/a d##j = deinterleaveTable[((even >> (j*8)) & 0xFF) ^ (((odd >> (j*8)) & 0xFF) << 8)]; \
68n/a dest[2*j] = d##j & 0xFF; \
69n/a dest[2*j+1] = d##j >> 8;
70n/a
71n/a#endif /* Endianness */
72n/a
73n/astatic void xor8bytesIntoInterleavedWords(UINT32 *even, UINT32 *odd, const UINT8* source)
74n/a{
75n/a UINT16 i0, i1, i2, i3;
76n/a
77n/a xor2bytesIntoInterleavedWords(even, odd, source, 0)
78n/a xor2bytesIntoInterleavedWords(even, odd, source, 1)
79n/a xor2bytesIntoInterleavedWords(even, odd, source, 2)
80n/a xor2bytesIntoInterleavedWords(even, odd, source, 3)
81n/a}
82n/a
83n/a#define xorLanesIntoState(laneCount, state, input) \
84n/a { \
85n/a int i; \
86n/a for(i=0; i<(laneCount); i++) \
87n/a xor8bytesIntoInterleavedWords(state+i*2, state+i*2+1, input+i*8); \
88n/a }
89n/a
90n/astatic void setInterleavedWordsInto8bytes(UINT8* dest, UINT32 even, UINT32 odd)
91n/a{
92n/a UINT16 d0, d1, d2, d3;
93n/a
94n/a setInterleavedWordsInto2bytes(dest, even, odd, 0)
95n/a setInterleavedWordsInto2bytes(dest, even, odd, 1)
96n/a setInterleavedWordsInto2bytes(dest, even, odd, 2)
97n/a setInterleavedWordsInto2bytes(dest, even, odd, 3)
98n/a}
99n/a
100n/a#define extractLanes(laneCount, state, data) \
101n/a { \
102n/a int i; \
103n/a for(i=0; i<(laneCount); i++) \
104n/a setInterleavedWordsInto8bytes(data+i*8, ((UINT32*)state)[i*2], ((UINT32*)state)[i*2+1]); \
105n/a }
106n/a
107n/a#else /* No interleaving tables */
108n/a
109n/a#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
110n/a
111n/a/* Credit: Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
112n/a#define xorInterleavedLE(rateInLanes, state, input) \
113n/a { \
114n/a const UINT32 * pI = (const UINT32 *)input; \
115n/a UINT32 * pS = state; \
116n/a UINT32 t, x0, x1; \
117n/a int i; \
118n/a for (i = (rateInLanes)-1; i >= 0; --i) \
119n/a { \
120n/a x0 = *(pI++); \
121n/a t = (x0 ^ (x0 >> 1)) & 0x22222222UL; x0 = x0 ^ t ^ (t << 1); \
122n/a t = (x0 ^ (x0 >> 2)) & 0x0C0C0C0CUL; x0 = x0 ^ t ^ (t << 2); \
123n/a t = (x0 ^ (x0 >> 4)) & 0x00F000F0UL; x0 = x0 ^ t ^ (t << 4); \
124n/a t = (x0 ^ (x0 >> 8)) & 0x0000FF00UL; x0 = x0 ^ t ^ (t << 8); \
125n/a x1 = *(pI++); \
126n/a t = (x1 ^ (x1 >> 1)) & 0x22222222UL; x1 = x1 ^ t ^ (t << 1); \
127n/a t = (x1 ^ (x1 >> 2)) & 0x0C0C0C0CUL; x1 = x1 ^ t ^ (t << 2); \
128n/a t = (x1 ^ (x1 >> 4)) & 0x00F000F0UL; x1 = x1 ^ t ^ (t << 4); \
129n/a t = (x1 ^ (x1 >> 8)) & 0x0000FF00UL; x1 = x1 ^ t ^ (t << 8); \
130n/a *(pS++) ^= (UINT16)x0 | (x1 << 16); \
131n/a *(pS++) ^= (x0 >> 16) | (x1 & 0xFFFF0000); \
132n/a } \
133n/a }
134n/a
135n/a#define xorLanesIntoState(laneCount, state, input) \
136n/a xorInterleavedLE(laneCount, state, input)
137n/a
138n/a#else /* (PLATFORM_BYTE_ORDER == IS_BIG_ENDIAN) */
139n/a
140n/a/* Credit: Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
141n/aUINT64 toInterleaving(UINT64 x)
142n/a{
143n/a UINT64 t;
144n/a
145n/a t = (x ^ (x >> 1)) & 0x2222222222222222ULL; x = x ^ t ^ (t << 1);
146n/a t = (x ^ (x >> 2)) & 0x0C0C0C0C0C0C0C0CULL; x = x ^ t ^ (t << 2);
147n/a t = (x ^ (x >> 4)) & 0x00F000F000F000F0ULL; x = x ^ t ^ (t << 4);
148n/a t = (x ^ (x >> 8)) & 0x0000FF000000FF00ULL; x = x ^ t ^ (t << 8);
149n/a t = (x ^ (x >> 16)) & 0x00000000FFFF0000ULL; x = x ^ t ^ (t << 16);
150n/a
151n/a return x;
152n/a}
153n/a
154n/astatic void xor8bytesIntoInterleavedWords(UINT32* evenAndOdd, const UINT8* source)
155n/a{
156n/a /* This can be optimized */
157n/a UINT64 sourceWord =
158n/a (UINT64)source[0]
159n/a ^ (((UINT64)source[1]) << 8)
160n/a ^ (((UINT64)source[2]) << 16)
161n/a ^ (((UINT64)source[3]) << 24)
162n/a ^ (((UINT64)source[4]) << 32)
163n/a ^ (((UINT64)source[5]) << 40)
164n/a ^ (((UINT64)source[6]) << 48)
165n/a ^ (((UINT64)source[7]) << 56);
166n/a UINT64 evenAndOddWord = toInterleaving(sourceWord);
167n/a evenAndOdd[0] ^= (UINT32)evenAndOddWord;
168n/a evenAndOdd[1] ^= (UINT32)(evenAndOddWord >> 32);
169n/a}
170n/a
171n/a#define xorLanesIntoState(laneCount, state, input) \
172n/a { \
173n/a int i; \
174n/a for(i=0; i<(laneCount); i++) \
175n/a xor8bytesIntoInterleavedWords(state+i*2, input+i*8); \
176n/a }
177n/a
178n/a#endif /* Endianness */
179n/a
180n/a/* Credit: Henry S. Warren, Hacker's Delight, Addison-Wesley, 2002 */
181n/aUINT64 fromInterleaving(UINT64 x)
182n/a{
183n/a UINT64 t;
184n/a
185n/a t = (x ^ (x >> 16)) & 0x00000000FFFF0000ULL; x = x ^ t ^ (t << 16);
186n/a t = (x ^ (x >> 8)) & 0x0000FF000000FF00ULL; x = x ^ t ^ (t << 8);
187n/a t = (x ^ (x >> 4)) & 0x00F000F000F000F0ULL; x = x ^ t ^ (t << 4);
188n/a t = (x ^ (x >> 2)) & 0x0C0C0C0C0C0C0C0CULL; x = x ^ t ^ (t << 2);
189n/a t = (x ^ (x >> 1)) & 0x2222222222222222ULL; x = x ^ t ^ (t << 1);
190n/a
191n/a return x;
192n/a}
193n/a
194n/astatic void setInterleavedWordsInto8bytes(UINT8* dest, UINT32* evenAndOdd)
195n/a{
196n/a#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
197n/a ((UINT64*)dest)[0] = fromInterleaving(*(UINT64*)evenAndOdd);
198n/a#else /* (PLATFORM_BYTE_ORDER == IS_BIG_ENDIAN) */
199n/a /* This can be optimized */
200n/a UINT64 evenAndOddWord = (UINT64)evenAndOdd[0] ^ ((UINT64)evenAndOdd[1] << 32);
201n/a UINT64 destWord = fromInterleaving(evenAndOddWord);
202n/a dest[0] = destWord & 0xFF;
203n/a dest[1] = (destWord >> 8) & 0xFF;
204n/a dest[2] = (destWord >> 16) & 0xFF;
205n/a dest[3] = (destWord >> 24) & 0xFF;
206n/a dest[4] = (destWord >> 32) & 0xFF;
207n/a dest[5] = (destWord >> 40) & 0xFF;
208n/a dest[6] = (destWord >> 48) & 0xFF;
209n/a dest[7] = (destWord >> 56) & 0xFF;
210n/a#endif /* Endianness */
211n/a}
212n/a
213n/a#define extractLanes(laneCount, state, data) \
214n/a { \
215n/a int i; \
216n/a for(i=0; i<(laneCount); i++) \
217n/a setInterleavedWordsInto8bytes(data+i*8, (UINT32*)state+i*2); \
218n/a }
219n/a
220n/a#endif /* With or without interleaving tables */
221n/a
222n/a#if defined(_MSC_VER)
223n/a#define ROL32(a, offset) _rotl(a, offset)
224n/a#elif (defined (__arm__) && defined(__ARMCC_VERSION))
225n/a#define ROL32(a, offset) __ror(a, 32-(offset))
226n/a#else
227n/a#define ROL32(a, offset) ((((UINT32)a) << (offset)) ^ (((UINT32)a) >> (32-(offset))))
228n/a#endif
229n/a
230n/a#include "KeccakF-1600-unrolling.macros"
231n/a#include "KeccakF-1600-32.macros"
232n/a
233n/a#if (UseSchedule == 3)
234n/a
235n/a#ifdef UseBebigokimisa
236n/a#error "No lane complementing with schedule 3."
237n/a#endif
238n/a
239n/a#if (Unrolling != 2)
240n/a#error "Only unrolling 2 is supported by schedule 3."
241n/a#endif
242n/a
243n/astatic void KeccakPermutationOnWords(UINT32 *state)
244n/a{
245n/a rounds
246n/a}
247n/a
248n/astatic void KeccakPermutationOnWordsAfterXoring(UINT32 *state, const UINT8 *input, unsigned int laneCount)
249n/a{
250n/a xorLanesIntoState(laneCount, state, input)
251n/a rounds
252n/a}
253n/a
254n/a#ifdef ProvideFast576
255n/astatic void KeccakPermutationOnWordsAfterXoring576bits(UINT32 *state, const UINT8 *input)
256n/a{
257n/a xorLanesIntoState(9, state, input)
258n/a rounds
259n/a}
260n/a#endif
261n/a
262n/a#ifdef ProvideFast832
263n/astatic void KeccakPermutationOnWordsAfterXoring832bits(UINT32 *state, const UINT8 *input)
264n/a{
265n/a xorLanesIntoState(13, state, input)
266n/a rounds
267n/a}
268n/a#endif
269n/a
270n/a#ifdef ProvideFast1024
271n/astatic void KeccakPermutationOnWordsAfterXoring1024bits(UINT32 *state, const UINT8 *input)
272n/a{
273n/a xorLanesIntoState(16, state, input)
274n/a rounds
275n/a}
276n/a#endif
277n/a
278n/a#ifdef ProvideFast1088
279n/astatic void KeccakPermutationOnWordsAfterXoring1088bits(UINT32 *state, const UINT8 *input)
280n/a{
281n/a xorLanesIntoState(17, state, input)
282n/a rounds
283n/a}
284n/a#endif
285n/a
286n/a#ifdef ProvideFast1152
287n/astatic void KeccakPermutationOnWordsAfterXoring1152bits(UINT32 *state, const UINT8 *input)
288n/a{
289n/a xorLanesIntoState(18, state, input)
290n/a rounds
291n/a}
292n/a#endif
293n/a
294n/a#ifdef ProvideFast1344
295n/astatic void KeccakPermutationOnWordsAfterXoring1344bits(UINT32 *state, const UINT8 *input)
296n/a{
297n/a xorLanesIntoState(21, state, input)
298n/a rounds
299n/a}
300n/a#endif
301n/a
302n/a#else /* (Schedule != 3) */
303n/a
304n/astatic void KeccakPermutationOnWords(UINT32 *state)
305n/a{
306n/a declareABCDE
307n/a#if (Unrolling != 24)
308n/a unsigned int i;
309n/a#endif
310n/a
311n/a copyFromState(A, state)
312n/a rounds
313n/a}
314n/a
315n/astatic void KeccakPermutationOnWordsAfterXoring(UINT32 *state, const UINT8 *input, unsigned int laneCount)
316n/a{
317n/a declareABCDE
318n/a unsigned int i;
319n/a
320n/a xorLanesIntoState(laneCount, state, input)
321n/a copyFromState(A, state)
322n/a rounds
323n/a}
324n/a
325n/a#ifdef ProvideFast576
326n/astatic void KeccakPermutationOnWordsAfterXoring576bits(UINT32 *state, const UINT8 *input)
327n/a{
328n/a declareABCDE
329n/a unsigned int i;
330n/a
331n/a xorLanesIntoState(9, state, input)
332n/a copyFromState(A, state)
333n/a rounds
334n/a}
335n/a#endif
336n/a
337n/a#ifdef ProvideFast832
338n/astatic void KeccakPermutationOnWordsAfterXoring832bits(UINT32 *state, const UINT8 *input)
339n/a{
340n/a declareABCDE
341n/a unsigned int i;
342n/a
343n/a xorLanesIntoState(13, state, input)
344n/a copyFromState(A, state)
345n/a rounds
346n/a}
347n/a#endif
348n/a
349n/a#ifdef ProvideFast1024
350n/astatic void KeccakPermutationOnWordsAfterXoring1024bits(UINT32 *state, const UINT8 *input)
351n/a{
352n/a declareABCDE
353n/a unsigned int i;
354n/a
355n/a xorLanesIntoState(16, state, input)
356n/a copyFromState(A, state)
357n/a rounds
358n/a}
359n/a#endif
360n/a
361n/a#ifdef ProvideFast1088
362n/astatic void KeccakPermutationOnWordsAfterXoring1088bits(UINT32 *state, const UINT8 *input)
363n/a{
364n/a declareABCDE
365n/a unsigned int i;
366n/a
367n/a xorLanesIntoState(17, state, input)
368n/a copyFromState(A, state)
369n/a rounds
370n/a}
371n/a#endif
372n/a
373n/a#ifdef ProvideFast1152
374n/astatic void KeccakPermutationOnWordsAfterXoring1152bits(UINT32 *state, const UINT8 *input)
375n/a{
376n/a declareABCDE
377n/a unsigned int i;
378n/a
379n/a xorLanesIntoState(18, state, input)
380n/a copyFromState(A, state)
381n/a rounds
382n/a}
383n/a#endif
384n/a
385n/a#ifdef ProvideFast1344
386n/astatic void KeccakPermutationOnWordsAfterXoring1344bits(UINT32 *state, const UINT8 *input)
387n/a{
388n/a declareABCDE
389n/a unsigned int i;
390n/a
391n/a xorLanesIntoState(21, state, input)
392n/a copyFromState(A, state)
393n/a rounds
394n/a}
395n/a#endif
396n/a
397n/a#endif
398n/a
399n/astatic void KeccakInitialize()
400n/a{
401n/a#ifdef UseInterleaveTables
402n/a buildInterleaveTables();
403n/a#endif
404n/a}
405n/a
406n/astatic void KeccakInitializeState(unsigned char *state)
407n/a{
408n/a memset(state, 0, 200);
409n/a#ifdef UseBebigokimisa
410n/a ((UINT32*)state)[ 2] = ~(UINT32)0;
411n/a ((UINT32*)state)[ 3] = ~(UINT32)0;
412n/a ((UINT32*)state)[ 4] = ~(UINT32)0;
413n/a ((UINT32*)state)[ 5] = ~(UINT32)0;
414n/a ((UINT32*)state)[16] = ~(UINT32)0;
415n/a ((UINT32*)state)[17] = ~(UINT32)0;
416n/a ((UINT32*)state)[24] = ~(UINT32)0;
417n/a ((UINT32*)state)[25] = ~(UINT32)0;
418n/a ((UINT32*)state)[34] = ~(UINT32)0;
419n/a ((UINT32*)state)[35] = ~(UINT32)0;
420n/a ((UINT32*)state)[40] = ~(UINT32)0;
421n/a ((UINT32*)state)[41] = ~(UINT32)0;
422n/a#endif
423n/a}
424n/a
425n/astatic void KeccakPermutation(unsigned char *state)
426n/a{
427n/a /* We assume the state is always stored as interleaved 32-bit words */
428n/a KeccakPermutationOnWords((UINT32*)state);
429n/a}
430n/a
431n/a#ifdef ProvideFast576
432n/astatic void KeccakAbsorb576bits(unsigned char *state, const unsigned char *data)
433n/a{
434n/a KeccakPermutationOnWordsAfterXoring576bits((UINT32*)state, data);
435n/a}
436n/a#endif
437n/a
438n/a#ifdef ProvideFast832
439n/astatic void KeccakAbsorb832bits(unsigned char *state, const unsigned char *data)
440n/a{
441n/a KeccakPermutationOnWordsAfterXoring832bits((UINT32*)state, data);
442n/a}
443n/a#endif
444n/a
445n/a#ifdef ProvideFast1024
446n/astatic void KeccakAbsorb1024bits(unsigned char *state, const unsigned char *data)
447n/a{
448n/a KeccakPermutationOnWordsAfterXoring1024bits((UINT32*)state, data);
449n/a}
450n/a#endif
451n/a
452n/a#ifdef ProvideFast1088
453n/astatic void KeccakAbsorb1088bits(unsigned char *state, const unsigned char *data)
454n/a{
455n/a KeccakPermutationOnWordsAfterXoring1088bits((UINT32*)state, data);
456n/a}
457n/a#endif
458n/a
459n/a#ifdef ProvideFast1152
460n/astatic void KeccakAbsorb1152bits(unsigned char *state, const unsigned char *data)
461n/a{
462n/a KeccakPermutationOnWordsAfterXoring1152bits((UINT32*)state, data);
463n/a}
464n/a#endif
465n/a
466n/a#ifdef ProvideFast1344
467n/astatic void KeccakAbsorb1344bits(unsigned char *state, const unsigned char *data)
468n/a{
469n/a KeccakPermutationOnWordsAfterXoring1344bits((UINT32*)state, data);
470n/a}
471n/a#endif
472n/a
473n/astatic void KeccakAbsorb(unsigned char *state, const unsigned char *data, unsigned int laneCount)
474n/a{
475n/a KeccakPermutationOnWordsAfterXoring((UINT32*)state, data, laneCount);
476n/a}
477n/a
478n/a#ifdef ProvideFast1024
479n/astatic void KeccakExtract1024bits(const unsigned char *state, unsigned char *data)
480n/a{
481n/a extractLanes(16, state, data)
482n/a#ifdef UseBebigokimisa
483n/a ((UINT32*)data)[ 2] = ~((UINT32*)data)[ 2];
484n/a ((UINT32*)data)[ 3] = ~((UINT32*)data)[ 3];
485n/a ((UINT32*)data)[ 4] = ~((UINT32*)data)[ 4];
486n/a ((UINT32*)data)[ 5] = ~((UINT32*)data)[ 5];
487n/a ((UINT32*)data)[16] = ~((UINT32*)data)[16];
488n/a ((UINT32*)data)[17] = ~((UINT32*)data)[17];
489n/a ((UINT32*)data)[24] = ~((UINT32*)data)[24];
490n/a ((UINT32*)data)[25] = ~((UINT32*)data)[25];
491n/a#endif
492n/a}
493n/a#endif
494n/a
495n/astatic void KeccakExtract(const unsigned char *state, unsigned char *data, unsigned int laneCount)
496n/a{
497n/a extractLanes(laneCount, state, data)
498n/a#ifdef UseBebigokimisa
499n/a if (laneCount > 1) {
500n/a ((UINT32*)data)[ 2] = ~((UINT32*)data)[ 2];
501n/a ((UINT32*)data)[ 3] = ~((UINT32*)data)[ 3];
502n/a if (laneCount > 2) {
503n/a ((UINT32*)data)[ 4] = ~((UINT32*)data)[ 4];
504n/a ((UINT32*)data)[ 5] = ~((UINT32*)data)[ 5];
505n/a if (laneCount > 8) {
506n/a ((UINT32*)data)[16] = ~((UINT32*)data)[16];
507n/a ((UINT32*)data)[17] = ~((UINT32*)data)[17];
508n/a if (laneCount > 12) {
509n/a ((UINT32*)data)[24] = ~((UINT32*)data)[24];
510n/a ((UINT32*)data)[25] = ~((UINT32*)data)[25];
511n/a if (laneCount > 17) {
512n/a ((UINT32*)data)[34] = ~((UINT32*)data)[34];
513n/a ((UINT32*)data)[35] = ~((UINT32*)data)[35];
514n/a if (laneCount > 20) {
515n/a ((UINT32*)data)[40] = ~((UINT32*)data)[40];
516n/a ((UINT32*)data)[41] = ~((UINT32*)data)[41];
517n/a }
518n/a }
519n/a }
520n/a }
521n/a }
522n/a }
523n/a#endif
524n/a}