Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
58424512
Commit
58424512
authored
Sep 13, 2021
by
George Hotz
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
blake2b
parent
cc3de083
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
509 additions
and
1 deletion
+509
-1
contracts.go
minigeth/core/vm/contracts.go
+1
-1
blake2b.go
minigeth/crypto/blake2b/blake2b.go
+319
-0
blake2b_generic.go
minigeth/crypto/blake2b/blake2b_generic.go
+180
-0
blake2b_ref.go
minigeth/crypto/blake2b/blake2b_ref.go
+9
-0
No files found.
minigeth/core/vm/contracts.go
View file @
58424512
...
...
@@ -26,7 +26,7 @@ import (
"github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/crypto"
/*"github.com/ethereum/go-ethereum/crypto/blake2b"*/
"github.com/ethereum/go-ethereum/crypto/blake2b"
"github.com/ethereum/go-ethereum/crypto/bls12381"
"github.com/ethereum/go-ethereum/crypto/bn256"
"github.com/ethereum/go-ethereum/params"
...
...
minigeth/crypto/blake2b/blake2b.go
0 → 100644
View file @
58424512
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package blake2b implements the BLAKE2b hash algorithm defined by RFC 7693
// and the extendable output function (XOF) BLAKE2Xb.
//
// For a detailed specification of BLAKE2b see https://blake2.net/blake2.pdf
// and for BLAKE2Xb see https://blake2.net/blake2x.pdf
//
// If you aren't sure which function you need, use BLAKE2b (Sum512 or New512).
// If you need a secret-key MAC (message authentication code), use the New512
// function with a non-nil key.
//
// BLAKE2X is a construction to compute hash values larger than 64 bytes. It
// can produce hash values between 0 and 4 GiB.
package
blake2b
import
(
"encoding/binary"
"errors"
"hash"
)
const
(
// The blocksize of BLAKE2b in bytes.
BlockSize
=
128
// The hash size of BLAKE2b-512 in bytes.
Size
=
64
// The hash size of BLAKE2b-384 in bytes.
Size384
=
48
// The hash size of BLAKE2b-256 in bytes.
Size256
=
32
)
var
(
useAVX2
bool
useAVX
bool
useSSE4
bool
)
var
(
errKeySize
=
errors
.
New
(
"blake2b: invalid key size"
)
errHashSize
=
errors
.
New
(
"blake2b: invalid hash size"
)
)
var
iv
=
[
8
]
uint64
{
0x6a09e667f3bcc908
,
0xbb67ae8584caa73b
,
0x3c6ef372fe94f82b
,
0xa54ff53a5f1d36f1
,
0x510e527fade682d1
,
0x9b05688c2b3e6c1f
,
0x1f83d9abfb41bd6b
,
0x5be0cd19137e2179
,
}
// Sum512 returns the BLAKE2b-512 checksum of the data.
func
Sum512
(
data
[]
byte
)
[
Size
]
byte
{
var
sum
[
Size
]
byte
checkSum
(
&
sum
,
Size
,
data
)
return
sum
}
// Sum384 returns the BLAKE2b-384 checksum of the data.
func
Sum384
(
data
[]
byte
)
[
Size384
]
byte
{
var
sum
[
Size
]
byte
var
sum384
[
Size384
]
byte
checkSum
(
&
sum
,
Size384
,
data
)
copy
(
sum384
[
:
],
sum
[
:
Size384
])
return
sum384
}
// Sum256 returns the BLAKE2b-256 checksum of the data.
func
Sum256
(
data
[]
byte
)
[
Size256
]
byte
{
var
sum
[
Size
]
byte
var
sum256
[
Size256
]
byte
checkSum
(
&
sum
,
Size256
,
data
)
copy
(
sum256
[
:
],
sum
[
:
Size256
])
return
sum256
}
// New512 returns a new hash.Hash computing the BLAKE2b-512 checksum. A non-nil
// key turns the hash into a MAC. The key must be between zero and 64 bytes long.
func
New512
(
key
[]
byte
)
(
hash
.
Hash
,
error
)
{
return
newDigest
(
Size
,
key
)
}
// New384 returns a new hash.Hash computing the BLAKE2b-384 checksum. A non-nil
// key turns the hash into a MAC. The key must be between zero and 64 bytes long.
func
New384
(
key
[]
byte
)
(
hash
.
Hash
,
error
)
{
return
newDigest
(
Size384
,
key
)
}
// New256 returns a new hash.Hash computing the BLAKE2b-256 checksum. A non-nil
// key turns the hash into a MAC. The key must be between zero and 64 bytes long.
func
New256
(
key
[]
byte
)
(
hash
.
Hash
,
error
)
{
return
newDigest
(
Size256
,
key
)
}
// New returns a new hash.Hash computing the BLAKE2b checksum with a custom length.
// A non-nil key turns the hash into a MAC. The key must be between zero and 64 bytes long.
// The hash size can be a value between 1 and 64 but it is highly recommended to use
// values equal or greater than:
// - 32 if BLAKE2b is used as a hash function (The key is zero bytes long).
// - 16 if BLAKE2b is used as a MAC function (The key is at least 16 bytes long).
// When the key is nil, the returned hash.Hash implements BinaryMarshaler
// and BinaryUnmarshaler for state (de)serialization as documented by hash.Hash.
func
New
(
size
int
,
key
[]
byte
)
(
hash
.
Hash
,
error
)
{
return
newDigest
(
size
,
key
)
}
// F is a compression function for BLAKE2b. It takes as an argument the state
// vector `h`, message block vector `m`, offset counter `t`, final block indicator
// flag `f`, and number of rounds `rounds`. The state vector provided as the first
// parameter is modified by the function.
func
F
(
h
*
[
8
]
uint64
,
m
[
16
]
uint64
,
c
[
2
]
uint64
,
final
bool
,
rounds
uint32
)
{
var
flag
uint64
if
final
{
flag
=
0xFFFFFFFFFFFFFFFF
}
f
(
h
,
&
m
,
c
[
0
],
c
[
1
],
flag
,
uint64
(
rounds
))
}
func
newDigest
(
hashSize
int
,
key
[]
byte
)
(
*
digest
,
error
)
{
if
hashSize
<
1
||
hashSize
>
Size
{
return
nil
,
errHashSize
}
if
len
(
key
)
>
Size
{
return
nil
,
errKeySize
}
d
:=
&
digest
{
size
:
hashSize
,
keyLen
:
len
(
key
),
}
copy
(
d
.
key
[
:
],
key
)
d
.
Reset
()
return
d
,
nil
}
func
checkSum
(
sum
*
[
Size
]
byte
,
hashSize
int
,
data
[]
byte
)
{
h
:=
iv
h
[
0
]
^=
uint64
(
hashSize
)
|
(
1
<<
16
)
|
(
1
<<
24
)
var
c
[
2
]
uint64
if
length
:=
len
(
data
);
length
>
BlockSize
{
n
:=
length
&^
(
BlockSize
-
1
)
if
length
==
n
{
n
-=
BlockSize
}
hashBlocks
(
&
h
,
&
c
,
0
,
data
[
:
n
])
data
=
data
[
n
:
]
}
var
block
[
BlockSize
]
byte
offset
:=
copy
(
block
[
:
],
data
)
remaining
:=
uint64
(
BlockSize
-
offset
)
if
c
[
0
]
<
remaining
{
c
[
1
]
--
}
c
[
0
]
-=
remaining
hashBlocks
(
&
h
,
&
c
,
0xFFFFFFFFFFFFFFFF
,
block
[
:
])
for
i
,
v
:=
range
h
[
:
(
hashSize
+
7
)
/
8
]
{
binary
.
LittleEndian
.
PutUint64
(
sum
[
8
*
i
:
],
v
)
}
}
func
hashBlocks
(
h
*
[
8
]
uint64
,
c
*
[
2
]
uint64
,
flag
uint64
,
blocks
[]
byte
)
{
var
m
[
16
]
uint64
c0
,
c1
:=
c
[
0
],
c
[
1
]
for
i
:=
0
;
i
<
len
(
blocks
);
{
c0
+=
BlockSize
if
c0
<
BlockSize
{
c1
++
}
for
j
:=
range
m
{
m
[
j
]
=
binary
.
LittleEndian
.
Uint64
(
blocks
[
i
:
])
i
+=
8
}
f
(
h
,
&
m
,
c0
,
c1
,
flag
,
12
)
}
c
[
0
],
c
[
1
]
=
c0
,
c1
}
type
digest
struct
{
h
[
8
]
uint64
c
[
2
]
uint64
size
int
block
[
BlockSize
]
byte
offset
int
key
[
BlockSize
]
byte
keyLen
int
}
const
(
magic
=
"b2b"
marshaledSize
=
len
(
magic
)
+
8
*
8
+
2
*
8
+
1
+
BlockSize
+
1
)
func
(
d
*
digest
)
MarshalBinary
()
([]
byte
,
error
)
{
if
d
.
keyLen
!=
0
{
return
nil
,
errors
.
New
(
"crypto/blake2b: cannot marshal MACs"
)
}
b
:=
make
([]
byte
,
0
,
marshaledSize
)
b
=
append
(
b
,
magic
...
)
for
i
:=
0
;
i
<
8
;
i
++
{
b
=
appendUint64
(
b
,
d
.
h
[
i
])
}
b
=
appendUint64
(
b
,
d
.
c
[
0
])
b
=
appendUint64
(
b
,
d
.
c
[
1
])
// Maximum value for size is 64
b
=
append
(
b
,
byte
(
d
.
size
))
b
=
append
(
b
,
d
.
block
[
:
]
...
)
b
=
append
(
b
,
byte
(
d
.
offset
))
return
b
,
nil
}
func
(
d
*
digest
)
UnmarshalBinary
(
b
[]
byte
)
error
{
if
len
(
b
)
<
len
(
magic
)
||
string
(
b
[
:
len
(
magic
)])
!=
magic
{
return
errors
.
New
(
"crypto/blake2b: invalid hash state identifier"
)
}
if
len
(
b
)
!=
marshaledSize
{
return
errors
.
New
(
"crypto/blake2b: invalid hash state size"
)
}
b
=
b
[
len
(
magic
)
:
]
for
i
:=
0
;
i
<
8
;
i
++
{
b
,
d
.
h
[
i
]
=
consumeUint64
(
b
)
}
b
,
d
.
c
[
0
]
=
consumeUint64
(
b
)
b
,
d
.
c
[
1
]
=
consumeUint64
(
b
)
d
.
size
=
int
(
b
[
0
])
b
=
b
[
1
:
]
copy
(
d
.
block
[
:
],
b
[
:
BlockSize
])
b
=
b
[
BlockSize
:
]
d
.
offset
=
int
(
b
[
0
])
return
nil
}
func
(
d
*
digest
)
BlockSize
()
int
{
return
BlockSize
}
func
(
d
*
digest
)
Size
()
int
{
return
d
.
size
}
func
(
d
*
digest
)
Reset
()
{
d
.
h
=
iv
d
.
h
[
0
]
^=
uint64
(
d
.
size
)
|
(
uint64
(
d
.
keyLen
)
<<
8
)
|
(
1
<<
16
)
|
(
1
<<
24
)
d
.
offset
,
d
.
c
[
0
],
d
.
c
[
1
]
=
0
,
0
,
0
if
d
.
keyLen
>
0
{
d
.
block
=
d
.
key
d
.
offset
=
BlockSize
}
}
func
(
d
*
digest
)
Write
(
p
[]
byte
)
(
n
int
,
err
error
)
{
n
=
len
(
p
)
if
d
.
offset
>
0
{
remaining
:=
BlockSize
-
d
.
offset
if
n
<=
remaining
{
d
.
offset
+=
copy
(
d
.
block
[
d
.
offset
:
],
p
)
return
}
copy
(
d
.
block
[
d
.
offset
:
],
p
[
:
remaining
])
hashBlocks
(
&
d
.
h
,
&
d
.
c
,
0
,
d
.
block
[
:
])
d
.
offset
=
0
p
=
p
[
remaining
:
]
}
if
length
:=
len
(
p
);
length
>
BlockSize
{
nn
:=
length
&^
(
BlockSize
-
1
)
if
length
==
nn
{
nn
-=
BlockSize
}
hashBlocks
(
&
d
.
h
,
&
d
.
c
,
0
,
p
[
:
nn
])
p
=
p
[
nn
:
]
}
if
len
(
p
)
>
0
{
d
.
offset
+=
copy
(
d
.
block
[
:
],
p
)
}
return
}
func
(
d
*
digest
)
Sum
(
sum
[]
byte
)
[]
byte
{
var
hash
[
Size
]
byte
d
.
finalize
(
&
hash
)
return
append
(
sum
,
hash
[
:
d
.
size
]
...
)
}
func
(
d
*
digest
)
finalize
(
hash
*
[
Size
]
byte
)
{
var
block
[
BlockSize
]
byte
copy
(
block
[
:
],
d
.
block
[
:
d
.
offset
])
remaining
:=
uint64
(
BlockSize
-
d
.
offset
)
c
:=
d
.
c
if
c
[
0
]
<
remaining
{
c
[
1
]
--
}
c
[
0
]
-=
remaining
h
:=
d
.
h
hashBlocks
(
&
h
,
&
c
,
0xFFFFFFFFFFFFFFFF
,
block
[
:
])
for
i
,
v
:=
range
h
{
binary
.
LittleEndian
.
PutUint64
(
hash
[
8
*
i
:
],
v
)
}
}
func
appendUint64
(
b
[]
byte
,
x
uint64
)
[]
byte
{
var
a
[
8
]
byte
binary
.
BigEndian
.
PutUint64
(
a
[
:
],
x
)
return
append
(
b
,
a
[
:
]
...
)
}
func
appendUint32
(
b
[]
byte
,
x
uint32
)
[]
byte
{
var
a
[
4
]
byte
binary
.
BigEndian
.
PutUint32
(
a
[
:
],
x
)
return
append
(
b
,
a
[
:
]
...
)
}
func
consumeUint64
(
b
[]
byte
)
([]
byte
,
uint64
)
{
x
:=
binary
.
BigEndian
.
Uint64
(
b
)
return
b
[
8
:
],
x
}
func
consumeUint32
(
b
[]
byte
)
([]
byte
,
uint32
)
{
x
:=
binary
.
BigEndian
.
Uint32
(
b
)
return
b
[
4
:
],
x
}
minigeth/crypto/blake2b/blake2b_generic.go
0 → 100644
View file @
58424512
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
blake2b
import
(
"encoding/binary"
"math/bits"
)
// the precomputed values for BLAKE2b
// there are 10 16-byte arrays - one for each round
// the entries are calculated from the sigma constants.
var
precomputed
=
[
10
][
16
]
byte
{
{
0
,
2
,
4
,
6
,
1
,
3
,
5
,
7
,
8
,
10
,
12
,
14
,
9
,
11
,
13
,
15
},
{
14
,
4
,
9
,
13
,
10
,
8
,
15
,
6
,
1
,
0
,
11
,
5
,
12
,
2
,
7
,
3
},
{
11
,
12
,
5
,
15
,
8
,
0
,
2
,
13
,
10
,
3
,
7
,
9
,
14
,
6
,
1
,
4
},
{
7
,
3
,
13
,
11
,
9
,
1
,
12
,
14
,
2
,
5
,
4
,
15
,
6
,
10
,
0
,
8
},
{
9
,
5
,
2
,
10
,
0
,
7
,
4
,
15
,
14
,
11
,
6
,
3
,
1
,
12
,
8
,
13
},
{
2
,
6
,
0
,
8
,
12
,
10
,
11
,
3
,
4
,
7
,
15
,
1
,
13
,
5
,
14
,
9
},
{
12
,
1
,
14
,
4
,
5
,
15
,
13
,
10
,
0
,
6
,
9
,
8
,
7
,
3
,
2
,
11
},
{
13
,
7
,
12
,
3
,
11
,
14
,
1
,
9
,
5
,
15
,
8
,
2
,
0
,
4
,
6
,
10
},
{
6
,
14
,
11
,
0
,
15
,
9
,
3
,
8
,
12
,
13
,
1
,
10
,
2
,
7
,
4
,
5
},
{
10
,
8
,
7
,
1
,
2
,
4
,
6
,
5
,
15
,
9
,
3
,
13
,
11
,
14
,
12
,
0
},
}
func
hashBlocksGeneric
(
h
*
[
8
]
uint64
,
c
*
[
2
]
uint64
,
flag
uint64
,
blocks
[]
byte
)
{
var
m
[
16
]
uint64
c0
,
c1
:=
c
[
0
],
c
[
1
]
for
i
:=
0
;
i
<
len
(
blocks
);
{
c0
+=
BlockSize
if
c0
<
BlockSize
{
c1
++
}
for
j
:=
range
m
{
m
[
j
]
=
binary
.
LittleEndian
.
Uint64
(
blocks
[
i
:
])
i
+=
8
}
fGeneric
(
h
,
&
m
,
c0
,
c1
,
flag
,
12
)
}
c
[
0
],
c
[
1
]
=
c0
,
c1
}
func
fGeneric
(
h
*
[
8
]
uint64
,
m
*
[
16
]
uint64
,
c0
,
c1
uint64
,
flag
uint64
,
rounds
uint64
)
{
v0
,
v1
,
v2
,
v3
,
v4
,
v5
,
v6
,
v7
:=
h
[
0
],
h
[
1
],
h
[
2
],
h
[
3
],
h
[
4
],
h
[
5
],
h
[
6
],
h
[
7
]
v8
,
v9
,
v10
,
v11
,
v12
,
v13
,
v14
,
v15
:=
iv
[
0
],
iv
[
1
],
iv
[
2
],
iv
[
3
],
iv
[
4
],
iv
[
5
],
iv
[
6
],
iv
[
7
]
v12
^=
c0
v13
^=
c1
v14
^=
flag
for
i
:=
0
;
i
<
int
(
rounds
);
i
++
{
s
:=
&
(
precomputed
[
i
%
10
])
v0
+=
m
[
s
[
0
]]
v0
+=
v4
v12
^=
v0
v12
=
bits
.
RotateLeft64
(
v12
,
-
32
)
v8
+=
v12
v4
^=
v8
v4
=
bits
.
RotateLeft64
(
v4
,
-
24
)
v1
+=
m
[
s
[
1
]]
v1
+=
v5
v13
^=
v1
v13
=
bits
.
RotateLeft64
(
v13
,
-
32
)
v9
+=
v13
v5
^=
v9
v5
=
bits
.
RotateLeft64
(
v5
,
-
24
)
v2
+=
m
[
s
[
2
]]
v2
+=
v6
v14
^=
v2
v14
=
bits
.
RotateLeft64
(
v14
,
-
32
)
v10
+=
v14
v6
^=
v10
v6
=
bits
.
RotateLeft64
(
v6
,
-
24
)
v3
+=
m
[
s
[
3
]]
v3
+=
v7
v15
^=
v3
v15
=
bits
.
RotateLeft64
(
v15
,
-
32
)
v11
+=
v15
v7
^=
v11
v7
=
bits
.
RotateLeft64
(
v7
,
-
24
)
v0
+=
m
[
s
[
4
]]
v0
+=
v4
v12
^=
v0
v12
=
bits
.
RotateLeft64
(
v12
,
-
16
)
v8
+=
v12
v4
^=
v8
v4
=
bits
.
RotateLeft64
(
v4
,
-
63
)
v1
+=
m
[
s
[
5
]]
v1
+=
v5
v13
^=
v1
v13
=
bits
.
RotateLeft64
(
v13
,
-
16
)
v9
+=
v13
v5
^=
v9
v5
=
bits
.
RotateLeft64
(
v5
,
-
63
)
v2
+=
m
[
s
[
6
]]
v2
+=
v6
v14
^=
v2
v14
=
bits
.
RotateLeft64
(
v14
,
-
16
)
v10
+=
v14
v6
^=
v10
v6
=
bits
.
RotateLeft64
(
v6
,
-
63
)
v3
+=
m
[
s
[
7
]]
v3
+=
v7
v15
^=
v3
v15
=
bits
.
RotateLeft64
(
v15
,
-
16
)
v11
+=
v15
v7
^=
v11
v7
=
bits
.
RotateLeft64
(
v7
,
-
63
)
v0
+=
m
[
s
[
8
]]
v0
+=
v5
v15
^=
v0
v15
=
bits
.
RotateLeft64
(
v15
,
-
32
)
v10
+=
v15
v5
^=
v10
v5
=
bits
.
RotateLeft64
(
v5
,
-
24
)
v1
+=
m
[
s
[
9
]]
v1
+=
v6
v12
^=
v1
v12
=
bits
.
RotateLeft64
(
v12
,
-
32
)
v11
+=
v12
v6
^=
v11
v6
=
bits
.
RotateLeft64
(
v6
,
-
24
)
v2
+=
m
[
s
[
10
]]
v2
+=
v7
v13
^=
v2
v13
=
bits
.
RotateLeft64
(
v13
,
-
32
)
v8
+=
v13
v7
^=
v8
v7
=
bits
.
RotateLeft64
(
v7
,
-
24
)
v3
+=
m
[
s
[
11
]]
v3
+=
v4
v14
^=
v3
v14
=
bits
.
RotateLeft64
(
v14
,
-
32
)
v9
+=
v14
v4
^=
v9
v4
=
bits
.
RotateLeft64
(
v4
,
-
24
)
v0
+=
m
[
s
[
12
]]
v0
+=
v5
v15
^=
v0
v15
=
bits
.
RotateLeft64
(
v15
,
-
16
)
v10
+=
v15
v5
^=
v10
v5
=
bits
.
RotateLeft64
(
v5
,
-
63
)
v1
+=
m
[
s
[
13
]]
v1
+=
v6
v12
^=
v1
v12
=
bits
.
RotateLeft64
(
v12
,
-
16
)
v11
+=
v12
v6
^=
v11
v6
=
bits
.
RotateLeft64
(
v6
,
-
63
)
v2
+=
m
[
s
[
14
]]
v2
+=
v7
v13
^=
v2
v13
=
bits
.
RotateLeft64
(
v13
,
-
16
)
v8
+=
v13
v7
^=
v8
v7
=
bits
.
RotateLeft64
(
v7
,
-
63
)
v3
+=
m
[
s
[
15
]]
v3
+=
v4
v14
^=
v3
v14
=
bits
.
RotateLeft64
(
v14
,
-
16
)
v9
+=
v14
v4
^=
v9
v4
=
bits
.
RotateLeft64
(
v4
,
-
63
)
}
h
[
0
]
^=
v0
^
v8
h
[
1
]
^=
v1
^
v9
h
[
2
]
^=
v2
^
v10
h
[
3
]
^=
v3
^
v11
h
[
4
]
^=
v4
^
v12
h
[
5
]
^=
v5
^
v13
h
[
6
]
^=
v6
^
v14
h
[
7
]
^=
v7
^
v15
}
minigeth/crypto/blake2b/blake2b_ref.go
0 → 100644
View file @
58424512
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package
blake2b
func
f
(
h
*
[
8
]
uint64
,
m
*
[
16
]
uint64
,
c0
,
c1
uint64
,
flag
uint64
,
rounds
uint64
)
{
fGeneric
(
h
,
m
,
c0
,
c1
,
flag
,
rounds
)
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment