aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/crypto.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2017-03-05 23:38:34 +0800
committerFelix Lange <fjl@users.noreply.github.com>2017-03-09 22:50:14 +0800
commit3b00a77de57ab2737a7887521c192ce004c721e3 (patch)
tree74f9abad1af8fec472c2d5cb5f4ab424e44f9b1f /crypto/crypto.go
parent288700c4d884321b7de7119b596c6e052fa33b27 (diff)
downloaddexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar
dexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar.gz
dexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar.bz2
dexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar.lz
dexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar.xz
dexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar.zst
dexon-3b00a77de57ab2737a7887521c192ce004c721e3.zip
crypto, pow: add pure Go implementation of ethash
Diffstat (limited to 'crypto/crypto.go')
-rw-r--r--crypto/crypto.go48
1 files changed, 48 insertions, 0 deletions
diff --git a/crypto/crypto.go b/crypto/crypto.go
index ecc3be3ce..a60a4617e 100644
--- a/crypto/crypto.go
+++ b/crypto/crypto.go
@@ -37,6 +37,11 @@ var (
secp256k1_halfN = new(big.Int).Div(secp256k1_N, big.NewInt(2))
)
+// Hasher is a repetitive hasher allowing the same hash data structures to be
+// reused between hash runs instead of requiring new ones to be created.
+type Hasher func(data []byte) []byte
+
+// Keccak256 calculates and returns the Keccak256 hash of the input data.
func Keccak256(data ...[]byte) []byte {
d := sha3.NewKeccak256()
for _, b := range data {
@@ -45,6 +50,8 @@ func Keccak256(data ...[]byte) []byte {
return d.Sum(nil)
}
+// Keccak256Hash calculates and returns the Keccak256 hash of the input data,
+// converting it to an internal Hash data structure.
func Keccak256Hash(data ...[]byte) (h common.Hash) {
d := sha3.NewKeccak256()
for _, b := range data {
@@ -54,6 +61,47 @@ func Keccak256Hash(data ...[]byte) (h common.Hash) {
return h
}
+// Keccak256Hasher creates a repetitive Keccak256 hasher, allowing the same hash
+// data structures to be reused between hash runs instead of requiring new ones
+// to be created.
+//
+// The returned function is not thread safe!
+func Keccak256Hasher() Hasher {
+ hasher := sha3.NewKeccak256()
+
+ return func(data []byte) []byte {
+ hasher.Write(data)
+ result := hasher.Sum(nil)
+ hasher.Reset()
+ return result
+ }
+}
+
+// Keccak512 calculates and returns the Keccak512 hash of the input data.
+func Keccak512(data ...[]byte) []byte {
+ d := sha3.NewKeccak512()
+ for _, b := range data {
+ d.Write(b)
+ }
+ return d.Sum(nil)
+}
+
+// Keccak512Hasher creates a repetitive Keccak512 hasher, allowing the same hash
+// data structures to be reused between hash runs instead of requiring new ones
+// to be created.
+//
+// The returned function is not thread safe!
+func Keccak512Hasher() Hasher {
+ hasher := sha3.NewKeccak512()
+
+ return func(data []byte) []byte {
+ hasher.Write(data)
+ result := hasher.Sum(nil)
+ hasher.Reset()
+ return result
+ }
+}
+
// Deprecated: For backward compatibility as other packages depend on these
func Sha3Hash(data ...[]byte) common.Hash { return Keccak256Hash(data...) }