sha3 0.2.6 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sha3 might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +9 -1
- data/Gemfile.ci +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +145 -0
- data/Rakefile +4 -5
- data/ext/sha3/KeccakF-1600-interface.h +28 -34
- data/ext/sha3/KeccakHash.c +80 -0
- data/ext/sha3/KeccakHash.h +110 -0
- data/ext/sha3/KeccakSponge.c +127 -201
- data/ext/sha3/KeccakSponge.h +74 -37
- data/ext/sha3/Optimized64/KeccakF-1600-64.macros +2199 -0
- data/ext/sha3/Optimized64/KeccakF-1600-opt64-settings.h +3 -0
- data/ext/sha3/Optimized64/KeccakF-1600-opt64.c +508 -0
- data/ext/sha3/{KeccakF-1600-unrolling.macros → Optimized64/KeccakF-1600-unrolling.macros} +16 -14
- data/ext/sha3/Optimized64/SnP-interface.h +47 -0
- data/ext/sha3/Reference/KeccakF-1600-reference.c +311 -0
- data/ext/sha3/Reference/KeccakF-reference.h +26 -0
- data/ext/sha3/Reference/SnP-FBWL-default.c +96 -0
- data/ext/sha3/Reference/SnP-FBWL-default.h +26 -0
- data/ext/sha3/Reference/SnP-interface.h +42 -0
- data/ext/sha3/{displayIntermediateValues.c → Reference/displayIntermediateValues.c} +52 -11
- data/ext/sha3/{displayIntermediateValues.h → Reference/displayIntermediateValues.h} +11 -6
- data/ext/sha3/SnP-Relaned.h +249 -0
- data/ext/sha3/brg_endian.h +0 -0
- data/ext/sha3/digest.c +67 -70
- data/ext/sha3/digest.h +2 -2
- data/ext/sha3/extconf.rb +7 -12
- data/ext/sha3/sha3.h +2 -2
- data/lib/sha3/doc.rb +26 -39
- data/lib/sha3/version.rb +2 -2
- data/sha3.gemspec +6 -6
- data/spec/generate_tests.rb +6 -41
- data/spec/sha3_core_spec.rb +111 -133
- data/spec/spec_helper.rb +2 -2
- data/tests.sh +9 -7
- metadata +33 -36
- data/README.rdoc +0 -131
- data/ext/sha3/KeccakF-1600-32-rvk.macros +0 -555
- data/ext/sha3/KeccakF-1600-32-s1.macros +0 -1187
- data/ext/sha3/KeccakF-1600-32-s2.macros +0 -1187
- data/ext/sha3/KeccakF-1600-32.macros +0 -26
- data/ext/sha3/KeccakF-1600-64.macros +0 -728
- data/ext/sha3/KeccakF-1600-int-set.h +0 -6
- data/ext/sha3/KeccakF-1600-opt.c +0 -504
- data/ext/sha3/KeccakF-1600-opt32-settings.h +0 -4
- data/ext/sha3/KeccakF-1600-opt32.c-arch +0 -524
- data/ext/sha3/KeccakF-1600-opt64-settings.h +0 -7
- data/ext/sha3/KeccakF-1600-opt64.c-arch +0 -504
- data/ext/sha3/KeccakF-1600-reference.c-arch +0 -300
- data/ext/sha3/KeccakF-1600-x86-64-gas.s +0 -766
- data/ext/sha3/KeccakF-1600-x86-64-shld-gas.s +0 -766
- data/ext/sha3/KeccakNISTInterface.c +0 -81
- data/ext/sha3/KeccakNISTInterface.h +0 -70
@@ -1,17 +1,19 @@
|
|
1
1
|
/*
|
2
|
-
|
3
|
-
Michaël Peeters
|
4
|
-
|
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
5
|
|
6
|
-
|
7
|
-
|
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/
|
8
10
|
|
9
11
|
To the extent possible under law, the implementer has waived all copyright
|
10
12
|
and related or neighboring rights to the source code in this file.
|
11
13
|
http://creativecommons.org/publicdomain/zero/1.0/
|
12
14
|
*/
|
13
15
|
|
14
|
-
#if (
|
16
|
+
#if (defined(FullUnrolling))
|
15
17
|
#define rounds \
|
16
18
|
prepareTheta \
|
17
19
|
thetaRhoPiChiIotaPrepareTheta( 0, A, E) \
|
@@ -38,7 +40,7 @@ http://creativecommons.org/publicdomain/zero/1.0/
|
|
38
40
|
thetaRhoPiChiIotaPrepareTheta(21, E, A) \
|
39
41
|
thetaRhoPiChiIotaPrepareTheta(22, A, E) \
|
40
42
|
thetaRhoPiChiIota(23, E, A) \
|
41
|
-
|
43
|
+
|
42
44
|
#elif (Unrolling == 12)
|
43
45
|
#define rounds \
|
44
46
|
prepareTheta \
|
@@ -56,7 +58,7 @@ http://creativecommons.org/publicdomain/zero/1.0/
|
|
56
58
|
thetaRhoPiChiIotaPrepareTheta(i+10, A, E) \
|
57
59
|
thetaRhoPiChiIotaPrepareTheta(i+11, E, A) \
|
58
60
|
} \
|
59
|
-
|
61
|
+
|
60
62
|
#elif (Unrolling == 8)
|
61
63
|
#define rounds \
|
62
64
|
prepareTheta \
|
@@ -70,7 +72,7 @@ http://creativecommons.org/publicdomain/zero/1.0/
|
|
70
72
|
thetaRhoPiChiIotaPrepareTheta(i+6, A, E) \
|
71
73
|
thetaRhoPiChiIotaPrepareTheta(i+7, E, A) \
|
72
74
|
} \
|
73
|
-
|
75
|
+
|
74
76
|
#elif (Unrolling == 6)
|
75
77
|
#define rounds \
|
76
78
|
prepareTheta \
|
@@ -82,7 +84,7 @@ http://creativecommons.org/publicdomain/zero/1.0/
|
|
82
84
|
thetaRhoPiChiIotaPrepareTheta(i+4, A, E) \
|
83
85
|
thetaRhoPiChiIotaPrepareTheta(i+5, E, A) \
|
84
86
|
} \
|
85
|
-
|
87
|
+
|
86
88
|
#elif (Unrolling == 4)
|
87
89
|
#define rounds \
|
88
90
|
prepareTheta \
|
@@ -92,7 +94,7 @@ http://creativecommons.org/publicdomain/zero/1.0/
|
|
92
94
|
thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
|
93
95
|
thetaRhoPiChiIotaPrepareTheta(i+3, E, A) \
|
94
96
|
} \
|
95
|
-
|
97
|
+
|
96
98
|
#elif (Unrolling == 3)
|
97
99
|
#define rounds \
|
98
100
|
prepareTheta \
|
@@ -102,7 +104,7 @@ http://creativecommons.org/publicdomain/zero/1.0/
|
|
102
104
|
thetaRhoPiChiIotaPrepareTheta(i+2, A, E) \
|
103
105
|
copyStateVariables(A, E) \
|
104
106
|
} \
|
105
|
-
|
107
|
+
|
106
108
|
#elif (Unrolling == 2)
|
107
109
|
#define rounds \
|
108
110
|
prepareTheta \
|
@@ -110,7 +112,7 @@ http://creativecommons.org/publicdomain/zero/1.0/
|
|
110
112
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
111
113
|
thetaRhoPiChiIotaPrepareTheta(i+1, E, A) \
|
112
114
|
} \
|
113
|
-
|
115
|
+
|
114
116
|
#elif (Unrolling == 1)
|
115
117
|
#define rounds \
|
116
118
|
prepareTheta \
|
@@ -118,7 +120,7 @@ http://creativecommons.org/publicdomain/zero/1.0/
|
|
118
120
|
thetaRhoPiChiIotaPrepareTheta(i , A, E) \
|
119
121
|
copyStateVariables(A, E) \
|
120
122
|
} \
|
121
|
-
|
123
|
+
|
122
124
|
#else
|
123
125
|
#error "Unrolling is not correctly specified!"
|
124
126
|
#endif
|
@@ -0,0 +1,47 @@
|
|
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
|
+
#ifndef _SnP_Interface_h_
|
17
|
+
#define _SnP_Interface_h_
|
18
|
+
|
19
|
+
#include "KeccakF-1600-interface.h"
|
20
|
+
|
21
|
+
#define SnP_width KeccakF_width
|
22
|
+
#define SnP_stateSizeInBytes KeccakF_stateSizeInBytes
|
23
|
+
#define SnP_laneLengthInBytes KeccakF_laneInBytes
|
24
|
+
#define SnP_laneCount 25
|
25
|
+
|
26
|
+
#define SnP_StaticInitialize KeccakF1600_Initialize
|
27
|
+
#define SnP_Initialize KeccakF1600_StateInitialize
|
28
|
+
#define SnP_XORBytesInLane KeccakF1600_StateXORBytesInLane
|
29
|
+
#define SnP_XORLanes KeccakF1600_StateXORLanes
|
30
|
+
#define SnP_OverwriteBytesInLane KeccakF1600_StateOverwriteBytesInLane
|
31
|
+
#define SnP_OverwriteLanes KeccakF1600_StateOverwriteLanes
|
32
|
+
#define SnP_OverwriteWithZeroes KeccakF1600_StateOverwriteWithZeroes
|
33
|
+
#define SnP_ComplementBit KeccakF1600_StateComplementBit
|
34
|
+
#define SnP_Permute KeccakF1600_StatePermute
|
35
|
+
#define SnP_ExtractBytesInLane KeccakF1600_StateExtractBytesInLane
|
36
|
+
#define SnP_ExtractLanes KeccakF1600_StateExtractLanes
|
37
|
+
#define SnP_ExtractAndXORBytesInLane KeccakF1600_StateExtractAndXORBytesInLane
|
38
|
+
#define SnP_ExtractAndXORLanes KeccakF1600_StateExtractAndXORLanes
|
39
|
+
|
40
|
+
#include "SnP-Relaned.h"
|
41
|
+
|
42
|
+
#define SnP_FBWL_Absorb KeccakF1600_FBWL_Absorb
|
43
|
+
#define SnP_FBWL_Squeeze KeccakF1600_FBWL_Squeeze
|
44
|
+
#define SnP_FBWL_Wrap KeccakF1600_FBWL_Wrap
|
45
|
+
#define SnP_FBWL_Unwrap KeccakF1600_FBWL_Unwrap
|
46
|
+
|
47
|
+
#endif
|
@@ -0,0 +1,311 @@
|
|
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 <stdio.h>
|
17
|
+
#include <stdlib.h>
|
18
|
+
#include <string.h>
|
19
|
+
#include "brg_endian.h"
|
20
|
+
#include "displayIntermediateValues.h"
|
21
|
+
|
22
|
+
typedef unsigned char UINT8;
|
23
|
+
typedef unsigned long long UINT64;
|
24
|
+
typedef UINT64 tKeccakLane;
|
25
|
+
|
26
|
+
#define nrRounds 24
|
27
|
+
tKeccakLane KeccakRoundConstants[nrRounds];
|
28
|
+
#define nrLanes 25
|
29
|
+
unsigned int KeccakRhoOffsets[nrLanes];
|
30
|
+
|
31
|
+
/* ---------------------------------------------------------------- */
|
32
|
+
|
33
|
+
void KeccakF1600_InitializeRoundConstants();
|
34
|
+
void KeccakF1600_InitializeRhoOffsets();
|
35
|
+
int LFSR86540(UINT8 *LFSR);
|
36
|
+
|
37
|
+
void KeccakF1600_Initialize()
|
38
|
+
{
|
39
|
+
if (sizeof(tKeccakLane) != 8) {
|
40
|
+
printf("tKeccakLane should be 64-bit wide\n");
|
41
|
+
abort();
|
42
|
+
}
|
43
|
+
KeccakF1600_InitializeRoundConstants();
|
44
|
+
KeccakF1600_InitializeRhoOffsets();
|
45
|
+
}
|
46
|
+
|
47
|
+
void KeccakF1600_InitializeRoundConstants()
|
48
|
+
{
|
49
|
+
UINT8 LFSRstate = 0x01;
|
50
|
+
unsigned int i, j, bitPosition;
|
51
|
+
|
52
|
+
for(i=0; i<nrRounds; i++) {
|
53
|
+
KeccakRoundConstants[i] = 0;
|
54
|
+
for(j=0; j<7; j++) {
|
55
|
+
bitPosition = (1<<j)-1; //2^j-1
|
56
|
+
if (LFSR86540(&LFSRstate))
|
57
|
+
KeccakRoundConstants[i] ^= (tKeccakLane)1<<bitPosition;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
#define index(x, y) (((x)%5)+5*((y)%5))
|
63
|
+
|
64
|
+
void KeccakF1600_InitializeRhoOffsets()
|
65
|
+
{
|
66
|
+
unsigned int x, y, t, newX, newY;
|
67
|
+
|
68
|
+
KeccakRhoOffsets[index(0, 0)] = 0;
|
69
|
+
x = 1;
|
70
|
+
y = 0;
|
71
|
+
for(t=0; t<24; t++) {
|
72
|
+
KeccakRhoOffsets[index(x, y)] = ((t+1)*(t+2)/2) % 64;
|
73
|
+
newX = (0*x+1*y) % 5;
|
74
|
+
newY = (2*x+3*y) % 5;
|
75
|
+
x = newX;
|
76
|
+
y = newY;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
int LFSR86540(UINT8 *LFSR)
|
81
|
+
{
|
82
|
+
int result = ((*LFSR) & 0x01) != 0;
|
83
|
+
if (((*LFSR) & 0x80) != 0)
|
84
|
+
// Primitive polynomial over GF(2): x^8+x^6+x^5+x^4+1
|
85
|
+
(*LFSR) = ((*LFSR) << 1) ^ 0x71;
|
86
|
+
else
|
87
|
+
(*LFSR) <<= 1;
|
88
|
+
return result;
|
89
|
+
}
|
90
|
+
|
91
|
+
/* ---------------------------------------------------------------- */
|
92
|
+
|
93
|
+
void KeccakF1600_StateInitialize(void *state)
|
94
|
+
{
|
95
|
+
memset(state, 0, KeccakF_width/8);
|
96
|
+
}
|
97
|
+
|
98
|
+
/* ---------------------------------------------------------------- */
|
99
|
+
|
100
|
+
void KeccakF1600_StateXORBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
|
101
|
+
{
|
102
|
+
unsigned int i;
|
103
|
+
|
104
|
+
for(i=0; i<length; i++)
|
105
|
+
((unsigned char *)state)[offset+i] ^= data[i];
|
106
|
+
}
|
107
|
+
|
108
|
+
/* ---------------------------------------------------------------- */
|
109
|
+
|
110
|
+
void KeccakF1600_StateOverwriteBytes(void *state, const unsigned char *data, unsigned int offset, unsigned int length)
|
111
|
+
{
|
112
|
+
memcpy((unsigned char*)state+offset, data, length);
|
113
|
+
}
|
114
|
+
|
115
|
+
/* ---------------------------------------------------------------- */
|
116
|
+
|
117
|
+
void KeccakF1600_StateOverwriteWithZeroes(void *state, unsigned int byteCount)
|
118
|
+
{
|
119
|
+
memset(state, 0, byteCount);
|
120
|
+
}
|
121
|
+
|
122
|
+
/* ---------------------------------------------------------------- */
|
123
|
+
|
124
|
+
void KeccakF1600_StateComplementBit(void *state, unsigned int position)
|
125
|
+
{
|
126
|
+
if (position < 1600) {
|
127
|
+
unsigned int bytePosition = position/8;
|
128
|
+
unsigned int bitPosition = position%8;
|
129
|
+
|
130
|
+
((unsigned char *)state)[bytePosition] ^= (UINT8)1 << bitPosition;
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
/* ---------------------------------------------------------------- */
|
135
|
+
|
136
|
+
void fromBytesToWords(tKeccakLane *stateAsWords, const unsigned char *state);
|
137
|
+
void fromWordsToBytes(unsigned char *state, const tKeccakLane *stateAsWords);
|
138
|
+
void KeccakF1600OnWords(tKeccakLane *state);
|
139
|
+
void KeccakF1600Round(tKeccakLane *state, unsigned int indexRound);
|
140
|
+
void theta(tKeccakLane *A);
|
141
|
+
void rho(tKeccakLane *A);
|
142
|
+
void pi(tKeccakLane *A);
|
143
|
+
void chi(tKeccakLane *A);
|
144
|
+
void iota(tKeccakLane *A, unsigned int indexRound);
|
145
|
+
|
146
|
+
void KeccakF1600_StatePermute(void *state)
|
147
|
+
{
|
148
|
+
#if (PLATFORM_BYTE_ORDER != IS_LITTLE_ENDIAN)
|
149
|
+
tKeccakLane stateAsWords[KeccakF_width/64];
|
150
|
+
#endif
|
151
|
+
|
152
|
+
displayStateAsBytes(1, "Input of permutation", (const unsigned char *)state);
|
153
|
+
#if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
|
154
|
+
KeccakF1600OnWords((tKeccakLane*)state);
|
155
|
+
#else
|
156
|
+
fromBytesToWords(stateAsWords, (const unsigned char *)state);
|
157
|
+
KeccakF1600OnWords(stateAsWords);
|
158
|
+
fromWordsToBytes((unsigned char *)state, stateAsWords);
|
159
|
+
#endif
|
160
|
+
displayStateAsBytes(1, "State after permutation", (const unsigned char *)state);
|
161
|
+
}
|
162
|
+
|
163
|
+
void fromBytesToWords(tKeccakLane *stateAsWords, const unsigned char *state)
|
164
|
+
{
|
165
|
+
unsigned int i, j;
|
166
|
+
|
167
|
+
for(i=0; i<nrLanes; i++) {
|
168
|
+
stateAsWords[i] = 0;
|
169
|
+
for(j=0; j<(64/8); j++)
|
170
|
+
stateAsWords[i] |= (tKeccakLane)(state[i*(64/8)+j]) << (8*j);
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
174
|
+
void fromWordsToBytes(unsigned char *state, const tKeccakLane *stateAsWords)
|
175
|
+
{
|
176
|
+
unsigned int i, j;
|
177
|
+
|
178
|
+
for(i=0; i<nrLanes; i++)
|
179
|
+
for(j=0; j<(64/8); j++)
|
180
|
+
state[i*(64/8)+j] = (stateAsWords[i] >> (8*j)) & 0xFF;
|
181
|
+
}
|
182
|
+
|
183
|
+
void KeccakF1600OnWords(tKeccakLane *state)
|
184
|
+
{
|
185
|
+
unsigned int i;
|
186
|
+
|
187
|
+
displayStateAsLanes(3, "Same, with lanes as 64-bit words", state);
|
188
|
+
|
189
|
+
for(i=0; i<nrRounds; i++)
|
190
|
+
KeccakF1600Round(state, i);
|
191
|
+
}
|
192
|
+
|
193
|
+
void KeccakF1600Round(tKeccakLane *state, unsigned int indexRound)
|
194
|
+
{
|
195
|
+
displayRoundNumber(3, indexRound);
|
196
|
+
|
197
|
+
theta(state);
|
198
|
+
displayStateAsLanes(3, "After theta", state);
|
199
|
+
|
200
|
+
rho(state);
|
201
|
+
displayStateAsLanes(3, "After rho", state);
|
202
|
+
|
203
|
+
pi(state);
|
204
|
+
displayStateAsLanes(3, "After pi", state);
|
205
|
+
|
206
|
+
chi(state);
|
207
|
+
displayStateAsLanes(3, "After chi", state);
|
208
|
+
|
209
|
+
iota(state, indexRound);
|
210
|
+
displayStateAsLanes(3, "After iota", state);
|
211
|
+
}
|
212
|
+
|
213
|
+
#define ROL64(a, offset) ((offset != 0) ? ((((tKeccakLane)a) << offset) ^ (((tKeccakLane)a) >> (64-offset))) : a)
|
214
|
+
|
215
|
+
void theta(tKeccakLane *A)
|
216
|
+
{
|
217
|
+
unsigned int x, y;
|
218
|
+
tKeccakLane C[5], D[5];
|
219
|
+
|
220
|
+
for(x=0; x<5; x++) {
|
221
|
+
C[x] = 0;
|
222
|
+
for(y=0; y<5; y++)
|
223
|
+
C[x] ^= A[index(x, y)];
|
224
|
+
}
|
225
|
+
for(x=0; x<5; x++)
|
226
|
+
D[x] = ROL64(C[(x+1)%5], 1) ^ C[(x+4)%5];
|
227
|
+
for(x=0; x<5; x++)
|
228
|
+
for(y=0; y<5; y++)
|
229
|
+
A[index(x, y)] ^= D[x];
|
230
|
+
}
|
231
|
+
|
232
|
+
void rho(tKeccakLane *A)
|
233
|
+
{
|
234
|
+
unsigned int x, y;
|
235
|
+
|
236
|
+
for(x=0; x<5; x++) for(y=0; y<5; y++)
|
237
|
+
A[index(x, y)] = ROL64(A[index(x, y)], KeccakRhoOffsets[index(x, y)]);
|
238
|
+
}
|
239
|
+
|
240
|
+
void pi(tKeccakLane *A)
|
241
|
+
{
|
242
|
+
unsigned int x, y;
|
243
|
+
tKeccakLane tempA[25];
|
244
|
+
|
245
|
+
for(x=0; x<5; x++) for(y=0; y<5; y++)
|
246
|
+
tempA[index(x, y)] = A[index(x, y)];
|
247
|
+
for(x=0; x<5; x++) for(y=0; y<5; y++)
|
248
|
+
A[index(0*x+1*y, 2*x+3*y)] = tempA[index(x, y)];
|
249
|
+
}
|
250
|
+
|
251
|
+
void chi(tKeccakLane *A)
|
252
|
+
{
|
253
|
+
unsigned int x, y;
|
254
|
+
tKeccakLane C[5];
|
255
|
+
|
256
|
+
for(y=0; y<5; y++) {
|
257
|
+
for(x=0; x<5; x++)
|
258
|
+
C[x] = A[index(x, y)] ^ ((~A[index(x+1, y)]) & A[index(x+2, y)]);
|
259
|
+
for(x=0; x<5; x++)
|
260
|
+
A[index(x, y)] = C[x];
|
261
|
+
}
|
262
|
+
}
|
263
|
+
|
264
|
+
void iota(tKeccakLane *A, unsigned int indexRound)
|
265
|
+
{
|
266
|
+
A[index(0, 0)] ^= KeccakRoundConstants[indexRound];
|
267
|
+
}
|
268
|
+
|
269
|
+
/* ---------------------------------------------------------------- */
|
270
|
+
|
271
|
+
void KeccakF1600_StateExtractBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length)
|
272
|
+
{
|
273
|
+
memcpy(data, (unsigned char*)state+offset, length);
|
274
|
+
}
|
275
|
+
|
276
|
+
/* ---------------------------------------------------------------- */
|
277
|
+
|
278
|
+
void KeccakF1600_StateExtractAndXORBytes(const void *state, unsigned char *data, unsigned int offset, unsigned int length)
|
279
|
+
{
|
280
|
+
unsigned int i;
|
281
|
+
|
282
|
+
for(i=0; i<length; i++)
|
283
|
+
data[i] ^= ((unsigned char *)state)[offset+i];
|
284
|
+
}
|
285
|
+
|
286
|
+
/* ---------------------------------------------------------------- */
|
287
|
+
|
288
|
+
void displayRoundConstants(FILE *f)
|
289
|
+
{
|
290
|
+
unsigned int i;
|
291
|
+
|
292
|
+
for(i=0; i<nrRounds; i++) {
|
293
|
+
fprintf(f, "RC[%02i][0][0] = ", i);
|
294
|
+
fprintf(f, "%08X", (unsigned int)(KeccakRoundConstants[i] >> 32));
|
295
|
+
fprintf(f, "%08X", (unsigned int)(KeccakRoundConstants[i] & 0xFFFFFFFFULL));
|
296
|
+
fprintf(f, "\n");
|
297
|
+
}
|
298
|
+
fprintf(f, "\n");
|
299
|
+
}
|
300
|
+
|
301
|
+
void displayRhoOffsets(FILE *f)
|
302
|
+
{
|
303
|
+
unsigned int x, y;
|
304
|
+
|
305
|
+
for(y=0; y<5; y++) for(x=0; x<5; x++) {
|
306
|
+
fprintf(f, "RhoOffset[%i][%i] = ", x, y);
|
307
|
+
fprintf(f, "%2i", KeccakRhoOffsets[index(x, y)]);
|
308
|
+
fprintf(f, "\n");
|
309
|
+
}
|
310
|
+
fprintf(f, "\n");
|
311
|
+
}
|