diff --git a/aiken.lock b/aiken.lock index 49b9d66..444bd34 100644 --- a/aiken.lock +++ b/aiken.lock @@ -13,4 +13,4 @@ requirements = [] source = "github" [etags] -"aiken-lang/fuzz@v2" = [{ secs_since_epoch = 1726332025, nanos_since_epoch = 14944000 }, "34ffec10cce786bf823c7505589a3b5e0663792ef8efd31f870d7bcc37e0f593"] +"aiken-lang/fuzz@v2" = [{ secs_since_epoch = 1726529265, nanos_since_epoch = 528667332 }, "34ffec10cce786bf823c7505589a3b5e0663792ef8efd31f870d7bcc37e0f593"] diff --git a/lib/aiken/crypto/bls12_381/scalar.ak b/lib/aiken/crypto/bls12_381/scalar.ak index cf028ad..6bdb870 100644 --- a/lib/aiken/crypto/bls12_381/scalar.ak +++ b/lib/aiken/crypto/bls12_381/scalar.ak @@ -40,6 +40,8 @@ pub opaque type Scalar { pub fn new(n: Int) -> Option { if n >= 0 && n < field_prime { Some(Scalar(n)) + } else if n >= field_prime { + Some(Scalar(n % field_prime)) } else { None } @@ -48,11 +50,17 @@ pub fn new(n: Int) -> Option { test new_1() { and { new(-1) == None, - new(field_prime) == None, + new(field_prime) == Some(zero), new(834884848) == Some(Scalar(834884848)), } } +test new_2() { + new(field_prime + 398234892374892374928374) == Some( + Scalar(398234892374892374928374), + ) +} + /// Constructs a new `Scalar` element from a Big-Endian (most-significant bits first) `ByteArray`. pub fn from_bytearray_big_endian(bytes: ByteArray) -> Option { new(builtin.bytearray_to_integer(True, bytes))