Skip to content

Commit f9739c7

Browse files
committed
core: add zeroize dep
1 parent 8eb9616 commit f9739c7

File tree

4 files changed

+37
-17
lines changed

4 files changed

+37
-17
lines changed

Cargo.lock

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

keechain-core/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ default = ["sysinfo"]
1616
[dependencies]
1717
aes = "0.8"
1818
bdk = { git = "https://github.com/bitcoindevkit/bdk", rev = "417963f16882945423b8a8b6b33a507f8d4888a3", default-features = false, features = ["std"] }
19-
bip39 = "2.0"
19+
bip39 = { version = "2.0", default-features = false, features = ["std", "zeroize"] }
2020
cbc = { version = "0.1", features = ["alloc"] }
2121
chacha20poly1305 = "0.10"
2222
rand_chacha = "0.3"
2323
serde = { version = "1.0", features = ["derive"] }
2424
serde_json = "1.0"
25+
zeroize = { version = "1.5", features = ["derive"] } # bip39 uses version 1.5
2526

2627
[target.'cfg(not(target_vendor = "apple"))'.dependencies]
2728
sysinfo = { version = "0.28", optional = true }

keechain-core/src/types/keychain.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use bdk::bitcoin::secp256k1::{Secp256k1, Signing};
88
use bdk::bitcoin::Network;
99
use serde::de::Deserializer;
1010
use serde::{Deserialize, Serialize};
11+
use zeroize::{Zeroize, ZeroizeOnDrop};
1112

1213
use crate::bips::bip32::{self, Bip32, ExtendedPubKey, Fingerprint};
1314
use crate::bips::bip39::Mnemonic;
@@ -157,17 +158,16 @@ impl EncryptedKeychain {
157158
}
158159
}
159160

160-
#[derive(Deserialize)]
161+
#[derive(Serialize, Deserialize, Zeroize, ZeroizeOnDrop)]
161162
struct KeychainIntermediate {
162163
mnemonic: Mnemonic,
163164
passphrases: Vec<String>,
164165
}
165166

166-
#[derive(Clone, Serialize)]
167+
#[derive(Clone, Zeroize, ZeroizeOnDrop)]
167168
pub struct Keychain {
168169
mnemonic: Mnemonic,
169170
passphrases: Vec<String>,
170-
#[serde(skip_serializing)]
171171
pub seed: Seed,
172172
}
173173

@@ -184,10 +184,16 @@ impl Deref for Keychain {
184184
}
185185
}
186186

187-
impl Drop for Keychain {
188-
fn drop(&mut self) {
189-
self.mnemonic = Mnemonic::from_entropy(b"00000000000000000000000000000000").unwrap();
190-
self.passphrases = Vec::new();
187+
impl Serialize for Keychain {
188+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
189+
where
190+
S: serde::Serializer,
191+
{
192+
let intermediate = KeychainIntermediate {
193+
mnemonic: self.mnemonic.clone(),
194+
passphrases: self.passphrases.clone(),
195+
};
196+
intermediate.serialize(serializer)
191197
}
192198
}
193199

@@ -197,7 +203,10 @@ impl<'de> Deserialize<'de> for Keychain {
197203
D: Deserializer<'de>,
198204
{
199205
let intermediate = KeychainIntermediate::deserialize(deserializer)?;
200-
Ok(Self::new(intermediate.mnemonic, intermediate.passphrases))
206+
Ok(Self::new(
207+
intermediate.mnemonic.clone(),
208+
intermediate.passphrases.clone(),
209+
))
201210
}
202211
}
203212

keechain-core/src/types/seed.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ use core::fmt;
66
use bdk::bitcoin::Network;
77
use bip39::Mnemonic;
88
use serde::{Deserialize, Serialize};
9+
use zeroize::{Zeroize, ZeroizeOnDrop};
910

1011
use crate::bips::bip32::{self, Bip32, ExtendedPrivKey};
1112
use crate::bips::bip85::Bip85;
1213
use crate::descriptors::ToDescriptor;
1314
use crate::util::hex;
1415

15-
#[derive(Clone, Eq, PartialEq, Serialize, Deserialize)]
16+
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, Zeroize, ZeroizeOnDrop)]
1617
pub struct Seed {
1718
mnemonic: Mnemonic,
1819
passphrase: Option<String>,
@@ -24,13 +25,6 @@ impl fmt::Debug for Seed {
2425
}
2526
}
2627

27-
impl Drop for Seed {
28-
fn drop(&mut self) {
29-
self.mnemonic = Mnemonic::from_entropy(b"00000000000000000000000000000000").unwrap();
30-
self.passphrase = None;
31-
}
32-
}
33-
3428
impl Seed {
3529
pub fn new<S>(mnemonic: Mnemonic, passphrase: Option<S>) -> Self
3630
where

0 commit comments

Comments
 (0)