nim-poseidon2/poseidon2/spongemerkle.nim
2023-11-27 12:22:06 +01:00

29 lines
894 B
Nim

import ./types
import ./merkle
import ./sponge
type SpongeMerkle* = object
merkle: Merkle
func init*(_: type SpongeMerkle): SpongeMerkle =
SpongeMerkle(merkle: Merkle.init())
func update*(spongemerkle: var SpongeMerkle, chunk: openArray[byte]) =
let digest = Sponge.digest(chunk, rate = 2)
spongemerkle.merkle.update(digest)
func finish*(spongemerkle: var SpongeMerkle): F =
return spongemerkle.merkle.finish()
func digest*(_: type SpongeMerkle, bytes: openArray[byte], chunkSize: int): F =
## Hashes chunks of data with a sponge of rate 2, and combines the
## resulting chunk hashes in a merkle root.
var spongemerkle = SpongeMerkle.init()
var index = 0
while index < bytes.len:
let start = index
let finish = min(index + chunkSize, bytes.len)
spongemerkle.update(bytes.toOpenArray(start, finish - 1))
index += chunkSize
return spongemerkle.finish()