From f92b45db6a235a67287e96278a43684d09d6b7c5 Mon Sep 17 00:00:00 2001 From: thunderbiscuit Date: Mon, 26 Sep 2022 10:36:40 -0400 Subject: [PATCH 1/4] Add ability to retrieve private keys as bytes This feature is needed for compatibility with LDKLite, where the initial entropy given to LDK is the private key of the root of the BIP32 derivation tree. Closes #188 --- CHANGELOG.md | 4 ++++ src/bdk.udl | 2 ++ src/lib.rs | 16 ++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 721b0c31..cb2553ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +- APIs Added + - Add ability to retrieve any private key inside a descriptor as bytes [#199] + +[#199]: https://github.com/bitcoindevkit/bdk-ffi/pull/199 ## [v0.9.0] - Breaking Changes diff --git a/src/bdk.udl b/src/bdk.udl index e9950801..f1a44291 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -283,6 +283,8 @@ interface DescriptorSecretKey { DescriptorPublicKey as_public(); + sequence secret_key_bytes(); + string as_string(); }; diff --git a/src/lib.rs b/src/lib.rs index 8f772ca4..c7d9972d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -907,6 +907,22 @@ impl DescriptorSecretKey { }) } + /// Get the private key as bytes. + fn secret_key_bytes(&self) -> Vec { + let descriptor_secret_key = self.descriptor_secret_key_mutex.lock().unwrap(); + let secret_key_bytes: Vec = match descriptor_secret_key.deref() { + BdkDescriptorSecretKey::XPrv(descriptor_x_key) => { + descriptor_x_key.xkey.private_key.secret_bytes().to_vec() + } + BdkDescriptorSecretKey::SinglePriv(descriptor_x_key) => { + // unreachable!() + descriptor_x_key.key.inner.secret_bytes().to_vec() + } + }; + + secret_key_bytes + } + fn as_string(&self) -> String { self.descriptor_secret_key_mutex.lock().unwrap().to_string() } From 1dd6f2d9f8dd6fc7e21a21691532146af2dbe620 Mon Sep 17 00:00:00 2001 From: thunderbiscuit Date: Mon, 26 Sep 2022 11:01:46 -0400 Subject: [PATCH 2/4] Add test for DescriptorSecretKey.secret_key_bytes() --- src/lib.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c7d9972d..04edabf2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -914,9 +914,8 @@ impl DescriptorSecretKey { BdkDescriptorSecretKey::XPrv(descriptor_x_key) => { descriptor_x_key.xkey.private_key.secret_bytes().to_vec() } - BdkDescriptorSecretKey::SinglePriv(descriptor_x_key) => { - // unreachable!() - descriptor_x_key.key.inner.secret_bytes().to_vec() + BdkDescriptorSecretKey::SinglePriv(_) => { + unreachable!() } }; @@ -1147,4 +1146,14 @@ mod test { let derived_dpk = &derive_dpk(&master_dpk, "m/84h/1h/0h"); assert!(derived_dpk.is_err()); } + + #[test] + fn test_retrieve_master_secret_key() { + let master_dpk = get_descriptor_secret_key(); + let master_private_key = master_dpk.secret_key_bytes().to_hex(); + assert_eq!( + master_private_key, + "e93315d6ce401eb4db803a56232f0ed3e69b053774e6047df54f1bd00e5ea936" + ) + } } From 6f5e621561c096cbc17364edd389d2d5967849e9 Mon Sep 17 00:00:00 2001 From: thunderbiscuit Date: Thu, 29 Sep 2022 15:26:30 -0400 Subject: [PATCH 3/4] Remove changelog entry to follow workflow defined in #202 --- CHANGELOG.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb2553ac..721b0c31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] -- APIs Added - - Add ability to retrieve any private key inside a descriptor as bytes [#199] - -[#199]: https://github.com/bitcoindevkit/bdk-ffi/pull/199 ## [v0.9.0] - Breaking Changes From 1cc9afaeb3fb848ec7d87a194405a9fb6cf6d624 Mon Sep 17 00:00:00 2001 From: thunderbiscuit Date: Fri, 30 Sep 2022 19:32:08 -0400 Subject: [PATCH 4/4] Rename DescriptorSecretKey.secret_bytes() to mirror upstream API --- src/bdk.udl | 2 +- src/lib.rs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bdk.udl b/src/bdk.udl index f1a44291..d6232500 100644 --- a/src/bdk.udl +++ b/src/bdk.udl @@ -283,7 +283,7 @@ interface DescriptorSecretKey { DescriptorPublicKey as_public(); - sequence secret_key_bytes(); + sequence secret_bytes(); string as_string(); }; diff --git a/src/lib.rs b/src/lib.rs index 04edabf2..7f77ab76 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -908,9 +908,9 @@ impl DescriptorSecretKey { } /// Get the private key as bytes. - fn secret_key_bytes(&self) -> Vec { + fn secret_bytes(&self) -> Vec { let descriptor_secret_key = self.descriptor_secret_key_mutex.lock().unwrap(); - let secret_key_bytes: Vec = match descriptor_secret_key.deref() { + let secret_bytes: Vec = match descriptor_secret_key.deref() { BdkDescriptorSecretKey::XPrv(descriptor_x_key) => { descriptor_x_key.xkey.private_key.secret_bytes().to_vec() } @@ -919,7 +919,7 @@ impl DescriptorSecretKey { } }; - secret_key_bytes + secret_bytes } fn as_string(&self) -> String { @@ -1150,7 +1150,7 @@ mod test { #[test] fn test_retrieve_master_secret_key() { let master_dpk = get_descriptor_secret_key(); - let master_private_key = master_dpk.secret_key_bytes().to_hex(); + let master_private_key = master_dpk.secret_bytes().to_hex(); assert_eq!( master_private_key, "e93315d6ce401eb4db803a56232f0ed3e69b053774e6047df54f1bd00e5ea936"