Skip to content

Commit f2a32e6

Browse files
committed
fix(keys): return secret bytes for single descriptor keys
1 parent 2bc55e4 commit f2a32e6

2 files changed

Lines changed: 25 additions & 5 deletions

File tree

bdk-ffi/src/keys.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -266,15 +266,17 @@ impl DescriptorSecretKey {
266266
pub fn secret_bytes(&self) -> Vec<u8> {
267267
let inner = &self.0;
268268
let secret_bytes: Vec<u8> = match inner {
269-
BdkDescriptorSecretKey::Single(_) => {
270-
unreachable!()
269+
BdkDescriptorSecretKey::Single(single_key) => {
270+
single_key.key.inner.secret_bytes().to_vec()
271271
}
272272
BdkDescriptorSecretKey::XPrv(descriptor_x_key) => {
273273
descriptor_x_key.xkey.private_key.secret_bytes().to_vec()
274274
}
275-
BdkDescriptorSecretKey::MultiXPrv(_) => {
276-
unreachable!()
277-
}
275+
BdkDescriptorSecretKey::MultiXPrv(descriptor_multi_x_key) => descriptor_multi_x_key
276+
.xkey
277+
.private_key
278+
.secret_bytes()
279+
.to_vec(),
278280
};
279281

280282
secret_bytes

bdk-ffi/src/tests/keys.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::bitcoin::NetworkKind;
22
use crate::error::DescriptorKeyError;
33
use crate::keys::{DerivationPath, DescriptorPublicKey, DescriptorSecretKey, Mnemonic};
44
use crate::types::WildcardType;
5+
use bdk_wallet::bitcoin::PrivateKey as BdkPrivateKey;
56
use std::sync::Arc;
67

78
fn get_inner() -> DescriptorSecretKey {
@@ -93,6 +94,23 @@ fn test_from_str_inner() {
9394
assert!(DescriptorSecretKey::from_string(key0.to_string()).is_err());
9495
}
9596

97+
#[test]
98+
fn test_secret_bytes_from_single_and_multipath_keys() {
99+
let wif = "L2wTu6hQrnDMiFNWA5na6jB12ErGQqtXwqpSL7aWquJaZG8Ai3ch";
100+
let single_key = DescriptorSecretKey::from_string(wif.to_string()).unwrap();
101+
let expected_single_bytes = BdkPrivateKey::from_wif(wif)
102+
.unwrap()
103+
.inner
104+
.secret_bytes()
105+
.to_vec();
106+
assert_eq!(single_key.secret_bytes(), expected_single_bytes);
107+
108+
let base_xprv = "tprv8ZgxMBicQKsPcwcD4gSnMti126ZiETsuX7qwrtMypr6FBwAP65puFn4v6c3jrN9VwtMRMph6nyT63NrfUL4C3nBzPcduzVSuHD7zbX2JKVc";
109+
let multipath_key = DescriptorSecretKey::from_string(format!("{base_xprv}/<0;1>/*")).unwrap();
110+
let base_key = DescriptorSecretKey::from_string(base_xprv.to_string()).unwrap();
111+
assert_eq!(multipath_key.secret_bytes(), base_key.secret_bytes());
112+
}
113+
96114
#[test]
97115
fn test_derive_and_extend_inner() {
98116
let master_dsk = get_inner();

0 commit comments

Comments
 (0)