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.

Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +9 -1
  4. data/Gemfile.ci +4 -4
  5. data/LICENSE.txt +1 -1
  6. data/README.md +145 -0
  7. data/Rakefile +4 -5
  8. data/ext/sha3/KeccakF-1600-interface.h +28 -34
  9. data/ext/sha3/KeccakHash.c +80 -0
  10. data/ext/sha3/KeccakHash.h +110 -0
  11. data/ext/sha3/KeccakSponge.c +127 -201
  12. data/ext/sha3/KeccakSponge.h +74 -37
  13. data/ext/sha3/Optimized64/KeccakF-1600-64.macros +2199 -0
  14. data/ext/sha3/Optimized64/KeccakF-1600-opt64-settings.h +3 -0
  15. data/ext/sha3/Optimized64/KeccakF-1600-opt64.c +508 -0
  16. data/ext/sha3/{KeccakF-1600-unrolling.macros → Optimized64/KeccakF-1600-unrolling.macros} +16 -14
  17. data/ext/sha3/Optimized64/SnP-interface.h +47 -0
  18. data/ext/sha3/Reference/KeccakF-1600-reference.c +311 -0
  19. data/ext/sha3/Reference/KeccakF-reference.h +26 -0
  20. data/ext/sha3/Reference/SnP-FBWL-default.c +96 -0
  21. data/ext/sha3/Reference/SnP-FBWL-default.h +26 -0
  22. data/ext/sha3/Reference/SnP-interface.h +42 -0
  23. data/ext/sha3/{displayIntermediateValues.c → Reference/displayIntermediateValues.c} +52 -11
  24. data/ext/sha3/{displayIntermediateValues.h → Reference/displayIntermediateValues.h} +11 -6
  25. data/ext/sha3/SnP-Relaned.h +249 -0
  26. data/ext/sha3/brg_endian.h +0 -0
  27. data/ext/sha3/digest.c +67 -70
  28. data/ext/sha3/digest.h +2 -2
  29. data/ext/sha3/extconf.rb +7 -12
  30. data/ext/sha3/sha3.h +2 -2
  31. data/lib/sha3/doc.rb +26 -39
  32. data/lib/sha3/version.rb +2 -2
  33. data/sha3.gemspec +6 -6
  34. data/spec/generate_tests.rb +6 -41
  35. data/spec/sha3_core_spec.rb +111 -133
  36. data/spec/spec_helper.rb +2 -2
  37. data/tests.sh +9 -7
  38. metadata +33 -36
  39. data/README.rdoc +0 -131
  40. data/ext/sha3/KeccakF-1600-32-rvk.macros +0 -555
  41. data/ext/sha3/KeccakF-1600-32-s1.macros +0 -1187
  42. data/ext/sha3/KeccakF-1600-32-s2.macros +0 -1187
  43. data/ext/sha3/KeccakF-1600-32.macros +0 -26
  44. data/ext/sha3/KeccakF-1600-64.macros +0 -728
  45. data/ext/sha3/KeccakF-1600-int-set.h +0 -6
  46. data/ext/sha3/KeccakF-1600-opt.c +0 -504
  47. data/ext/sha3/KeccakF-1600-opt32-settings.h +0 -4
  48. data/ext/sha3/KeccakF-1600-opt32.c-arch +0 -524
  49. data/ext/sha3/KeccakF-1600-opt64-settings.h +0 -7
  50. data/ext/sha3/KeccakF-1600-opt64.c-arch +0 -504
  51. data/ext/sha3/KeccakF-1600-reference.c-arch +0 -300
  52. data/ext/sha3/KeccakF-1600-x86-64-gas.s +0 -766
  53. data/ext/sha3/KeccakF-1600-x86-64-shld-gas.s +0 -766
  54. data/ext/sha3/KeccakNISTInterface.c +0 -81
  55. data/ext/sha3/KeccakNISTInterface.h +0 -70
@@ -1,17 +1,19 @@
1
1
  /*
2
- The Keccak sponge function, designed by Guido Bertoni, Joan Daemen,
3
- Michaël Peeters and Gilles Van Assche. For more information, feedback or
4
- questions, please refer to our website: http://keccak.noekeon.org/
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
- Implementation by the designers,
7
- hereby denoted as "the implementer".
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 (Unrolling == 24)
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
- copyToState(state, A)
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
- copyToState(state, A)
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
- copyToState(state, A)
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
- copyToState(state, A)
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
- copyToState(state, A)
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
- copyToState(state, A)
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
- copyToState(state, A)
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
- copyToState(state, A)
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
+ }