diff --git a/mod.rs b/mod.rs index cdab4c3..8f7f644 100644 --- a/mod.rs +++ b/mod.rs @@ -8,6 +8,7 @@ use std::fmt; use std::hash::{Hash, Hasher}; use byteorder::{BigEndian, ByteOrder}; +use clear_on_drop::ClearOnDrop; use init_with::InitWith; use pairing::{CurveAffine, CurveProjective, Engine, Field, PrimeField}; use rand::{ChaChaRng, OsRng, Rng, SeedableRng}; @@ -119,6 +120,12 @@ impl PartialEq for SecretKey { } } +impl Default for SecretKey { + fn default() -> Self { + SecretKey(E::Fr::zero()) + } +} + impl SecretKey { /// Creates a new secret key. pub fn new(rng: &mut R) -> Self { @@ -290,8 +297,13 @@ impl SecretKeySet { } /// Returns the `i`-th secret key share. - pub fn secret_key_share::Repr>>(&self, i: T) -> SecretKey { - SecretKey(self.poly.evaluate(from_repr_plus_1::(i.into()))) + pub fn secret_key_share(&self, i: T) -> ClearOnDrop>> + where + T: Into<::Repr> + { + ClearOnDrop::new(Box::new( + SecretKey(self.poly.evaluate(from_repr_plus_1::(i.into()))) + )) } /// Returns the corresponding public key set. That information can be shared publicly. @@ -423,9 +435,9 @@ mod tests { assert_ne!(pk_set.public_key(), pk_set.public_key_share(2)); // Make sure we don't hand out the main secret key to anyone. - assert_ne!(sk_set.secret_key(), sk_set.secret_key_share(0)); - assert_ne!(sk_set.secret_key(), sk_set.secret_key_share(1)); - assert_ne!(sk_set.secret_key(), sk_set.secret_key_share(2)); + assert_ne!(sk_set.secret_key(), *sk_set.secret_key_share(0)); + assert_ne!(sk_set.secret_key(), *sk_set.secret_key_share(1)); + assert_ne!(sk_set.secret_key(), *sk_set.secret_key_share(2)); let msg = "Totally real news";