From 20e0b4687940efab017af6b894f1ee176caf6c4d Mon Sep 17 00:00:00 2001 From: Daniel Bloom <7810950-Daniel.Aaron.Bloom@users.noreply.gitlab.com> Date: Mon, 26 Dec 2022 18:40:59 -0800 Subject: [PATCH 1/8] feat: support zeroize codegen --- Cargo.lock | 7 +++++++ Cargo.toml | 11 ++++++++++- ff_derive/Cargo.toml | 2 ++ ff_derive/src/lib.rs | 19 +++++++++++++++++++ tests/derive_zero.rs | 28 ++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 tests/derive_zero.rs diff --git a/Cargo.lock b/Cargo.lock index ab552c6..e7e42c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -89,6 +89,7 @@ dependencies = [ "rand", "rand_core", "subtle", + "zeroize", ] [[package]] @@ -391,3 +392,9 @@ dependencies = [ "quote", "syn 2.0.99", ] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/Cargo.toml b/Cargo.toml index a5f7f7c..52a3f02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ byteorder = { version = "1", default-features = false, optional = true } ff_derive = { version = "=0.14.0-pre.0", path = "ff_derive", optional = true } rand_core = { version = "0.9", default-features = false } subtle = { version = "2.2.1", default-features = false, features = ["i128"] } +zeroize = { version = "1", default-features = false, optional = true } [dev-dependencies] blake2b_simd = "1" @@ -28,14 +29,22 @@ rand = "0.9" [features] default = ["bits", "std"] alloc = [] -bits = ["bitvec", "ff_derive?/bits"] +bits = ["bitvec"] derive = ["byteorder", "ff_derive"] std = ["alloc"] +# with MSRV 1.60 this could be merged into bits with ff_derive?/bits +# see PR#72 for more information. +derive_bits = ["bits", "derive", "ff_derive/bits"] +derive_zero = ["zero", "derive", "ff_derive/zero"] [[test]] name = "derive" required-features = ["derive"] +[[test]] +name = "derive_zero" +required-features = ["derive_zero"] + [badges] maintenance = { status = "actively-developed" } diff --git a/ff_derive/Cargo.toml b/ff_derive/Cargo.toml index 6ae2aa0..8e93395 100644 --- a/ff_derive/Cargo.toml +++ b/ff_derive/Cargo.toml @@ -17,6 +17,8 @@ repository = "https://github.com/zkcrypto/ff" # enabled when generating bitvec code utilizing the version of ff's bitvec # ff/bits enables this bits = [] +# enabled when generating zeroize code utilizing the version of ff's zeroize +zero = [] [lib] proc-macro = true diff --git a/ff_derive/src/lib.rs b/ff_derive/src/lib.rs index 53bc6ea..223d403 100644 --- a/ff_derive/src/lib.rs +++ b/ff_derive/src/lib.rs @@ -332,6 +332,14 @@ fn prime_field_repr_impl( ) -> proc_macro2::TokenStream { let repr_iter_be = endianness.iter_be(); + let prime_field_repr_zero_impl = if cfg!(feature = "zero") { + Some(quote! { + impl ::zeroize::DefaultIsZeroes for #repr {} + }) + } else { + None + }; + quote! { #[derive(Copy, Clone)] pub struct #repr(pub [u8; #bytes]); @@ -386,6 +394,8 @@ fn prime_field_repr_impl( &mut self.0 } } + + #prime_field_repr_zero_impl } } @@ -934,6 +944,14 @@ fn prime_field_impl( None }; + let prime_field_zero_impl = if cfg!(feature = "zero") { + Some(quote! { + impl ::zeroize::DefaultIsZeroes for #name {} + }) + } else { + None + }; + let top_limb_index = limbs - 1; quote! { @@ -1253,6 +1271,7 @@ fn prime_field_impl( } #prime_field_bits_impl + #prime_field_zero_impl impl ::ff::Field for #name { const ZERO: Self = #name([0; #limbs]); diff --git a/tests/derive_zero.rs b/tests/derive_zero.rs new file mode 100644 index 0000000..982e001 --- /dev/null +++ b/tests/derive_zero.rs @@ -0,0 +1,28 @@ +//! This module exercises the `ff_derive` procedural macros, specifically to ensure +//! zeroize works + +#[macro_use] +extern crate ff; + +/// The BLS12-381 scalar field. +#[derive(PrimeField)] +#[PrimeFieldModulus = "52435875175126190479447740508185965837690552500527637822603658699938581184513"] +#[PrimeFieldGenerator = "7"] +#[PrimeFieldReprEndianness = "little"] +struct Bls381K12Scalar([u64; 4]); + +#[test] +fn zeroize() { + use ff::{Field, PrimeField}; + use rand::rngs::OsRng; + use zeroize::Zeroize; + + let mut f = Bls381K12Scalar::random(OsRng); + let mut r = f.to_repr(); + + f.zeroize(); + assert_eq!(f, Bls381K12Scalar::ZERO); + + r.zeroize(); + assert_eq!(r, Default::default()); +} From cdb64d37c68607cd6ec4c36d3cea91bff44a9d18 Mon Sep 17 00:00:00 2001 From: Daniel-Aaron-Bloom <76709210+Daniel-Aaron-Bloom@users.noreply.github.com> Date: Thu, 29 Dec 2022 09:32:09 -0800 Subject: [PATCH 2/8] rename `zero` feature to `zeroize` as per Code Review Co-authored-by: str4d --- ff_derive/Cargo.toml | 2 +- ff_derive/src/lib.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ff_derive/Cargo.toml b/ff_derive/Cargo.toml index 8e93395..3da2098 100644 --- a/ff_derive/Cargo.toml +++ b/ff_derive/Cargo.toml @@ -18,7 +18,7 @@ repository = "https://github.com/zkcrypto/ff" # ff/bits enables this bits = [] # enabled when generating zeroize code utilizing the version of ff's zeroize -zero = [] +zeroize = [] [lib] proc-macro = true diff --git a/ff_derive/src/lib.rs b/ff_derive/src/lib.rs index 223d403..cc26e25 100644 --- a/ff_derive/src/lib.rs +++ b/ff_derive/src/lib.rs @@ -332,7 +332,7 @@ fn prime_field_repr_impl( ) -> proc_macro2::TokenStream { let repr_iter_be = endianness.iter_be(); - let prime_field_repr_zero_impl = if cfg!(feature = "zero") { + let prime_field_repr_zeroize_impl = if cfg!(feature = "zeroize") { Some(quote! { impl ::zeroize::DefaultIsZeroes for #repr {} }) @@ -395,7 +395,7 @@ fn prime_field_repr_impl( } } - #prime_field_repr_zero_impl + #prime_field_repr_zeroize_impl } } @@ -944,7 +944,7 @@ fn prime_field_impl( None }; - let prime_field_zero_impl = if cfg!(feature = "zero") { + let prime_field_zeroize_impl = if cfg!(feature = "zeroize") { Some(quote! { impl ::zeroize::DefaultIsZeroes for #name {} }) @@ -1271,7 +1271,7 @@ fn prime_field_impl( } #prime_field_bits_impl - #prime_field_zero_impl + #prime_field_zeroize_impl impl ::ff::Field for #name { const ZERO: Self = #name([0; #limbs]); From 1c2a6c2781096a9bea2a2d8bff0ef733723e9d3a Mon Sep 17 00:00:00 2001 From: Daniel Bloom <7810950-Daniel.Aaron.Bloom@users.noreply.gitlab.com> Date: Thu, 29 Dec 2022 09:36:20 -0800 Subject: [PATCH 3/8] Move tests as per Code Review --- Cargo.toml | 6 +----- tests/derive.rs | 18 ++++++++++++++++++ tests/derive_zero.rs | 28 ---------------------------- 3 files changed, 19 insertions(+), 33 deletions(-) delete mode 100644 tests/derive_zero.rs diff --git a/Cargo.toml b/Cargo.toml index 52a3f02..5ff0b50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,16 +35,12 @@ std = ["alloc"] # with MSRV 1.60 this could be merged into bits with ff_derive?/bits # see PR#72 for more information. derive_bits = ["bits", "derive", "ff_derive/bits"] -derive_zero = ["zero", "derive", "ff_derive/zero"] +derive_zero = ["zero", "derive", "ff_derive/zeroize"] [[test]] name = "derive" required-features = ["derive"] -[[test]] -name = "derive_zero" -required-features = ["derive_zero"] - [badges] maintenance = { status = "actively-developed" } diff --git a/tests/derive.rs b/tests/derive.rs index 29800f1..5776873 100644 --- a/tests/derive.rs +++ b/tests/derive.rs @@ -155,3 +155,21 @@ fn sqrt() { test(Fp::ONE); test(Fp::random(&mut rand::rng())); } + +#[cfg(feature = "zero")] + +#[test] +fn zeroize() { + use ff::{Field, PrimeField}; + use rand::rngs::OsRng; + use zeroize::Zeroize; + + let mut f = Bls381K12Scalar::random(OsRng); + let mut r = f.to_repr(); + + f.zeroize(); + assert_eq!(f, Bls381K12Scalar::ZERO); + + r.zeroize(); + assert_eq!(r, Default::default()); +} diff --git a/tests/derive_zero.rs b/tests/derive_zero.rs deleted file mode 100644 index 982e001..0000000 --- a/tests/derive_zero.rs +++ /dev/null @@ -1,28 +0,0 @@ -//! This module exercises the `ff_derive` procedural macros, specifically to ensure -//! zeroize works - -#[macro_use] -extern crate ff; - -/// The BLS12-381 scalar field. -#[derive(PrimeField)] -#[PrimeFieldModulus = "52435875175126190479447740508185965837690552500527637822603658699938581184513"] -#[PrimeFieldGenerator = "7"] -#[PrimeFieldReprEndianness = "little"] -struct Bls381K12Scalar([u64; 4]); - -#[test] -fn zeroize() { - use ff::{Field, PrimeField}; - use rand::rngs::OsRng; - use zeroize::Zeroize; - - let mut f = Bls381K12Scalar::random(OsRng); - let mut r = f.to_repr(); - - f.zeroize(); - assert_eq!(f, Bls381K12Scalar::ZERO); - - r.zeroize(); - assert_eq!(r, Default::default()); -} From c8115a4f9816dd49b1a29762edf1f502152ab3a0 Mon Sep 17 00:00:00 2001 From: Daniel Bloom <7810950-Daniel.Aaron.Bloom@users.noreply.gitlab.com> Date: Thu, 29 Dec 2022 09:37:45 -0800 Subject: [PATCH 4/8] cargo fmt --- tests/derive.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/derive.rs b/tests/derive.rs index 5776873..29f15f5 100644 --- a/tests/derive.rs +++ b/tests/derive.rs @@ -157,7 +157,6 @@ fn sqrt() { } #[cfg(feature = "zero")] - #[test] fn zeroize() { use ff::{Field, PrimeField}; From 23a0ecc867259910698c73a78efab39def650d23 Mon Sep 17 00:00:00 2001 From: Daniel-Aaron-Bloom <76709210+Daniel-Aaron-Bloom@users.noreply.github.com> Date: Thu, 29 Dec 2022 21:33:46 -0800 Subject: [PATCH 5/8] Apply suggestions from code review Co-authored-by: str4d --- Cargo.toml | 1 - ff_derive/Cargo.toml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5ff0b50..51ec4c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,6 @@ byteorder = { version = "1", default-features = false, optional = true } ff_derive = { version = "=0.14.0-pre.0", path = "ff_derive", optional = true } rand_core = { version = "0.9", default-features = false } subtle = { version = "2.2.1", default-features = false, features = ["i128"] } -zeroize = { version = "1", default-features = false, optional = true } [dev-dependencies] blake2b_simd = "1" diff --git a/ff_derive/Cargo.toml b/ff_derive/Cargo.toml index 3da2098..582a906 100644 --- a/ff_derive/Cargo.toml +++ b/ff_derive/Cargo.toml @@ -17,7 +17,7 @@ repository = "https://github.com/zkcrypto/ff" # enabled when generating bitvec code utilizing the version of ff's bitvec # ff/bits enables this bits = [] -# enabled when generating zeroize code utilizing the version of ff's zeroize +# enabled when generating zeroize bindings zeroize = [] [lib] From 9f61d0435e9fc3fe1e22fdfc095b586af6a7b180 Mon Sep 17 00:00:00 2001 From: Daniel Bloom <7810950-Daniel.Aaron.Bloom@users.noreply.gitlab.com> Date: Thu, 29 Dec 2022 21:41:39 -0800 Subject: [PATCH 6/8] fixup tests --- Cargo.lock | 117 ++++++++---------------------------------------- Cargo.toml | 3 +- tests/derive.rs | 2 +- 3 files changed, 22 insertions(+), 100 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e7e42c7..bc19823 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -33,9 +33,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "bitvec" @@ -113,14 +113,14 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", + "r-efi", "wasi", - "windows-targets", ] [[package]] @@ -164,7 +164,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -185,6 +185,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.7.0" @@ -193,13 +199,12 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha", "rand_core", - "zerocopy 0.8.23", ] [[package]] @@ -263,82 +268,18 @@ checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -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" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ "bitflags", ] @@ -359,16 +300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" -dependencies = [ - "zerocopy-derive 0.8.23", + "zerocopy-derive", ] [[package]] @@ -382,17 +314,6 @@ dependencies = [ "syn 2.0.99", ] -[[package]] -name = "zerocopy-derive" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] - [[package]] name = "zeroize" version = "1.8.1" diff --git a/Cargo.toml b/Cargo.toml index 51ec4c2..c49b31e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ subtle = { version = "2.2.1", default-features = false, features = ["i128"] } [dev-dependencies] blake2b_simd = "1" rand = "0.9" +zeroize = { version = "1", default-features = false } [features] default = ["bits", "std"] @@ -34,7 +35,7 @@ std = ["alloc"] # with MSRV 1.60 this could be merged into bits with ff_derive?/bits # see PR#72 for more information. derive_bits = ["bits", "derive", "ff_derive/bits"] -derive_zero = ["zero", "derive", "ff_derive/zeroize"] +test_derive_zeroize = ["derive", "ff_derive/zeroize"] [[test]] name = "derive" diff --git a/tests/derive.rs b/tests/derive.rs index 29f15f5..1edfced 100644 --- a/tests/derive.rs +++ b/tests/derive.rs @@ -156,7 +156,7 @@ fn sqrt() { test(Fp::random(&mut rand::rng())); } -#[cfg(feature = "zero")] +#[cfg(feature = "test_derive_zeroize")] #[test] fn zeroize() { use ff::{Field, PrimeField}; From 7c3a1f26f9f59109c2ff9c4c5cc2e8a952720eaf Mon Sep 17 00:00:00 2001 From: Daniel Bloom <7810950-Daniel.Aaron.Bloom@users.noreply.gitlab.com> Date: Fri, 23 May 2025 17:22:36 -0700 Subject: [PATCH 7/8] fix rebase --- Cargo.toml | 5 +---- tests/derive.rs | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c49b31e..06ae537 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,12 +29,9 @@ zeroize = { version = "1", default-features = false } [features] default = ["bits", "std"] alloc = [] -bits = ["bitvec"] +bits = ["bitvec", "ff_derive?/bits"] derive = ["byteorder", "ff_derive"] std = ["alloc"] -# with MSRV 1.60 this could be merged into bits with ff_derive?/bits -# see PR#72 for more information. -derive_bits = ["bits", "derive", "ff_derive/bits"] test_derive_zeroize = ["derive", "ff_derive/zeroize"] [[test]] diff --git a/tests/derive.rs b/tests/derive.rs index 1edfced..0a5216a 100644 --- a/tests/derive.rs +++ b/tests/derive.rs @@ -160,10 +160,10 @@ fn sqrt() { #[test] fn zeroize() { use ff::{Field, PrimeField}; - use rand::rngs::OsRng; + use rand::{TryRngCore, rngs::OsRng}; use zeroize::Zeroize; - let mut f = Bls381K12Scalar::random(OsRng); + let mut f = Bls381K12Scalar::random(&mut OsRng.unwrap_err()); let mut r = f.to_repr(); f.zeroize(); From 35111573616270da0061035d2c5686bd5e42d14f Mon Sep 17 00:00:00 2001 From: Daniel Bloom <7810950-Daniel.Aaron.Bloom@users.noreply.gitlab.com> Date: Fri, 23 May 2025 17:27:30 -0700 Subject: [PATCH 8/8] cargo fmt --- tests/derive.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/derive.rs b/tests/derive.rs index 0a5216a..b699f1e 100644 --- a/tests/derive.rs +++ b/tests/derive.rs @@ -160,7 +160,7 @@ fn sqrt() { #[test] fn zeroize() { use ff::{Field, PrimeField}; - use rand::{TryRngCore, rngs::OsRng}; + use rand::{rngs::OsRng, TryRngCore}; use zeroize::Zeroize; let mut f = Bls381K12Scalar::random(&mut OsRng.unwrap_err());