diff --git a/Cargo.toml b/Cargo.toml index 5842c6b..7baeae0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ features = ["nightly"] [dependencies] keccak = { version = "0.1.0", default-features = false } byteorder = { version = "1.2.4", default-features = false } -zeroize = { version = "1", default-features = false, features = ["zeroize_derive"] } +zeroize = { version = "1", optional = true, default-features = false, features = ["zeroize_derive"] } rand_core = { version = "0.5", default-features = false } hex = {version = "0.3", default-features = false, optional = true} @@ -30,7 +30,8 @@ curve25519-dalek = "2" rand_chacha = "0.2" [features] -default = ["std"] +default = ["std", "zeroize"] nightly = [] debug-transcript = ["hex"] std = ["rand_core/std", "byteorder/std"] +zeroize = ["dep:zeroize"] \ No newline at end of file diff --git a/src/strobe.rs b/src/strobe.rs index ff0436f..7ca65c1 100644 --- a/src/strobe.rs +++ b/src/strobe.rs @@ -3,7 +3,9 @@ use core::ops::{Deref, DerefMut}; use keccak; -use zeroize::Zeroize; + +#[cfg(feature = "zeroize")] +use zeroize::{Zeroize, ZeroizeOnDrop}; /// Strobe R value; security level 128 is hardcoded const STROBE_R: u8 = 166; @@ -22,15 +24,16 @@ fn transmute_state(st: &mut AlignedKeccakState) -> &mut [u64; 25] { /// This is a wrapper around 200-byte buffer that's always 8-byte aligned /// to make pointers to it safely convertible to pointers to [u64; 25] /// (since u64 words must be 8-byte aligned) -#[derive(Clone, Zeroize)] -#[zeroize(drop)] +#[derive(Clone)] +#[cfg_attr(feature = "zeroize", derive(Zeroize, ZeroizeOnDrop))] #[repr(align(8))] struct AlignedKeccakState([u8; 200]); /// A Strobe context for the 128-bit security level. /// /// Only `meta-AD`, `AD`, `KEY`, and `PRF` operations are supported. -#[derive(Clone, Zeroize)] +#[derive(Clone)] +#[cfg_attr(feature = "zeroize", derive(Zeroize, ZeroizeOnDrop))] pub struct Strobe128 { state: AlignedKeccakState, pos: u8, diff --git a/src/transcript.rs b/src/transcript.rs index 9b72f48..d605066 100644 --- a/src/transcript.rs +++ b/src/transcript.rs @@ -1,5 +1,6 @@ use rand_core; -use zeroize::Zeroize; +#[cfg(feature = "zeroize")] +use zeroize::{Zeroize, ZeroizeOnDrop}; use crate::strobe::Strobe128; @@ -50,7 +51,8 @@ fn encode_usize_as_u32(x: usize) -> [u8; 4] { /// implement a proof system, see the documentation at /// [merlin.cool](https://merlin.cool), particularly the [Using /// Merlin](https://merlin.cool/use/index.html) section. -#[derive(Clone, Zeroize)] +#[derive(Clone)] +#[cfg_attr(feature = "zeroize", derive(Zeroize, ZeroizeOnDrop))] pub struct Transcript { strobe: Strobe128, }