Skip to content

Commit 75dfcc0

Browse files
authored
Merge pull request #77 from lightningdevkit/debug-seed-rm
Redact seed debug output
2 parents f393ed9 + ecfb115 commit 75dfcc0

2 files changed

Lines changed: 80 additions & 2 deletions

File tree

orange-sdk/src/ffi/orange/config.rs

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::collections::HashMap;
2+
use std::fmt;
23
use std::ops::Deref;
34
use std::path::PathBuf;
45
use std::str::FromStr;
@@ -22,7 +23,7 @@ use crate::logging::LoggerType;
2223
use crate::trusted_wallet::ExtraConfig as OrangeExtraConfig;
2324
use crate::{impl_from_core_type, impl_into_core_type};
2425

25-
#[derive(Debug, Clone, uniffi::Enum)]
26+
#[derive(Clone, uniffi::Enum)]
2627
pub enum Seed {
2728
/// A BIP 39 mnemonic seed.
2829
MnemonicSeed {
@@ -35,6 +36,19 @@ pub enum Seed {
3536
Seed64(Vec<u8>),
3637
}
3738

39+
impl fmt::Debug for Seed {
40+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41+
match self {
42+
Seed::MnemonicSeed { .. } => f
43+
.debug_struct("MnemonicSeed")
44+
.field("mnemonic", &"<redacted>")
45+
.field("passphrase", &"<redacted>")
46+
.finish(),
47+
Seed::Seed64(_) => f.debug_tuple("Seed64").field(&"<redacted>").finish(),
48+
}
49+
}
50+
}
51+
3852
impl TryInto<OrangeSeed> for Seed {
3953
type Error = ConfigError;
4054
fn try_into(self) -> Result<OrangeSeed, Self::Error> {
@@ -310,3 +324,29 @@ impl TryFrom<WalletConfig> for OrangeWalletConfig {
310324
})
311325
}
312326
}
327+
328+
#[cfg(test)]
329+
mod tests {
330+
use super::*;
331+
use crate::ffi::ldk_node::Mnemonic;
332+
333+
#[test]
334+
fn ffi_seed_debug_redacts_seed64_bytes() {
335+
let seed = Seed::Seed64(vec![42; 64]);
336+
337+
assert_eq!(format!("{seed:?}"), "Seed64(\"<redacted>\")");
338+
}
339+
340+
#[test]
341+
fn ffi_seed_debug_redacts_mnemonic_and_passphrase() {
342+
let mnemonic = Arc::new(
343+
Mnemonic::from_entropy(vec![0; 16]).expect("static test entropy should be valid"),
344+
);
345+
let seed = Seed::MnemonicSeed { mnemonic, passphrase: Some("test passphrase".to_owned()) };
346+
let debug = format!("{seed:?}");
347+
348+
assert_eq!(debug, "MnemonicSeed { mnemonic: \"<redacted>\", passphrase: \"<redacted>\" }");
349+
assert!(!debug.contains("abandon"));
350+
assert!(!debug.contains("test passphrase"));
351+
}
352+
}

orange-sdk/src/lib.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ pub struct Wallet {
143143
}
144144

145145
/// Represents the seed used for wallet generation.
146-
#[derive(Debug, Clone)]
146+
#[derive(Clone)]
147147
pub enum Seed {
148148
/// A BIP 39 mnemonic seed.
149149
Mnemonic {
@@ -156,6 +156,19 @@ pub enum Seed {
156156
Seed64([u8; 64]),
157157
}
158158

159+
impl Debug for Seed {
160+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
161+
match self {
162+
Seed::Mnemonic { .. } => f
163+
.debug_struct("Mnemonic")
164+
.field("mnemonic", &"<redacted>")
165+
.field("passphrase", &"<redacted>")
166+
.finish(),
167+
Seed::Seed64(_) => f.debug_tuple("Seed64").field(&"<redacted>").finish(),
168+
}
169+
}
170+
}
171+
159172
impl Seed {
160173
pub(crate) fn to_node_entropy(&self) -> NodeEntropy {
161174
match self {
@@ -1497,3 +1510,28 @@ impl Wallet {
14971510
Ok(())
14981511
}
14991512
}
1513+
1514+
#[cfg(test)]
1515+
mod tests {
1516+
use super::*;
1517+
use ldk_node::bip39::Mnemonic;
1518+
1519+
#[test]
1520+
fn seed_debug_redacts_seed64_bytes() {
1521+
let seed = Seed::Seed64([42; 64]);
1522+
1523+
assert_eq!(format!("{seed:?}"), "Seed64(\"<redacted>\")");
1524+
}
1525+
1526+
#[test]
1527+
fn seed_debug_redacts_mnemonic_and_passphrase() {
1528+
let mnemonic =
1529+
Mnemonic::from_entropy(&[0; 16]).expect("static test entropy should be valid");
1530+
let seed = Seed::Mnemonic { mnemonic, passphrase: Some("test passphrase".to_owned()) };
1531+
let debug = format!("{seed:?}");
1532+
1533+
assert_eq!(debug, "Mnemonic { mnemonic: \"<redacted>\", passphrase: \"<redacted>\" }");
1534+
assert!(!debug.contains("abandon"));
1535+
assert!(!debug.contains("test passphrase"));
1536+
}
1537+
}

0 commit comments

Comments
 (0)