diff --git a/Cargo.lock b/Cargo.lock index ab552c6..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" @@ -89,6 +89,7 @@ dependencies = [ "rand", "rand_core", "subtle", + "zeroize", ] [[package]] @@ -112,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]] @@ -163,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]] @@ -184,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" @@ -192,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]] @@ -262,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", ] @@ -358,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,12 +315,7 @@ dependencies = [ ] [[package]] -name = "zerocopy-derive" -version = "0.8.23" +name = "zeroize" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.99", -] +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/Cargo.toml b/Cargo.toml index a5f7f7c..06ae537 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"] @@ -31,6 +32,7 @@ alloc = [] bits = ["bitvec", "ff_derive?/bits"] derive = ["byteorder", "ff_derive"] std = ["alloc"] +test_derive_zeroize = ["derive", "ff_derive/zeroize"] [[test]] name = "derive" diff --git a/ff_derive/Cargo.toml b/ff_derive/Cargo.toml index 6ae2aa0..582a906 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 bindings +zeroize = [] [lib] proc-macro = true diff --git a/ff_derive/src/lib.rs b/ff_derive/src/lib.rs index 53bc6ea..cc26e25 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_zeroize_impl = if cfg!(feature = "zeroize") { + 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_zeroize_impl } } @@ -934,6 +944,14 @@ fn prime_field_impl( None }; + let prime_field_zeroize_impl = if cfg!(feature = "zeroize") { + 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_zeroize_impl impl ::ff::Field for #name { const ZERO: Self = #name([0; #limbs]); diff --git a/tests/derive.rs b/tests/derive.rs index 29800f1..b699f1e 100644 --- a/tests/derive.rs +++ b/tests/derive.rs @@ -155,3 +155,20 @@ fn sqrt() { test(Fp::ONE); test(Fp::random(&mut rand::rng())); } + +#[cfg(feature = "test_derive_zeroize")] +#[test] +fn zeroize() { + use ff::{Field, PrimeField}; + use rand::{rngs::OsRng, TryRngCore}; + use zeroize::Zeroize; + + let mut f = Bls381K12Scalar::random(&mut OsRng.unwrap_err()); + let mut r = f.to_repr(); + + f.zeroize(); + assert_eq!(f, Bls381K12Scalar::ZERO); + + r.zeroize(); + assert_eq!(r, Default::default()); +}