diff --git a/eth.nimble b/eth.nimble index ea596ce2..96d1e5ff 100644 --- a/eth.nimble +++ b/eth.nimble @@ -21,7 +21,8 @@ requires "nim >= 2.0.10", "unittest2", "results", "minilru", - "snappy" + "snappy", + "constantine" let nimc = getEnv("NIMC", "nim") # Which nim compiler to use let lang = getEnv("NIMLANG", "c") # Which backend (c/cpp/js) diff --git a/eth/common/hashes.nim b/eth/common/hashes.nim index 0575ab68..e796ac61 100644 --- a/eth/common/hashes.nim +++ b/eth/common/hashes.nim @@ -14,11 +14,12 @@ ## Its usage was limited to ethash, the proof-of-work algorithm that has been ## replaced with proof-of-stake. -import std/[typetraits, hashes], nimcrypto/keccak, ./base, stew/assign2 +import std/[typetraits, hashes], ./base, stew/assign2, constantine/hashes/h_keccak, nimcrypto/keccak -export hashes, keccak.update, keccak.finish +export hashes, keccak.update, keccak.finish, h_keccak type + KECCACK256* = h_keccak.KeccakContext[256, 0x01] Hash32* = distinct Bytes32 ## https://github.com/ethereum/execution-specs/blob/51fac24740e662844446439ceeb96a460aae0ba0/src/ethereum/crypto/hash.py#L19 Root* = Hash32 @@ -91,14 +92,19 @@ const ## of an empty MPT trie func keccak256*(input: openArray[byte]): Hash32 {.noinit.} = - var ctx: keccak.keccak256 + var + ctx: KECCACK256 + buff: array[32, byte] ctx.update(input) - ctx.finish().to(Hash32) + ctx.finish(buff) + Hash32(buff) func keccak256*(input: openArray[char]): Hash32 {.noinit.} = keccak256(input.toOpenArrayByte(0, input.high)) template withKeccak256*(body: untyped): Hash32 = - var h {.inject.}: keccak.keccak256 + var h {.inject.}: KECCACK256 body - h.finish().to(Hash32) + var buff: array[32, byte] + h.finish(buff) + Hash32(buff) diff --git a/eth/keyfile/keyfile.nim b/eth/keyfile/keyfile.nim index bbe2b55b..118bf922 100644 --- a/eth/keyfile/keyfile.nim +++ b/eth/keyfile/keyfile.nim @@ -186,7 +186,7 @@ proc deriveKey(password: string, discard ctx.pbkdf2(password, salt, c, output) ok(output) of HashSHA3_256: - var ctx: HMAC[sha3_256] + var ctx: HMAC[keccak.sha3_256] discard ctx.pbkdf2(password, salt, c, output) ok(output) of HashSHA3_384: @@ -334,7 +334,7 @@ proc createKeyFileJson*(seckey: PrivateKey, ciphertext = ? encryptKey(seckey, cryptkind, dkey, iv) - var ctx: keccak256 + var ctx: keccak.keccak256 ctx.init() ctx.update(toOpenArray(dkey, 16, 31)) ctx.update(ciphertext) @@ -432,7 +432,7 @@ proc decodeScryptParams(params: JsonNode): KfResult[ScryptParams] = result = ok(p) func decryptPrivateKey(crypto: Crypto, dkey: DKey): KfResult[PrivateKey] = - var ctx: keccak256 + var ctx: keccak.keccak256 ctx.init() ctx.update(toOpenArray(dkey, 16, 31)) ctx.update(crypto.cipher.text) diff --git a/eth/rlp/hash_writer.nim b/eth/rlp/hash_writer.nim index 1728434a..644ee7e4 100644 --- a/eth/rlp/hash_writer.nim +++ b/eth/rlp/hash_writer.nim @@ -8,7 +8,7 @@ import nimcrypto/keccak, ./priv/defs, utils, ../common/hashes, length_writer type RlpHashWriter* = object - keccak: keccak.keccak256 + keccak: KECCACK256 lengths*: seq[int] wrapLengths*: seq[int] listCount: int @@ -97,7 +97,9 @@ func reInit*(self: var RlpHashWriter, tracker: var RlpLengthTracker) = self.wrapLengths = move(tracker.wrapLengths) template finish*(self: var RlpHashWriter): Hash32 = - self.keccak.finish.to(Hash32) + var buff: array[32, byte] + self.keccak.finish(buff) + Hash32(buff) func clear*(self: var RlpHashWriter) = # Prepare writer for reuse