diff --git a/poseidon2.nim b/poseidon2.nim index 20a7176..05db865 100644 --- a/poseidon2.nim +++ b/poseidon2.nim @@ -98,4 +98,4 @@ func merkleRoot*(xs: openArray[F]) : F = return merkleRoot(ys) func merkleRoot*(bytes: openArray[byte]): F = - merkleRoot(F.unmarshal(bytes, littleEndian)) + merkleRoot(seq[F].unmarshal(bytes, littleEndian)) diff --git a/poseidon2/io.nim b/poseidon2/io.nim index 89ffea2..2d2daa6 100644 --- a/poseidon2/io.nim +++ b/poseidon2/io.nim @@ -2,17 +2,32 @@ import ./types import constantine/math/arithmetic import constantine/math/io/io_bigints +func padRight(source: openArray[byte], endian: static Endianness): array[32, byte] = + assert source.len <= 31 + when endian == littleEndian: + copyMem(addr result[0], unsafeAddr source[0], source.len) + when endian == bigEndian: + copyMem(addr result[1], unsafeAddr source[0], source.len) + func unmarshal*( _: type F, bytes: openArray[byte], + endian: static Endianness): F = + assert bytes.len <= 31 + let padded = bytes.padRight(endian) + let bigint = B.unmarshal(padded, endian) + return F.fromBig(bigint) + +func unmarshal*( + _: type seq[F], + bytes: openArray[byte], endian: static Endianness): seq[F] = const chunkLen = 31 var elements: seq[F] - var i = 0 - while i < bytes.len: - let chunk = bytes[i..