Skip to content

Commit cfae666

Browse files
ovitrifclaude
andcommitted
fix: derive lnurl auth from app seed path
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1883571 commit cfae666

3 files changed

Lines changed: 21 additions & 23 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "vss-rust-client-ffi"
3-
version = "0.5.4"
3+
version = "0.5.5"
44
edition = "2021"
55
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
66

src/implementation.rs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -151,25 +151,28 @@ impl VssClient {
151151
) -> Result<Self, VssError> {
152152
let secp = Secp256k1::new();
153153

154-
// Derive LDK keys from full 64-byte seed (matching ldk-node's key derivation)
155-
let ldk_master_xprv =
156-
Xpriv::new_master(Network::Bitcoin, &seed).map_err(|e| VssError::ConnectionError {
157-
error_details: format!("Failed to create master key: {}", e),
154+
// Derive app keys from truncated 32-byte seed (backward compatible with v0.4.0)
155+
let truncated_seed: [u8; 32] = seed[..32].try_into().unwrap();
156+
let app_master_xprv =
157+
Xpriv::new_master(Network::Bitcoin, &truncated_seed).map_err(|e| {
158+
VssError::ConnectionError {
159+
error_details: format!("Failed to create app master key: {}", e),
160+
}
158161
})?;
159-
160-
let ldk_vss_xprv = ldk_master_xprv
162+
let app_vss_xprv = app_master_xprv
161163
.derive_priv(
162164
&secp,
163165
&[ChildNumber::Hardened {
164166
index: VSS_HARDENED_CHILD_INDEX,
165167
}],
166168
)
167169
.map_err(|e| VssError::ConnectionError {
168-
error_details: format!("Failed to derive VSS key: {}", e),
170+
error_details: format!("Failed to derive app VSS key: {}", e),
169171
})?;
172+
let app_vss_seed_bytes: [u8; 32] = app_vss_xprv.private_key.secret_bytes();
170173

171-
// LNURL auth uses the full seed derivation path
172-
let lnurl_auth_xprv = ldk_vss_xprv
174+
// LNURL auth from app path (matches v0.4.0 server identity)
175+
let lnurl_auth_xprv = app_vss_xprv
173176
.derive_priv(
174177
&secp,
175178
&[ChildNumber::Hardened {
@@ -188,27 +191,22 @@ impl VssClient {
188191

189192
let header_provider = Arc::new(lnurl_auth_jwt_provider);
190193

191-
let ldk_vss_seed_bytes: [u8; 32] = ldk_vss_xprv.private_key.secret_bytes();
192-
193-
// Derive app keys from truncated 32-byte seed (backward compatible with old app version)
194-
let truncated_seed: [u8; 32] = seed[..32].try_into().unwrap();
195-
let app_master_xprv =
196-
Xpriv::new_master(Network::Bitcoin, &truncated_seed).map_err(|e| {
197-
VssError::ConnectionError {
198-
error_details: format!("Failed to create app master key: {}", e),
199-
}
194+
// Derive LDK keys from full 64-byte seed (matching ldk-node's key derivation)
195+
let ldk_master_xprv =
196+
Xpriv::new_master(Network::Bitcoin, &seed).map_err(|e| VssError::ConnectionError {
197+
error_details: format!("Failed to create LDK master key: {}", e),
200198
})?;
201-
let app_vss_xprv = app_master_xprv
199+
let ldk_vss_xprv = ldk_master_xprv
202200
.derive_priv(
203201
&secp,
204202
&[ChildNumber::Hardened {
205203
index: VSS_HARDENED_CHILD_INDEX,
206204
}],
207205
)
208206
.map_err(|e| VssError::ConnectionError {
209-
error_details: format!("Failed to derive app VSS key: {}", e),
207+
error_details: format!("Failed to derive LDK VSS key: {}", e),
210208
})?;
211-
let app_vss_seed_bytes: [u8; 32] = app_vss_xprv.private_key.secret_bytes();
209+
let ldk_vss_seed_bytes: [u8; 32] = ldk_vss_xprv.private_key.secret_bytes();
212210

213211
Self::new_with_header_provider(
214212
base_url,

0 commit comments

Comments
 (0)