Skip to content

Commit

Permalink
zeroize Key and derived keys upon drop
Browse files Browse the repository at this point in the history
refs #63
  • Loading branch information
warner committed Feb 6, 2020
1 parent 8f72cf1 commit 9bc4e50
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 5 deletions.
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ hex = "0.4"
rand = "0.7"
regex = "1.0"
log = "0.4"
zeroize = { version = "1.1", features = ["zeroize_derive"] }

# for "io_blocking" feature
ws = { version = "0.9", optional = true }
Expand Down
4 changes: 3 additions & 1 deletion src/core/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use super::api::{APIAction, IOAction, Mood};
use super::timing::TimingLogEvent;
use super::util::maybe_utf8;
use crate::core::util::random_bytes;
use zeroize::Zeroize;

pub use super::wordlist::Wordlist;

Expand All @@ -23,7 +24,8 @@ impl<'a> From<&'a str> for AppID {
}
}

#[derive(PartialEq, Eq, Clone)]
#[derive(PartialEq, Eq, Clone, Zeroize)]
#[zeroize(drop)]
pub struct Key(pub Vec<u8>);
impl Deref for Key {
type Target = Vec<u8>;
Expand Down
8 changes: 6 additions & 2 deletions src/core/receive.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use super::events::{Events, Key, Phase, TheirSide};
use super::key;
use log::trace;
use zeroize::Zeroize;

// we process these
use super::events::ReceiveEvent;
// we emit these
Expand Down Expand Up @@ -104,8 +106,10 @@ impl ReceiveMachine {
phase: &Phase,
body: &[u8],
) -> Option<Vec<u8>> {
let data_key = key::derive_phase_key(&side, &key, &phase);
key::decrypt_data(&data_key, body)
let mut data_key = key::derive_phase_key(&side, &key, &phase);
let data = key::decrypt_data(&data_key, body);
data_key.zeroize();
data
}
}

Expand Down
7 changes: 5 additions & 2 deletions src/core/send.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use super::events::{Events, Key, MySide, Phase};
use super::key;
use log::trace;
use zeroize::Zeroize;
// we process these
use super::events::SendEvent;
// we emit these
Expand Down Expand Up @@ -42,10 +43,11 @@ impl SendMachine {
match event {
GotVerifiedKey(ref key) => {
for (phase, plaintext) in self.queue.drain(..) {
let data_key =
let mut data_key =
key::derive_phase_key(&self.side, &key, &phase);
let (_nonce, encrypted) =
key::encrypt_data(&data_key, &plaintext);
data_key.zeroize();
actions.push(M_AddMessage(phase, encrypted));
}
S1HaveVerifiedKey(key.clone())
Expand All @@ -61,10 +63,11 @@ impl SendMachine {
S1HaveVerifiedKey(ref key) => match event {
GotVerifiedKey(_) => panic!(),
Send(phase, plaintext) => {
let data_key =
let mut data_key =
key::derive_phase_key(&self.side, &key, &phase);
let (_nonce, encrypted) =
key::encrypt_data(&data_key, &plaintext);
data_key.zeroize();
actions.push(M_AddMessage(phase, encrypted));
S1HaveVerifiedKey(key.clone())
}
Expand Down

0 comments on commit 9bc4e50

Please sign in to comment.