FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
solidity/libdevcore/SHA3.cpp at develop · virtual-bug/solidity · GitHub
virtual-bug
/
solidity
Public
forked from
argotorg/solidity
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
solidity
/
libdevcore
/
SHA3.cpp
Copy path
More file actions
More file actions
Latest commit
History
History
History
240 lines (209 loc) · 6.59 KB
Breadcrumbs
solidity
/
libdevcore
/
SHA3.cpp
Copy path
File metadata and controls
240 lines (209 loc) · 6.59 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
/*
This file is part of solidity.
solidity is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
solidity is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with solidity. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* @file SHA3.cpp
* @author Gav Wood <i@gavwood.com>
* @date 2014
*/
#
include
"
SHA3.h
"
#
include
<
cstdint
>
#
include
<
cstdio
>
#
include
<
cstdlib
>
#
include
<
cstring
>
using
namespace
std
;
using
namespace
dev
;
namespace
dev
{
namespace
keccak
{
/*
* libkeccak-tiny
*
* A single-file implementation of SHA-3 and SHAKE.
*
* Implementor: David Leon Gil
* License: CC0, attribution kindly requested. Blame taken too,
* but not liability.
*/
#
define
decshake
(
bits
) \
int
shake##bits(
uint8_t
*,
size_t
,
const
uint8_t
*,
size_t
);
#
define
decsha3
(
bits
) \
int
sha3_##bits(
uint8_t
*,
size_t
,
const
uint8_t
*,
size_t
);
#
define
deckeccak
(
bits
) \
int
keccak##bits(
uint8_t
*,
size_t
,
const
uint8_t
*,
size_t
);
decshake
(
128
)
decshake
(
256
)
decsha3
(
224
)
decsha3
(
256
)
decsha3
(
384
)
decsha3
(
512
)
deckeccak
(
224
)
deckeccak
(
256
)
deckeccak
(
384
)
deckeccak
(
512
)
/*
******* The Keccak-f[1600] permutation *******
*/
/*
** Constants. **
*/
static
const
uint8_t
rho[
24
] = \
{
1
,
3
,
6
,
10
,
15
,
21
,
28
,
36
,
45
,
55
,
2
,
14
,
27
,
41
,
56
,
8
,
25
,
43
,
62
,
18
,
39
,
61
,
20
,
44
};
static
const
uint8_t
pi[
24
] = \
{
10
,
7
,
11
,
17
,
18
,
3
,
5
,
16
,
8
,
21
,
24
,
4
,
15
,
23
,
19
,
13
,
12
,
2
,
20
,
14
,
22
,
9
,
6
,
1
};
static
const
uint64_t
RC
[
24
] = \
{
1ULL
,
0x8082ULL
,
0x800000000000808aULL
,
0x8000000080008000ULL
,
0x808bULL
,
0x80000001ULL
,
0x8000000080008081ULL
,
0x8000000000008009ULL
,
0x8aULL
,
0x88ULL
,
0x80008009ULL
,
0x8000000aULL
,
0x8000808bULL
,
0x800000000000008bULL
,
0x8000000000008089ULL
,
0x8000000000008003ULL
,
0x8000000000008002ULL
,
0x8000000000000080ULL
,
0x800aULL
,
0x800000008000000aULL
,
0x8000000080008081ULL
,
0x8000000000008080ULL
,
0x80000001ULL
,
0x8000000080008008ULL
};
/*
** Helper macros to unroll the permutation. **
*/
#
define
rol
(
x, s
) (((x) << s) | ((x) >> (
64
- s)))
#
define
REPEAT6
(
e
) e e e e e e
#
define
REPEAT24
(
e
)
REPEAT6
(e e e e)
#
define
REPEAT5
(
e
) e e e e e
#
define
FOR5
(
v, s, e
) \
v =
0
; \
REPEAT5
(e; v += s;)
/*
** Keccak-f[1600] **
*/
static
inline
void
keccakf
(
void
* state) {
uint64_t
* a = (
uint64_t
*)state;
uint64_t
b[
5
] = {
0
};
for
(
int
i =
0
; i <
24
; i++) {
uint8_t
x, y;
//
Theta
FOR5
(x,
1
,
b[x] =
0
;
FOR5
(y,
5
,
b[x] ^= a[x + y]; ))
FOR5
(x,
1
,
FOR5
(y,
5
,
a[y + x] ^= b[(x +
4
) %
5
] ^
rol
(b[(x +
1
) %
5
],
1
); ))
//
Rho and pi
uint64_t
t = a[
1
];
x =
0
;
REPEAT24
(b[
0
] = a[pi[x]];
a[pi[x]] =
rol
(t, rho[x]);
t = b[
0
];
x++; )
//
Chi
FOR5
(y,
5
,
FOR5
(x,
1
,
b[x] = a[y + x];)
FOR5
(x,
1
,
a[y + x] = b[x] ^ ((~b[(x +
1
) %
5
]) & b[(x +
2
) %
5
]); ))
//
Iota
a[
0
] ^=
RC
[i];
}
}
/*
******* The FIPS202-defined functions. *******
*/
/*
** Some helper macros. **
*/
#
define
_
(
S
)
do
{ S }
while
(
0
)
#
define
FOR
(
i, ST, L, S
) \
_
(
for
(
size_t
i =
0
; i < L; i +=
ST
) { S; })
#
define
mkapply_ds
(
NAME, S
) \
static
inline
void
NAME
(
uint8_t
* dst, \
const
uint8_t
* src, \
size_t
len) { \
FOR
(i,
1
, len, S); \
}
#
define
mkapply_sd
(
NAME, S
) \
static
inline
void
NAME
(
const
uint8_t
* src, \
uint8_t
* dst, \
size_t
len) { \
FOR
(i,
1
, len, S); \
}
mkapply_ds
(xorin, dst[i] ^= src[i])
//
xorin
mkapply_sd
(setout, dst[i] = src[i])
//
setout
#
define
P
keccakf
#
define
Plen
200
//
Fold P*F over the full blocks of an input.
#
define
foldP
(
I, L, F
) \
while
(L >= rate) { \
F
(a, I, rate); \
P
(a); \
I += rate; \
L -= rate; \
}
/*
* The sponge-based hash construction. *
*/
static
inline
int
hash
(
uint8_t
* out,
size_t
outlen,
const
uint8_t
* in,
size_t
inlen,
size_t
rate,
uint8_t
delim) {
if
((out ==
NULL
) || ((in ==
NULL
) && inlen !=
0
) || (rate >= Plen)) {
return
-
1
;
}
uint8_t
a[Plen] = {
0
};
//
Absorb input.
foldP
(in, inlen, xorin);
//
Xor in the DS and pad frame.
a[inlen] ^= delim;
a[rate -
1
] ^=
0x80
;
//
Xor in the last block.
xorin
(a, in, inlen);
//
Apply P
P
(a);
//
Squeeze output.
foldP
(out, outlen, setout);
setout
(a, out, outlen);
memset
(a,
0
,
200
);
return
0
;
}
/*
** Helper macros to define SHA3 and SHAKE instances. **
*/
#
define
defshake
(
bits
) \
int
shake##bits(
uint8_t
* out,
size_t
outlen, \
const
uint8_t
* in,
size_t
inlen) { \
return
hash
(out, outlen, in, inlen,
200
- (bits /
4
),
0x1f
); \
}
#
define
defsha3
(
bits
) \
int
sha3_##bits(
uint8_t
* out,
size_t
outlen, \
const
uint8_t
* in,
size_t
inlen) { \
if
(outlen > (bits/
8
)) { \
return
-
1
; \
} \
return
hash
(out, outlen, in, inlen,
200
- (bits /
4
),
0x06
); \
}
#
define
defkeccak
(
bits
) \
int
keccak##bits(
uint8_t
* out,
size_t
outlen, \
const
uint8_t
* in,
size_t
inlen) { \
if
(outlen > (bits/
8
)) { \
return
-
1
; \
} \
return
hash
(out, outlen, in, inlen,
200
- (bits /
4
),
0x01
); \
}
/*
** FIPS202 SHAKE VOFs **
*/
defshake
(
128
)
defshake
(
256
)
/*
** FIPS202 SHA3 FOFs **
*/
defsha3
(
224
)
defsha3
(
256
)
defsha3
(
384
)
defsha3
(
512
)
/*
** KECCAK FOFs **
*/
defkeccak
(
224
)
defkeccak
(
256
)
defkeccak
(
384
)
defkeccak
(
512
)
}
bool
keccak256
(bytesConstRef _input, bytesRef o_output)
{
//
FIXME: What with unaligned memory?
if
(o_output.
size
() !=
32
)
return
false
;
keccak::keccak256
(o_output.
data
(),
32
, _input.
data
(), _input.
size
());
//
keccak::keccak(ret.data(), 32, (uint64_t const*)_input.data(), _input.size());
return
true
;
}
}
Back
|
FazBrowse Home
|
New Git URL