From f76d8dd654e459fa539da9b2fc6c445af8d75443 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Thu, 23 Nov 2023 16:37:41 +0100 Subject: [PATCH 1/2] Move int.toF() function into io module --- poseidon2.nim | 1 + poseidon2/io.nim | 7 +++++++ poseidon2/types.nim | 6 ------ tests/poseidon2/testCompress.nim | 2 +- tests/poseidon2/testPermutation.nim | 2 +- tests/poseidon2/testSponge.nim | 1 + 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/poseidon2.nim b/poseidon2.nim index f071913..7959392 100644 --- a/poseidon2.nim +++ b/poseidon2.nim @@ -8,5 +8,6 @@ export sponge export compress export merkle export toBytes +export toF export elements export types diff --git a/poseidon2/io.nim b/poseidon2/io.nim index 822c035..d5b44e1 100644 --- a/poseidon2/io.nim +++ b/poseidon2/io.nim @@ -1,6 +1,7 @@ import ./types import constantine/math/arithmetic import constantine/math/io/io_bigints +import constantine/math/io/io_fields import constantine/math/config/curves export curves @@ -35,3 +36,9 @@ iterator elements*(bytes: openArray[byte], _: type F): F = let finalChunk = bytes[chunkStart.. Date: Thu, 23 Nov 2023 17:07:17 +0100 Subject: [PATCH 2/2] Convert all types of integers to field element --- poseidon2/io.nim | 9 +++++---- tests/poseidon2/testIo.nim | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/poseidon2/io.nim b/poseidon2/io.nim index d5b44e1..2c8dd6b 100644 --- a/poseidon2/io.nim +++ b/poseidon2/io.nim @@ -38,7 +38,8 @@ iterator elements*(bytes: openArray[byte], _: type F): F = yield finalElement # Remark: since `fromInt()` does not work at compile time, this doesn't either -func toF*(a: int) : F = - var y : F - y.fromInt(a) - return y +func toF*(a: SomeInteger | SomeUnsignedInt) : F = + when a is SomeInteger: + fromInt(result, a) + else: + fromUInt(result, a) diff --git a/tests/poseidon2/testIo.nim b/tests/poseidon2/testIo.nim index 97be438..23b1ce9 100644 --- a/tests/poseidon2/testIo.nim +++ b/tests/poseidon2/testIo.nim @@ -1,6 +1,7 @@ import std/unittest import std/sequtils import constantine/math/io/io_bigints +import constantine/math/io/io_fields import constantine/math/arithmetic import poseidon2/types import poseidon2/io @@ -54,3 +55,29 @@ suite "conversion to/from bytes": var expected: array[32, byte] marshal(expected, element.toBig(), littleEndian) check element.toBytes() == expected + +suite "conversion from integers": + + test "converts unsigned integers to a field element": + + proc checkConversion[I](integer: I) = + var expected: F + fromUint(expected, integer) + check bool(integer.toF == expected) + + checkConversion(0x11'u8) + checkConversion(0x1122'u16) + checkConversion(0x11223344'u32) + checkConversion(0x1122334455667788'u64) + + test "converts signed integers to a field element": + + proc checkConversion[I](integer: I) = + var expected: F + fromInt(expected, integer) + check bool(integer.toF == expected) + + checkConversion(0x11'i8) + checkConversion(0x1122'i16) + checkConversion(0x11223344'i32) + checkConversion(0x1122334455667788'i64)