diff --git a/Cargo.toml b/Cargo.toml index 95ee2b9..a53e367 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,7 @@ subtle = { version = "2.2.1", default-features = false, features = ["i128"] } [dev-dependencies] blake2b_simd = "1" rand = "0.8" +zeroize = { version = "1", default-features = false } [features] default = ["bits", "std"] @@ -32,7 +33,8 @@ 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", "ff_derive/bits"] +derive_bits = ["bits", "derive", "ff_derive/bits"] +test_derive_zeroize = ["derive", "ff_derive/zeroize"] [[test]] name = "derive" diff --git a/ff_derive/Cargo.toml b/ff_derive/Cargo.toml index 68f5fe2..d0a41dd 100644 --- a/ff_derive/Cargo.toml +++ b/ff_derive/Cargo.toml @@ -15,6 +15,8 @@ edition = "2021" [features] # enabled when generating bitvec code utilizing the version of ff's bitvec 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 5e7ebb6..8450dd1 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 } } @@ -942,6 +952,14 @@ fn prime_field_impl( } }; + 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! { @@ -1261,6 +1279,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 fa6ee20..81ac505 100644 --- a/tests/derive.rs +++ b/tests/derive.rs @@ -135,3 +135,20 @@ fn batch_inversion() { } } } + +#[cfg(feature = "test_derive_zeroize")] +#[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()); +}