Mark Spanbroek 03ed357ca4 Only support unmarshalling of little-endian bytes
Big-endian bytes had weird padding; 0's to the right,
then a single 0 to the left.
2023-11-02 09:31:10 +01:00

22 lines
696 B
Nim

import ./types
import constantine/math/arithmetic
import constantine/math/io/io_bigints
func unmarshal*(_: type F, bytes: openArray[byte]): F =
assert bytes.len <= 31
var padded: array[32, byte]
copyMem(addr padded[0], unsafeAddr bytes[0], bytes.len)
let bigint = B.unmarshal(padded, littleEndian)
return F.fromBig(bigint)
func unmarshal*(_: type seq[F], bytes: openArray[byte]): seq[F] =
const chunkLen = 31
var elements: seq[F]
var chunkStart = 0
while chunkStart < bytes.len:
let chunkEnd = min(chunkStart + 31, bytes.len)
let element = F.unmarshal(bytes.toOpenArray(chunkStart, chunkEnd - 1))
elements.add(element)
chunkStart += chunkLen
return elements