2023-10-31 13:40:07 +01:00
|
|
|
import std/unittest
|
|
|
|
import std/sequtils
|
|
|
|
import constantine/math/io/io_bigints
|
|
|
|
import constantine/math/arithmetic
|
|
|
|
import poseidon2/types
|
|
|
|
import poseidon2/io
|
|
|
|
|
2023-11-02 10:07:45 +01:00
|
|
|
suite "conversion to/from bytes":
|
2023-10-31 13:40:07 +01:00
|
|
|
|
|
|
|
test "converts little endian bytes into field elements":
|
2023-11-02 08:54:04 +01:00
|
|
|
let bytes = toSeq 1'u8..31'u8
|
2023-11-02 09:00:03 +01:00
|
|
|
let paddedTo32 = bytes & @[0'u8] # most significant byte is not used
|
2023-11-02 08:54:04 +01:00
|
|
|
let expected = F.fromBig(B.unmarshal(paddedTo32, littleEndian))
|
2023-11-02 10:07:45 +01:00
|
|
|
let unmarshalled = F.fromBytes(bytes)
|
2023-11-02 08:54:04 +01:00
|
|
|
check bool(unmarshalled == expected)
|
|
|
|
|
|
|
|
test "pads little endian bytes to the right with 0's":
|
|
|
|
let bytes = @[0x56'u8, 0x34, 0x12]
|
2023-11-02 09:00:03 +01:00
|
|
|
let paddedTo32 = bytes & 0'u8.repeat(32 - bytes.len)
|
2023-11-02 08:54:04 +01:00
|
|
|
let expected = F.fromBig(B.unmarshal(paddedTo32, littleEndian))
|
2023-11-02 10:07:45 +01:00
|
|
|
let unmarshalled = F.fromBytes(bytes)
|
2023-11-02 08:54:04 +01:00
|
|
|
check bool(unmarshalled == expected)
|
2023-10-31 13:40:07 +01:00
|
|
|
|
|
|
|
test "converts every 31 bytes into a field element":
|
2023-11-02 09:00:03 +01:00
|
|
|
let bytes = toSeq 1'u8..80'u8
|
|
|
|
let padded = bytes & 0'u8.repeat(93 - bytes.len)
|
|
|
|
let expected1 = F.fromBig(B.unmarshal(padded[ 0..<31] & @[0'u8], littleEndian))
|
|
|
|
let expected2 = F.fromBig(B.unmarshal(padded[31..<62] & @[0'u8], littleEndian))
|
|
|
|
let expected3 = F.fromBig(B.unmarshal(padded[62..<93] & @[0'u8], littleEndian))
|
2023-11-02 10:07:45 +01:00
|
|
|
let elements = seq[F].fromBytes(bytes)
|
2023-11-02 09:00:03 +01:00
|
|
|
check elements.len == 3
|
|
|
|
check bool(elements[0] == expected1)
|
|
|
|
check bool(elements[1] == expected2)
|
|
|
|
check bool(elements[2] == expected3)
|
2023-10-31 13:40:07 +01:00
|
|
|
|
2023-11-02 09:57:54 +01:00
|
|
|
test "converts field element into little-endian bytes":
|
|
|
|
var element: F
|
|
|
|
setMinusOne(element) # largest element in the field
|
|
|
|
var expected: array[32, byte]
|
|
|
|
marshal(expected, element.toBig(), littleEndian)
|
2023-11-02 10:07:45 +01:00
|
|
|
check element.toBytes() == expected
|