diff --git a/Cargo.lock b/Cargo.lock index 784ff22..95295ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,17 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addchain" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -237,15 +248,31 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "ff" -version = "0.13.1" +version = "0.14.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +checksum = "d42dd26f5790eda47c1a2158ea4120e32c35ddc9a7743c98a292accc01b54ef3" dependencies = [ "bitvec", + "ff_derive", "rand_core", "subtle", ] +[[package]] +name = "ff_derive" +version = "0.14.0-pre.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9266df7c7c72e5a865a447aca13bf480d7310eaa4f84de117c33e361d4da8888" +dependencies = [ + "addchain", + "num-bigint", + "num-integer", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "funty" version = "2.0.0" @@ -254,9 +281,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "group" -version = "0.13.0" +version = "0.14.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +checksum = "1ff6a0b2dd4b981b1ae9e3e6830ab146771f3660d31d57bafd9018805a91b0f1" dependencies = [ "ff", "rand_core", @@ -358,6 +385,26 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "num-bigint" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -459,24 +506,25 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.5" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_core", + "zerocopy", ] [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" [[package]] name = "rand_xorshift" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ "rand_core", ] @@ -568,7 +616,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] @@ -601,6 +649,17 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.100" @@ -672,7 +731,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.100", "wasm-bindgen-shared", ] @@ -694,7 +753,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -830,3 +889,23 @@ checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" dependencies = [ "tap", ] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] diff --git a/Cargo.toml b/Cargo.toml index 1b869fb..67bcc50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ rustdoc-args = ["--cfg", "docsrs", "--html-in-header", "katex-header.html"] [dev-dependencies] bincode = "1.3" criterion = "0.4" -rand_xorshift = "0.3" +rand_xorshift = "0.4" serde_json = "1.0" [[bench]] @@ -44,9 +44,9 @@ harness = false required-features = ["alloc"] [dependencies] -ff = { version = "0.13", default-features = false } -group = { version = "0.13", default-features = false } -rand = { version = "0.8", default-features = false } +ff = { version = "=0.14.0-pre.0", default-features = false } +group = { version = "=0.14.0-pre.0", default-features = false } +rand = { version = "0.9", default-features = false } static_assertions = "1.1.0" subtle = { version = "2.3", default-features = false } diff --git a/src/curves.rs b/src/curves.rs index 41ccb9a..7a18be8 100644 --- a/src/curves.rs +++ b/src/curves.rs @@ -15,7 +15,7 @@ use group::{ prime::{PrimeCurve, PrimeCurveAffine, PrimeGroup}, Curve as _, Group as _, GroupEncoding, }; -use rand::RngCore; +use rand::TryRngCore; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; #[cfg(feature = "alloc")] @@ -70,10 +70,10 @@ macro_rules! new_curve_impl { impl group::Group for $name { type Scalar = $scalar; - fn random(mut rng: impl RngCore) -> Self { + fn try_from_rng(rng: &mut R) -> Result { loop { - let x = $base::random(&mut rng); - let ysign = (rng.next_u32() % 2) as u8; + let x = $base::try_from_rng(rng)?; + let ysign = (rng.try_next_u32()? % 2) as u8; let x3 = x.square() * x; let y = (x3 + $name::curve_constant_b()).sqrt(); @@ -85,7 +85,7 @@ macro_rules! new_curve_impl { x, y, }; - break p.to_curve(); + break Ok(p.to_curve()); } } } diff --git a/src/fields/fp.rs b/src/fields/fp.rs index 3264cba..c4018ce 100644 --- a/src/fields/fp.rs +++ b/src/fields/fp.rs @@ -2,7 +2,7 @@ use core::fmt; use core::ops::{Add, Mul, Neg, Sub}; use ff::{Field, FromUniformBytes, PrimeField, WithSmallOrderMulGroup}; -use rand::RngCore; +use rand::TryRngCore; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; #[cfg(feature = "sqrt-table")] @@ -479,17 +479,17 @@ impl ff::Field for Fp { const ZERO: Self = Self::zero(); const ONE: Self = Self::one(); - fn random(mut rng: impl RngCore) -> Self { - Self::from_u512([ - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - ]) + fn try_from_rng(rng: &mut R) -> Result { + Ok(Self::from_u512([ + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + ])) } fn double(&self) -> Self { diff --git a/src/fields/fq.rs b/src/fields/fq.rs index 8177fa4..d4dbfdf 100644 --- a/src/fields/fq.rs +++ b/src/fields/fq.rs @@ -2,7 +2,7 @@ use core::fmt; use core::ops::{Add, Mul, Neg, Sub}; use ff::{Field, FromUniformBytes, PrimeField, WithSmallOrderMulGroup}; -use rand::RngCore; +use rand::TryRngCore; use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; #[cfg(feature = "sqrt-table")] @@ -479,17 +479,17 @@ impl ff::Field for Fq { const ZERO: Self = Self::zero(); const ONE: Self = Self::one(); - fn random(mut rng: impl RngCore) -> Self { - Self::from_u512([ - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - rng.next_u64(), - ]) + fn try_from_rng(rng: &mut R) -> Result { + Ok(Self::from_u512([ + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + rng.try_next_u64()?, + ])) } fn double(&self) -> Self {