From fdd6fc5d6d505d7f3cc7308abf5d8edf4f04a513 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/7] feat: support zeroize codegen --- Cargo.toml | 11 +++++++++-- ff_derive/Cargo.toml | 2 ++ ff_derive/src/lib.rs | 19 +++++++++++++++++++ tests/derive_zero.rs | 28 ++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 tests/derive_zero.rs diff --git a/Cargo.toml b/Cargo.toml index 95ee2b9..68cfbdf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,9 +16,10 @@ edition = "2021" [dependencies] bitvec = { version = "1", default-features = false, optional = true } byteorder = { version = "1", default-features = false, optional = true } -ff_derive = { version = "0.13", path = "ff_derive", optional = true } +ff_derive = { version = "0.13.0", path = "ff_derive", optional = true } rand_core = { version = "0.6", 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,16 +29,22 @@ rand = "0.8" default = ["bits", "std"] alloc = [] bits = ["bitvec"] +zero = ["zeroize"] 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"] +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 68f5fe2..e155a10 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 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 5e7ebb6..143b4e6 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 } } @@ -942,6 +952,14 @@ fn prime_field_impl( } }; + 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! { @@ -1261,6 +1279,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 3b717a178a96c8d48371bad66963658940bb41d9 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:17:50 -0800 Subject: [PATCH 2/7] Update Cargo.toml Co-authored-by: str4d --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 68cfbdf..a17053c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ edition = "2021" [dependencies] bitvec = { version = "1", default-features = false, optional = true } byteorder = { version = "1", default-features = false, optional = true } -ff_derive = { version = "0.13.0", path = "ff_derive", optional = true } +ff_derive = { version = "0.13", path = "ff_derive", optional = true } rand_core = { version = "0.6", default-features = false } subtle = { version = "2.2.1", default-features = false, features = ["i128"] } zeroize = { version = "1", default-features = false, optional = true } From a6be620b6afbf7ca151ac8af1e3f4c35b7758f95 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 3/7] 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 e155a10..61d7ad8 100644 --- a/ff_derive/Cargo.toml +++ b/ff_derive/Cargo.toml @@ -16,7 +16,7 @@ edition = "2021" # enabled when generating bitvec code utilizing the version of ff's bitvec 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 143b4e6..8450dd1 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 } } @@ -952,7 +952,7 @@ fn prime_field_impl( } }; - 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 {} }) @@ -1279,7 +1279,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 a42c8b562daa55cf6d26f02b4963fbd7f0717128 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 4/7] 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 a17053c..c22e875 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 fa6ee20..9c1f106 100644 --- a/tests/derive.rs +++ b/tests/derive.rs @@ -135,3 +135,21 @@ fn batch_inversion() { } } } + +#[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()); +} \ No newline at end of file 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 82485154ed9694073472668e84efa92ae147aad2 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 5/7] cargo fmt --- tests/derive.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/derive.rs b/tests/derive.rs index 9c1f106..6d87258 100644 --- a/tests/derive.rs +++ b/tests/derive.rs @@ -137,7 +137,6 @@ fn batch_inversion() { } #[cfg(feature = "zero")] - #[test] fn zeroize() { use ff::{Field, PrimeField}; @@ -152,4 +151,4 @@ fn zeroize() { r.zeroize(); assert_eq!(r, Default::default()); -} \ No newline at end of file +} From b8e716ba1cb0e6e0ad72e46f99183f1614e748fc 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 6/7] Apply suggestions from code review Co-authored-by: str4d --- Cargo.toml | 2 -- ff_derive/Cargo.toml | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c22e875..243465a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,6 @@ byteorder = { version = "1", default-features = false, optional = true } ff_derive = { version = "0.13", path = "ff_derive", optional = true } rand_core = { version = "0.6", 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" @@ -29,7 +28,6 @@ rand = "0.8" default = ["bits", "std"] alloc = [] bits = ["bitvec"] -zero = ["zeroize"] derive = ["byteorder", "ff_derive"] std = ["alloc"] # with MSRV 1.60 this could be merged into bits with ff_derive?/bits diff --git a/ff_derive/Cargo.toml b/ff_derive/Cargo.toml index 61d7ad8..d0a41dd 100644 --- a/ff_derive/Cargo.toml +++ b/ff_derive/Cargo.toml @@ -15,7 +15,7 @@ edition = "2021" [features] # enabled when generating bitvec code utilizing the version of ff's bitvec bits = [] -# enabled when generating zeroize code utilizing the version of ff's zeroize +# enabled when generating zeroize bindings zeroize = [] [lib] From 08afa04041f713b198f75487ce8f7b2986becdbc 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 7/7] fixup tests --- Cargo.toml | 3 ++- tests/derive.rs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 243465a..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"] @@ -33,7 +34,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 6d87258..81ac505 100644 --- a/tests/derive.rs +++ b/tests/derive.rs @@ -136,7 +136,7 @@ fn batch_inversion() { } } -#[cfg(feature = "zero")] +#[cfg(feature = "test_derive_zeroize")] #[test] fn zeroize() { use ff::{Field, PrimeField};