From 79085903a04f5bc7313380d87d4581a6ff82f1f5 Mon Sep 17 00:00:00 2001 From: Deirdre Connolly Date: Wed, 15 Mar 2023 10:04:32 -0400 Subject: [PATCH] Zeroize full signingkey (#73) * Zeroize full signingkey Includes Default and DefaultIsZeroes impl for VerificationKey. Resolves #72 * derive Zeroize for SigningKey --- Cargo.toml | 10 +++++----- src/signing_key.rs | 10 ++-------- src/verification_key.rs | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a8047f8..c760d17 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,14 +14,14 @@ resolver = "2" features = ["nightly"] [dependencies] -hex = { version = "0.4", default-features = false, features = ["alloc"] } -sha2 = { version = "0.10", default-features = false } -rand_core = "0.6" # "digest" is exempt from SemVer, so we should always use a specific version curve25519-dalek = { version = "=4.0.0-pre.5", default-features = false, features = ["alloc", "digest"] } -serde = { version = "1", optional = true, features = ["derive"] } -zeroize = "1.5" hashbrown = "0.12.0" +hex = { version = "0.4", default-features = false, features = ["alloc"] } +rand_core = "0.6" +serde = { version = "1", optional = true, features = ["derive"] } +sha2 = { version = "0.10", default-features = false } +zeroize = { version = "1.5", features = [ "zeroize_derive" ] } [dev-dependencies] rand = "0.8" diff --git a/src/signing_key.rs b/src/signing_key.rs index 382a1ab..0074072 100644 --- a/src/signing_key.rs +++ b/src/signing_key.rs @@ -3,13 +3,14 @@ use core::convert::TryFrom; use curve25519_dalek::{constants, digest::Update, scalar::Scalar}; use rand_core::{CryptoRng, RngCore}; use sha2::{Digest, Sha512}; +use zeroize::Zeroize; use crate::{Error, Signature, VerificationKey, VerificationKeyBytes}; /// An Ed25519 signing key. /// /// This is also called a secret key by other implementations. -#[derive(Copy, Clone)] +#[derive(Copy, Clone, Zeroize)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serde", serde(from = "SerdeHelper"))] #[cfg_attr(feature = "serde", serde(into = "SerdeHelper"))] @@ -103,13 +104,6 @@ impl From<[u8; 32]> for SigningKey { } } -impl zeroize::Zeroize for SigningKey { - fn zeroize(&mut self) { - self.seed.zeroize(); - self.s.zeroize() - } -} - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] struct SerdeHelper([u8; 32]); diff --git a/src/verification_key.rs b/src/verification_key.rs index 21c4382..09a855f 100644 --- a/src/verification_key.rs +++ b/src/verification_key.rs @@ -7,6 +7,7 @@ use curve25519_dalek::{ traits::IsIdentity, }; use sha2::Sha512; +use zeroize::DefaultIsZeroes; use crate::{Error, Signature}; @@ -112,6 +113,20 @@ impl AsRef<[u8]> for VerificationKey { } } +impl Default for VerificationKey { + fn default() -> VerificationKey { + let identity: EdwardsPoint = Default::default(); + let identity_bytes = identity.compress().to_bytes(); + + VerificationKey { + A_bytes: VerificationKeyBytes::from(identity_bytes), + minus_A: -identity, + } + } +} + +impl DefaultIsZeroes for VerificationKey {} + impl From for [u8; 32] { fn from(vk: VerificationKey) -> [u8; 32] { vk.A_bytes.0