diff --git a/Cargo.lock b/Cargo.lock index 3d43389b8..f37247424 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,15 +61,15 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byteorder" @@ -124,18 +124,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.23" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.23" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstyle", "clap_lex", @@ -210,9 +210,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -228,8 +228,8 @@ dependencies = [ "num-modular", "num-traits", "proptest", - "rand_chacha", - "rand_core", + "rand_chacha 0.9.0", + "rand_core 0.9.0", "rlp", "serdect", "subtle", @@ -255,7 +255,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -278,7 +278,19 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets", ] [[package]] @@ -314,13 +326,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -340,9 +352,9 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -362,15 +374,15 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "log" -version = "0.4.22" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "memchr" @@ -463,14 +475,14 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -487,7 +499,7 @@ dependencies = [ "lazy_static", "num-traits", "rand", - "rand_chacha", + "rand_chacha 0.3.1", "rand_xorshift", "regex-syntax", "rusty-fork", @@ -517,8 +529,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", ] [[package]] @@ -528,7 +540,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.0", ] [[package]] @@ -537,7 +559,17 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" +dependencies = [ + "getrandom 0.3.1", + "zerocopy 0.8.14", ] [[package]] @@ -546,7 +578,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" dependencies = [ - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -616,17 +648,23 @@ checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys", ] +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + [[package]] name = "rusty-fork" version = "0.3.0" @@ -641,9 +679,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "same-file" @@ -676,9 +714,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.134" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", "memchr", @@ -704,9 +742,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.94" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "987bc0be1cdea8b10216bd06e2ca407d40b9543468fafd3ddfb02f36e77f71f3" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -715,16 +753,16 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.15.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", "fastrand", - "getrandom", + "getrandom 0.3.1", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -751,9 +789,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "wait-timeout" @@ -780,22 +818,32 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", @@ -807,9 +855,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -817,9 +865,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -830,15 +878,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -850,16 +901,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", + "windows-sys", ] [[package]] @@ -935,6 +977,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -942,7 +993,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a367f292d93d4eab890745e75a778da40909cab4d6ff8173693812f79c4a2468" +dependencies = [ + "zerocopy-derive 0.8.14", ] [[package]] @@ -956,6 +1016,17 @@ dependencies = [ "syn", ] +[[package]] +name = "zerocopy-derive" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3931cb58c62c13adec22e38686b559c86a30565e16ad6e8510a337cedc611e1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zeroize" version = "1.8.1" diff --git a/Cargo.toml b/Cargo.toml index 2dc246d72..aa2c7ee15 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ subtle = { version = "2.6", default-features = false } der = { version = "0.7", optional = true, default-features = false } hybrid-array = { version = "0.2", optional = true } num-traits = { version = "0.2.19", default-features = false } -rand_core = { version = "0.6.4", optional = true } +rand_core = { version = "0.9", optional = true, default-features = false, features = ["os_rng"] } rlp = { version = "0.6", optional = true, default-features = false } serdect = { version = "0.3", optional = true, default-features = false } zeroize = { version = "1", optional = true, default-features = false } @@ -36,15 +36,15 @@ num-bigint = "0.4" num-integer = "0.1" num-modular = { version = "0.6", features = ["num-bigint", "num-integer", "num-traits"] } proptest = "1.5" -rand_core = { version = "0.6", features = ["std"] } -rand_chacha = "0.3" +rand_core = { version = "0.9", features = ["std"] } +rand_chacha = "0.9" [features] default = ["rand"] alloc = ["serdect?/alloc"] extra-sizes = [] -rand = ["rand_core/getrandom"] +rand = ["rand_core"] serde = ["dep:serdect"] [package.metadata.docs.rs] diff --git a/src/int/rand.rs b/src/int/rand.rs index 2fa01f67c..fbee6e320 100644 --- a/src/int/rand.rs +++ b/src/int/rand.rs @@ -1,6 +1,6 @@ //! Random number generator support -use rand_core::RngCore; +use rand_core::{RngCore, TryRngCore}; use crate::{Int, Random, RandomBits, RandomBitsError}; @@ -14,15 +14,18 @@ impl Random for Int { } impl RandomBits for Int { - fn try_random_bits(rng: &mut impl RngCore, bit_length: u32) -> Result { + fn try_random_bits( + rng: &mut R, + bit_length: u32, + ) -> Result> { Self::try_random_bits_with_precision(rng, bit_length, Self::BITS) } - fn try_random_bits_with_precision( - rng: &mut impl RngCore, + fn try_random_bits_with_precision( + rng: &mut R, bit_length: u32, bits_precision: u32, - ) -> Result { + ) -> Result> { Uint::try_random_bits_with_precision(rng, bit_length, bits_precision).map(Self) } } diff --git a/src/traits.rs b/src/traits.rs index 8f77aba4f..bdb0ed1be 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -20,7 +20,7 @@ use subtle::{ }; #[cfg(feature = "rand_core")] -use rand_core::RngCore; +use rand_core::{RngCore, TryRngCore}; /// Integers whose representation takes a bounded amount of space. pub trait Bounded { @@ -305,9 +305,9 @@ pub trait Random: Sized { /// Possible errors of the methods in [`RandomBits`] trait. #[cfg(feature = "rand_core")] #[derive(Debug)] -pub enum RandomBitsError { +pub enum RandomBitsError { /// An error of the internal RNG library. - RandCore(rand_core::Error), + RandCore(T), /// The requested `bits_precision` does not match the size of the integer /// corresponding to the type (in the cases where this is set in compile time). BitsPrecisionMismatch { @@ -326,7 +326,10 @@ pub enum RandomBitsError { } #[cfg(feature = "rand_core")] -impl fmt::Display for RandomBitsError { +impl fmt::Display for RandomBitsError +where + T: fmt::Display, +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::RandCore(err) => write!(f, "{}", err), @@ -354,7 +357,7 @@ impl fmt::Display for RandomBitsError { } #[cfg(feature = "rand_core")] -impl core::error::Error for RandomBitsError {} +impl core::error::Error for RandomBitsError where T: Debug + fmt::Display {} /// Random bits generation support. #[cfg(feature = "rand_core")] @@ -362,7 +365,7 @@ pub trait RandomBits: Sized { /// Generate a random value in range `[0, 2^bit_length)`. /// /// A wrapper for [`RandomBits::try_random_bits`] that panics on error. - fn random_bits(rng: &mut impl RngCore, bit_length: u32) -> Self { + fn random_bits(rng: &mut impl TryRngCore, bit_length: u32) -> Self { Self::try_random_bits(rng, bit_length).expect("try_random_bits() failed") } @@ -371,15 +374,18 @@ pub trait RandomBits: Sized { /// This method is variable time wrt `bit_length`. /// /// If `rng` is a CSRNG, the generation is cryptographically secure as well. - fn try_random_bits(rng: &mut impl RngCore, bit_length: u32) -> Result; + fn try_random_bits( + rng: &mut R, + bit_length: u32, + ) -> Result>; /// Generate a random value in range `[0, 2^bit_length)`, /// returning an integer with the closest available size to `bits_precision` /// (if the implementing type supports runtime sizing). /// /// A wrapper for [`RandomBits::try_random_bits_with_precision`] that panics on error. - fn random_bits_with_precision( - rng: &mut impl RngCore, + fn random_bits_with_precision( + rng: &mut R, bit_length: u32, bits_precision: u32, ) -> Self { @@ -394,11 +400,11 @@ pub trait RandomBits: Sized { /// This method is variable time wrt `bit_length`. /// /// If `rng` is a CSRNG, the generation is cryptographically secure as well. - fn try_random_bits_with_precision( - rng: &mut impl RngCore, + fn try_random_bits_with_precision( + rng: &mut R, bit_length: u32, bits_precision: u32, - ) -> Result; + ) -> Result>; } /// Modular random number generation support. diff --git a/src/uint/boxed/rand.rs b/src/uint/boxed/rand.rs index e00afa410..f07f9e6e3 100644 --- a/src/uint/boxed/rand.rs +++ b/src/uint/boxed/rand.rs @@ -5,18 +5,21 @@ use crate::{ uint::rand::{random_bits_core, random_mod_core}, NonZero, RandomBits, RandomBitsError, RandomMod, }; -use rand_core::RngCore; +use rand_core::{RngCore, TryRngCore}; impl RandomBits for BoxedUint { - fn try_random_bits(rng: &mut impl RngCore, bit_length: u32) -> Result { + fn try_random_bits( + rng: &mut R, + bit_length: u32, + ) -> Result> { Self::try_random_bits_with_precision(rng, bit_length, bit_length) } - fn try_random_bits_with_precision( - rng: &mut impl RngCore, + fn try_random_bits_with_precision( + rng: &mut R, bit_length: u32, bits_precision: u32, - ) -> Result { + ) -> Result> { if bit_length > bits_precision { return Err(RandomBitsError::BitLengthTooLarge { bit_length, @@ -31,7 +34,7 @@ impl RandomBits for BoxedUint { } impl RandomMod for BoxedUint { - fn random_mod(rng: &mut impl RngCore, modulus: &NonZero) -> Self { + fn random_mod(rng: &mut (impl TryRngCore + RngCore), modulus: &NonZero) -> Self { let mut n = BoxedUint::zero_with_precision(modulus.bits_precision()); random_mod_core(rng, &mut n, modulus, modulus.bits()); n diff --git a/src/uint/rand.rs b/src/uint/rand.rs index 4c7be2b52..4af16722b 100644 --- a/src/uint/rand.rs +++ b/src/uint/rand.rs @@ -2,7 +2,7 @@ use super::{Uint, Word}; use crate::{Encoding, Limb, NonZero, Random, RandomBits, RandomBitsError, RandomMod, Zero}; -use rand_core::RngCore; +use rand_core::{RngCore, TryRngCore}; use subtle::ConstantTimeLess; impl Random for Uint { @@ -20,11 +20,11 @@ impl Random for Uint { /// Fill the given limbs slice with random bits. /// /// NOTE: Assumes that the limbs in the given slice are zeroed! -pub(crate) fn random_bits_core( - rng: &mut impl RngCore, +pub(crate) fn random_bits_core( + rng: &mut R, zeroed_limbs: &mut [Limb], bit_length: u32, -) -> Result<(), RandomBitsError> { +) -> Result<(), RandomBitsError> { if bit_length == 0 { return Ok(()); } @@ -50,15 +50,18 @@ pub(crate) fn random_bits_core( } impl RandomBits for Uint { - fn try_random_bits(rng: &mut impl RngCore, bit_length: u32) -> Result { + fn try_random_bits( + rng: &mut R, + bit_length: u32, + ) -> Result> { Self::try_random_bits_with_precision(rng, bit_length, Self::BITS) } - fn try_random_bits_with_precision( - rng: &mut impl RngCore, + fn try_random_bits_with_precision( + rng: &mut R, bit_length: u32, bits_precision: u32, - ) -> Result { + ) -> Result> { if bits_precision != Self::BITS { return Err(RandomBitsError::BitsPrecisionMismatch { bits_precision, @@ -78,7 +81,7 @@ impl RandomBits for Uint { } impl RandomMod for Uint { - fn random_mod(rng: &mut impl RngCore, modulus: &NonZero) -> Self { + fn random_mod(rng: &mut (impl TryRngCore + RngCore), modulus: &NonZero) -> Self { let mut n = Self::ZERO; random_mod_core(rng, &mut n, modulus, modulus.bits_vartime()); n @@ -88,7 +91,7 @@ impl RandomMod for Uint { /// Generic implementation of `random_mod` which can be shared with `BoxedUint`. // TODO(tarcieri): obtain `n_bits` via a trait like `Integer` pub(super) fn random_mod_core( - rng: &mut impl RngCore, + rng: &mut (impl TryRngCore + RngCore), n: &mut T, modulus: &NonZero, n_bits: u32,