digest-keccak 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 741d7a0fd94a8c75fbeceba4ada1c54fadb045714f4a0bbc0bf43726d3d296a4
4
+ data.tar.gz: c046ffbbfe673a91c2701975f2a612863d20f56f10bf4763c3f759b604da5fcc
5
+ SHA512:
6
+ metadata.gz: 71e62b2f189ad0e36e91bf11872f6178b0f9c1dc50d520b96028d163ec6e675187437f6f508e64a88dd1ea4ae48812a6d4934bc4b4a49863bfac378f34972195
7
+ data.tar.gz: cd4beef3df2ab346c6f1253e06bc99e534b30109ef13d0356cb77c09e837678b1525a45ed1aba57633dacd698a91c6feae395ee0467225a09c2eb325dc50ea8e
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2012-2015 Phusion B.V.
4
+ Copyright (c) 2019 Alex Kotov
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
data/Makefile ADDED
@@ -0,0 +1,18 @@
1
+ .phony: all clean test
2
+
3
+ all: ext/digest/Makefile
4
+ make -C ext/digest
5
+
6
+ ext/digest/Makefile: ext/digest/extconf.rb
7
+ cd ext/digest && ruby extconf.rb
8
+
9
+ clean:
10
+ if [ -f ext/digest/Makefile ]; then make -C ext/digest clean; fi
11
+ rm -f ext/digest/Makefile
12
+ rm -f test/test_vectors.rb
13
+
14
+ test: all test/test_vectors.rb
15
+ ruby test/test_all.rb
16
+
17
+ test/test_vectors.rb: test/generate_tests.rb test/data/*
18
+ ruby test/generate_tests.rb > test/test_vectors.rb
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ Digest::Keccak
2
+ ==============
3
+
4
+ This Ruby extension implements the [Keccak](http://keccak.noekeon.org/)
5
+ (draft version of SHA-3) cryptographic hash function. It is based on
6
+ the reference C implementation, version 3.2. The exposed interface
7
+ is almost identical to that of the `digest` standard library.
8
+
9
+
10
+
11
+ Usage
12
+ -----
13
+
14
+ Keccak supports 5 hash lengths: 224-bit, 256-bit, 384-bit, 512-bit
15
+ and variable length. Variable length is not supported by this Ruby extension.
16
+ Unless the user specifies otherwise, this Ruby extension assumes 512-bit.
17
+
18
+ ```ruby
19
+ require 'digest/keccak'
20
+
21
+ # Generate 512-bit digest.
22
+ Digest::Keccak.digest("foo") # => "\025\227\204*..."
23
+ Digest::Keccak.hexdigest("foo") # => "1597842a..."
24
+
25
+ # Generate 224-bit digest.
26
+ Digest::Keccak.digest("foo", 224) # => "\332\251M\247..."
27
+ Digest::Keccak.hexdigest("foo", 224) # => "daa94da7..."
28
+
29
+ # Use this interface to feed data in chunks. 512-bit by default.
30
+ digest = Digest::Keccak.new
31
+ digest.update("f")
32
+ digest.update("o")
33
+ digest.update("o")
34
+ digest.digest # => "\025\227\204*..."
35
+ digest.hexdigest # => "1597842a..."
36
+
37
+ # You can pass a hash length to the constructor.
38
+ digest = Digest::Keccak.new(224)
39
+ ```
40
+
41
+
42
+
43
+ Running the test suite
44
+ ----------------------
45
+
46
+ Run the test suite as follows:
47
+
48
+ ```
49
+ make test
50
+ ```
51
+
52
+ A part of the test suite is automatically generated from Keccak's reference
53
+ test suite.
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__).freeze
4
+ $LOAD_PATH.unshift lib unless $LOAD_PATH.include? lib
5
+
6
+ require 'digest/keccak/version'
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = 'digest-keccak'
10
+ spec.version = Digest::Keccak::VERSION
11
+ spec.license = 'MIT'
12
+ spec.homepage = 'https://github.com/kotovalexarian/digest-keccak.rb'
13
+ spec.summary = 'The Keccak cryptographic hash function.'
14
+
15
+ spec.required_ruby_version = '~> 2.2'
16
+
17
+ spec.authors = ['Hongli Lai (Phusion)', 'Keccak authors']
18
+ spec.email = %w[software-signing@phusion.nl]
19
+
20
+ spec.description = <<-DESCRIPTION.split.join ' '
21
+ The Keccak (draft version of SHA-3) cryptographic hash function.
22
+ DESCRIPTION
23
+
24
+ spec.metadata = {
25
+ 'homepage_uri' => 'https://github.com/kotovalexarian/digest-keccak.rb',
26
+ 'source_code_uri' => 'https://github.com/kotovalexarian/digest-keccak.rb',
27
+ 'bug_tracker_uri' =>
28
+ 'https://github.com/kotovalexarian/digest-keccak.rb/issues',
29
+ }.freeze
30
+
31
+ spec.bindir = 'exe'
32
+ spec.require_paths = ['lib']
33
+
34
+ spec.files = Dir[
35
+ 'README.md',
36
+ 'LICENSE',
37
+ 'Makefile',
38
+ 'digest-keccak.gemspec',
39
+ 'ext/**/*.{c,h,rb}',
40
+ 'lib/**/*',
41
+ ]
42
+
43
+ spec.executables = spec.files.grep %r{^exe/}, &File.method(:basename)
44
+
45
+ spec.extensions << 'ext/digest/extconf.rb'
46
+ end
@@ -0,0 +1,6 @@
1
+ #define ProvideFast576
2
+ #define ProvideFast832
3
+ #define ProvideFast1024
4
+ #define ProvideFast1088
5
+ #define ProvideFast1152
6
+ #define ProvideFast1344
@@ -0,0 +1,46 @@
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/
5
+
6
+ Implementation by the designers,
7
+ hereby denoted as "the implementer".
8
+
9
+ To the extent possible under law, the implementer has waived all copyright
10
+ and related or neighboring rights to the source code in this file.
11
+ http://creativecommons.org/publicdomain/zero/1.0/
12
+ */
13
+
14
+ #ifndef _KeccakPermutationInterface_h_
15
+ #define _KeccakPermutationInterface_h_
16
+
17
+ #include "KeccakF-1600-int-set.h"
18
+
19
+ void KeccakInitialize( void );
20
+ void KeccakInitializeState(unsigned char *state);
21
+ void KeccakPermutation(unsigned char *state);
22
+ #ifdef ProvideFast576
23
+ void KeccakAbsorb576bits(unsigned char *state, const unsigned char *data);
24
+ #endif
25
+ #ifdef ProvideFast832
26
+ void KeccakAbsorb832bits(unsigned char *state, const unsigned char *data);
27
+ #endif
28
+ #ifdef ProvideFast1024
29
+ void KeccakAbsorb1024bits(unsigned char *state, const unsigned char *data);
30
+ #endif
31
+ #ifdef ProvideFast1088
32
+ void KeccakAbsorb1088bits(unsigned char *state, const unsigned char *data);
33
+ #endif
34
+ #ifdef ProvideFast1152
35
+ void KeccakAbsorb1152bits(unsigned char *state, const unsigned char *data);
36
+ #endif
37
+ #ifdef ProvideFast1344
38
+ void KeccakAbsorb1344bits(unsigned char *state, const unsigned char *data);
39
+ #endif
40
+ void KeccakAbsorb(unsigned char *state, const unsigned char *data, unsigned int laneCount);
41
+ #ifdef ProvideFast1024
42
+ void KeccakExtract1024bits(const unsigned char *state, unsigned char *data);
43
+ #endif
44
+ void KeccakExtract(const unsigned char *state, unsigned char *data, unsigned int laneCount);
45
+
46
+ #endif
@@ -0,0 +1,300 @@
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/
5
+
6
+ Implementation by the designers,
7
+ hereby denoted as "the implementer".
8
+
9
+ To the extent possible under law, the implementer has waived all copyright
10
+ and related or neighboring rights to the source code in this file.
11
+ http://creativecommons.org/publicdomain/zero/1.0/
12
+ */
13
+
14
+ #include <stdio.h>
15
+ #include <string.h>
16
+ #include "brg_endian.h"
17
+ #include "displayIntermediateValues.h"
18
+ #include "KeccakNISTInterface.h"
19
+ #include "KeccakF-1600-interface.h"
20
+
21
+ typedef unsigned char UINT8;
22
+ typedef unsigned long long int UINT64;
23
+
24
+ #define nrRounds 24
25
+ UINT64 KeccakRoundConstants[nrRounds];
26
+ #define nrLanes 25
27
+ unsigned int KeccakRhoOffsets[nrLanes];
28
+
29
+ void KeccakPermutationOnWords(UINT64 *state);
30
+ void theta(UINT64 *A);
31
+ void rho(UINT64 *A);
32
+ void pi(UINT64 *A);
33
+ void chi(UINT64 *A);
34
+ void iota(UINT64 *A, unsigned int indexRound);
35
+
36
+ void fromBytesToWords(UINT64 *stateAsWords, const unsigned char *state)
37
+ {
38
+ unsigned int i, j;
39
+
40
+ for(i=0; i<(KeccakPermutationSize/64); i++) {
41
+ stateAsWords[i] = 0;
42
+ for(j=0; j<(64/8); j++)
43
+ stateAsWords[i] |= (UINT64)(state[i*(64/8)+j]) << (8*j);
44
+ }
45
+ }
46
+
47
+ void fromWordsToBytes(unsigned char *state, const UINT64 *stateAsWords)
48
+ {
49
+ unsigned int i, j;
50
+
51
+ for(i=0; i<(KeccakPermutationSize/64); i++)
52
+ for(j=0; j<(64/8); j++)
53
+ state[i*(64/8)+j] = (stateAsWords[i] >> (8*j)) & 0xFF;
54
+ }
55
+
56
+ void KeccakPermutation(unsigned char *state)
57
+ {
58
+ #if (PLATFORM_BYTE_ORDER != IS_LITTLE_ENDIAN)
59
+ UINT64 stateAsWords[KeccakPermutationSize/64];
60
+ #endif
61
+
62
+ displayStateAsBytes(1, "Input of permutation", state);
63
+ #if (PLATFORM_BYTE_ORDER == IS_LITTLE_ENDIAN)
64
+ KeccakPermutationOnWords((UINT64*)state);
65
+ #else
66
+ fromBytesToWords(stateAsWords, state);
67
+ KeccakPermutationOnWords(stateAsWords);
68
+ fromWordsToBytes(state, stateAsWords);
69
+ #endif
70
+ displayStateAsBytes(1, "State after permutation", state);
71
+ }
72
+
73
+ void KeccakPermutationAfterXor(unsigned char *state, const unsigned char *data, unsigned int dataLengthInBytes)
74
+ {
75
+ unsigned int i;
76
+
77
+ for(i=0; i<dataLengthInBytes; i++)
78
+ state[i] ^= data[i];
79
+ KeccakPermutation(state);
80
+ }
81
+
82
+ void KeccakPermutationOnWords(UINT64 *state)
83
+ {
84
+ unsigned int i;
85
+
86
+ displayStateAs64bitWords(3, "Same, with lanes as 64-bit words", state);
87
+
88
+ for(i=0; i<nrRounds; i++) {
89
+ displayRoundNumber(3, i);
90
+
91
+ theta(state);
92
+ displayStateAs64bitWords(3, "After theta", state);
93
+
94
+ rho(state);
95
+ displayStateAs64bitWords(3, "After rho", state);
96
+
97
+ pi(state);
98
+ displayStateAs64bitWords(3, "After pi", state);
99
+
100
+ chi(state);
101
+ displayStateAs64bitWords(3, "After chi", state);
102
+
103
+ iota(state, i);
104
+ displayStateAs64bitWords(3, "After iota", state);
105
+ }
106
+ }
107
+
108
+ #define index(x, y) (((x)%5)+5*((y)%5))
109
+ #define ROL64(a, offset) ((offset != 0) ? ((((UINT64)a) << offset) ^ (((UINT64)a) >> (64-offset))) : a)
110
+
111
+ void theta(UINT64 *A)
112
+ {
113
+ unsigned int x, y;
114
+ UINT64 C[5], D[5];
115
+
116
+ for(x=0; x<5; x++) {
117
+ C[x] = 0;
118
+ for(y=0; y<5; y++)
119
+ C[x] ^= A[index(x, y)];
120
+ }
121
+ for(x=0; x<5; x++)
122
+ D[x] = ROL64(C[(x+1)%5], 1) ^ C[(x+4)%5];
123
+ for(x=0; x<5; x++)
124
+ for(y=0; y<5; y++)
125
+ A[index(x, y)] ^= D[x];
126
+ }
127
+
128
+ void rho(UINT64 *A)
129
+ {
130
+ unsigned int x, y;
131
+
132
+ for(x=0; x<5; x++) for(y=0; y<5; y++)
133
+ A[index(x, y)] = ROL64(A[index(x, y)], KeccakRhoOffsets[index(x, y)]);
134
+ }
135
+
136
+ void pi(UINT64 *A)
137
+ {
138
+ unsigned int x, y;
139
+ UINT64 tempA[25];
140
+
141
+ for(x=0; x<5; x++) for(y=0; y<5; y++)
142
+ tempA[index(x, y)] = A[index(x, y)];
143
+ for(x=0; x<5; x++) for(y=0; y<5; y++)
144
+ A[index(0*x+1*y, 2*x+3*y)] = tempA[index(x, y)];
145
+ }
146
+
147
+ void chi(UINT64 *A)
148
+ {
149
+ unsigned int x, y;
150
+ UINT64 C[5];
151
+
152
+ for(y=0; y<5; y++) {
153
+ for(x=0; x<5; x++)
154
+ C[x] = A[index(x, y)] ^ ((~A[index(x+1, y)]) & A[index(x+2, y)]);
155
+ for(x=0; x<5; x++)
156
+ A[index(x, y)] = C[x];
157
+ }
158
+ }
159
+
160
+ void iota(UINT64 *A, unsigned int indexRound)
161
+ {
162
+ A[index(0, 0)] ^= KeccakRoundConstants[indexRound];
163
+ }
164
+
165
+ int LFSR86540(UINT8 *LFSR)
166
+ {
167
+ int result = ((*LFSR) & 0x01) != 0;
168
+ if (((*LFSR) & 0x80) != 0)
169
+ // Primitive polynomial over GF(2): x^8+x^6+x^5+x^4+1
170
+ (*LFSR) = ((*LFSR) << 1) ^ 0x71;
171
+ else
172
+ (*LFSR) <<= 1;
173
+ return result;
174
+ }
175
+
176
+ void KeccakInitializeRoundConstants()
177
+ {
178
+ UINT8 LFSRstate = 0x01;
179
+ unsigned int i, j, bitPosition;
180
+
181
+ for(i=0; i<nrRounds; i++) {
182
+ KeccakRoundConstants[i] = 0;
183
+ for(j=0; j<7; j++) {
184
+ bitPosition = (1<<j)-1; //2^j-1
185
+ if (LFSR86540(&LFSRstate))
186
+ KeccakRoundConstants[i] ^= (UINT64)1<<bitPosition;
187
+ }
188
+ }
189
+ }
190
+
191
+ void KeccakInitializeRhoOffsets()
192
+ {
193
+ unsigned int x, y, t, newX, newY;
194
+
195
+ KeccakRhoOffsets[index(0, 0)] = 0;
196
+ x = 1;
197
+ y = 0;
198
+ for(t=0; t<24; t++) {
199
+ KeccakRhoOffsets[index(x, y)] = ((t+1)*(t+2)/2) % 64;
200
+ newX = (0*x+1*y) % 5;
201
+ newY = (2*x+3*y) % 5;
202
+ x = newX;
203
+ y = newY;
204
+ }
205
+ }
206
+
207
+ void KeccakInitialize()
208
+ {
209
+ KeccakInitializeRoundConstants();
210
+ KeccakInitializeRhoOffsets();
211
+ }
212
+
213
+ void displayRoundConstants(FILE *f)
214
+ {
215
+ unsigned int i;
216
+
217
+ for(i=0; i<nrRounds; i++) {
218
+ fprintf(f, "RC[%02i][0][0] = ", i);
219
+ fprintf(f, "%08X", (unsigned int)(KeccakRoundConstants[i] >> 32));
220
+ fprintf(f, "%08X", (unsigned int)(KeccakRoundConstants[i] & 0xFFFFFFFFULL));
221
+ fprintf(f, "\n");
222
+ }
223
+ fprintf(f, "\n");
224
+ }
225
+
226
+ void displayRhoOffsets(FILE *f)
227
+ {
228
+ unsigned int x, y;
229
+
230
+ for(y=0; y<5; y++) for(x=0; x<5; x++) {
231
+ fprintf(f, "RhoOffset[%i][%i] = ", x, y);
232
+ fprintf(f, "%2i", KeccakRhoOffsets[index(x, y)]);
233
+ fprintf(f, "\n");
234
+ }
235
+ fprintf(f, "\n");
236
+ }
237
+
238
+ void KeccakInitializeState(unsigned char *state)
239
+ {
240
+ memset(state, 0, KeccakPermutationSizeInBytes);
241
+ }
242
+
243
+ #ifdef ProvideFast576
244
+ void KeccakAbsorb576bits(unsigned char *state, const unsigned char *data)
245
+ {
246
+ KeccakPermutationAfterXor(state, data, 72);
247
+ }
248
+ #endif
249
+
250
+ #ifdef ProvideFast832
251
+ void KeccakAbsorb832bits(unsigned char *state, const unsigned char *data)
252
+ {
253
+ KeccakPermutationAfterXor(state, data, 104);
254
+ }
255
+ #endif
256
+
257
+ #ifdef ProvideFast1024
258
+ void KeccakAbsorb1024bits(unsigned char *state, const unsigned char *data)
259
+ {
260
+ KeccakPermutationAfterXor(state, data, 128);
261
+ }
262
+ #endif
263
+
264
+ #ifdef ProvideFast1088
265
+ void KeccakAbsorb1088bits(unsigned char *state, const unsigned char *data)
266
+ {
267
+ KeccakPermutationAfterXor(state, data, 136);
268
+ }
269
+ #endif
270
+
271
+ #ifdef ProvideFast1152
272
+ void KeccakAbsorb1152bits(unsigned char *state, const unsigned char *data)
273
+ {
274
+ KeccakPermutationAfterXor(state, data, 144);
275
+ }
276
+ #endif
277
+
278
+ #ifdef ProvideFast1344
279
+ void KeccakAbsorb1344bits(unsigned char *state, const unsigned char *data)
280
+ {
281
+ KeccakPermutationAfterXor(state, data, 168);
282
+ }
283
+ #endif
284
+
285
+ void KeccakAbsorb(unsigned char *state, const unsigned char *data, unsigned int laneCount)
286
+ {
287
+ KeccakPermutationAfterXor(state, data, laneCount*8);
288
+ }
289
+
290
+ #ifdef ProvideFast1024
291
+ void KeccakExtract1024bits(const unsigned char *state, unsigned char *data)
292
+ {
293
+ memcpy(data, state, 128);
294
+ }
295
+ #endif
296
+
297
+ void KeccakExtract(const unsigned char *state, unsigned char *data, unsigned int laneCount)
298
+ {
299
+ memcpy(data, state, laneCount*8);
300
+ }