digest-keccak 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/Makefile +18 -0
- data/README.md +53 -0
- data/digest-keccak.gemspec +46 -0
- data/ext/digest/KeccakF-1600-int-set.h +6 -0
- data/ext/digest/KeccakF-1600-interface.h +46 -0
- data/ext/digest/KeccakF-1600-reference.c +300 -0
- data/ext/digest/KeccakNISTInterface.c +81 -0
- data/ext/digest/KeccakNISTInterface.h +70 -0
- data/ext/digest/KeccakSponge.c +266 -0
- data/ext/digest/KeccakSponge.h +76 -0
- data/ext/digest/brg_endian.h +142 -0
- data/ext/digest/displayIntermediateValues.c +117 -0
- data/ext/digest/displayIntermediateValues.h +29 -0
- data/ext/digest/extconf.rb +9 -0
- data/ext/digest/keccak.c +153 -0
- data/lib/digest/keccak/version.rb +7 -0
- metadata +65 -0
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,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
|
+
}
|