From 415286a8501a346ef20361103da2176209fc1f38 Mon Sep 17 00:00:00 2001 From: benk10 Date: Tue, 29 Apr 2025 11:36:44 +0300 Subject: [PATCH 1/4] Fix/coldcard signing issue ms (#84) * Update bitcoin and async-hwi versions * Fix coldcard signing --- src-tauri/Cargo.lock | 92 +++++++------------------------------------ src-tauri/Cargo.toml | 4 +- src-tauri/src/main.rs | 7 +++- 3 files changed, 22 insertions(+), 81 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 5c317fb..052beb7 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -117,14 +117,13 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-hwi" -version = "0.0.25" +version = "0.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2bf351445dda3f867da2effb866be894cc88f7648a67b93d1f462fde026a6d" +checksum = "e9e928e319430e339a0d6895e42f40fef8eb7d4c47a8f17c35a572a718072e7e" dependencies = [ "async-trait", "bitbox-api", - "bitcoin 0.31.2", - "bitcoin 0.32.5", + "bitcoin", "coldcard", "futures", "hidapi", @@ -288,12 +287,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bech32" -version = "0.10.0-beta" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98f7eed2b2781a6f0b5c903471d48e15f56fb4e1165df8a9a2337fd1a59d45ea" - [[package]] name = "bech32" version = "0.11.0" @@ -308,7 +301,7 @@ checksum = "8349407999d3653dbbd3f75182742a6c8ad73f424ef83fcf5b87ead0c8ce2528" dependencies = [ "async-trait", "base32", - "bitcoin 0.32.5", + "bitcoin", "byteorder", "chrono", "getrandom 0.2.15", @@ -327,23 +320,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "bitcoin" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c85783c2fe40083ea54a33aa2f0ba58831d90fcd190f5bdc47e74e84d2a96ae" -dependencies = [ - "base64 0.21.7", - "bech32 0.10.0-beta", - "bitcoin-internals 0.2.0", - "bitcoin_hashes 0.13.0", - "core2", - "hex-conservative 0.1.2", - "hex_lit", - "secp256k1 0.28.2", - "serde", -] - [[package]] name = "bitcoin" version = "0.32.5" @@ -352,14 +328,14 @@ checksum = "ce6bc65742dea50536e35ad42492b234c27904a27f0abdcbce605015cb4ea026" dependencies = [ "base58ck", "base64 0.21.7", - "bech32 0.11.0", + "bech32", "bitcoin-internals 0.3.0", "bitcoin-io", "bitcoin-units", "bitcoin_hashes 0.14.0", "hex-conservative 0.2.1", "hex_lit", - "secp256k1 0.29.1", + "secp256k1", "serde", ] @@ -368,9 +344,6 @@ name = "bitcoin-internals" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" -dependencies = [ - "serde", -] [[package]] name = "bitcoin-internals" @@ -404,9 +377,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" dependencies = [ "bitcoin-internals 0.2.0", - "core2", "hex-conservative 0.1.2", - "serde", ] [[package]] @@ -773,15 +744,6 @@ dependencies = [ "libc", ] -[[package]] -name = "core2" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239fa3ae9b63c2dc74bd3fa852d4792b8b305ae64eeede946265b6af62f1fff3" -dependencies = [ - "memchr", -] - [[package]] name = "cpufeatures" version = "0.2.16" @@ -1806,9 +1768,6 @@ name = "hex-conservative" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" -dependencies = [ - "core2", -] [[package]] name = "hex-conservative" @@ -2468,7 +2427,7 @@ version = "0.2.2" dependencies = [ "aes-gcm", "async-hwi", - "bitcoin 0.31.2", + "bitcoin", "env_logger", "hex", "log", @@ -2541,12 +2500,12 @@ dependencies = [ [[package]] name = "ledger_bitcoin_client" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8606a9c7375fb139e68fc1ca7cf9c6709566eeca448ff33e37632d8a4302eefe" +checksum = "38bb192e14da7725505c49791fde863bafee2b28dede2f37e05559fe72c29416" dependencies = [ "async-trait", - "bitcoin 0.31.2", + "bitcoin", "miniscript", ] @@ -2706,13 +2665,12 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniscript" -version = "11.2.0" +version = "12.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3127e10529a57a8f7fa9b1332c4c2f72baadaca6777798f910dff3c922620b14" +checksum = "82911d2fb527bb9aacd2446d2f517aff3f8e3846ace1b3c24258b61ea3cce2bc" dependencies = [ - "bech32 0.10.0-beta", - "bitcoin 0.31.2", - "bitcoin-internals 0.2.0", + "bech32", + "bitcoin", ] [[package]] @@ -3978,17 +3936,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "secp256k1" -version = "0.28.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" -dependencies = [ - "bitcoin_hashes 0.13.0", - "secp256k1-sys 0.9.2", - "serde", -] - [[package]] name = "secp256k1" version = "0.29.1" @@ -3996,19 +3943,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ "bitcoin_hashes 0.14.0", - "secp256k1-sys 0.10.1", + "secp256k1-sys", "serde", ] -[[package]] -name = "secp256k1-sys" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb" -dependencies = [ - "cc", -] - [[package]] name = "secp256k1-sys" version = "0.10.1" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 7e3eea4..d6443b4 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -23,8 +23,8 @@ hex = "0.4.3" log = "0.4" thiserror = "1.0" env_logger = "0.10" -bitcoin = { version = "0.31", features = ["serde", "base64"] } -async-hwi = "0.0.25" +bitcoin = { version = "0.32", features = ["serde", "base64"] } +async-hwi = "0.0.27" x25519-dalek = "2.0.1" [features] diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index a22b5fd..1354be7 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -241,6 +241,8 @@ async fn hwi_sign_tx( ) .await?; + let mut psbt_obj = bitcoin::Psbt::from_str(&psbt).map_err(|e| e.to_string())?; + if hwi_state.device_type != HWIDeviceType::Coldcard { let is_registered = device .is_wallet_registered(&wallet_name.clone().unwrap_or_default(), &policy) @@ -274,10 +276,11 @@ async fn hwi_sign_tx( .await?; } } + } else { + // Coldcard change verification gives an error when xpubs are included for Miniscript scheme + psbt_obj.xpub.clear(); } - let mut psbt_obj = bitcoin::Psbt::from_str(&psbt).map_err(|e| e.to_string())?; - device .sign_tx(&mut psbt_obj) .await From d5f3fff6e9bf230be7da01e15ec9578ce161c772 Mon Sep 17 00:00:00 2001 From: benk10 Date: Tue, 29 Apr 2025 11:48:30 +0300 Subject: [PATCH 2/4] Release v0.2.3 (#85) --- package-lock.json | 4 ++-- package.json | 2 +- src-tauri/Cargo.lock | 2 +- src-tauri/Cargo.toml | 2 +- src-tauri/tauri.conf.json | 2 +- src-tauri/tauri.release.conf.json | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2b28b9c..25536da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "keeper-desktop", - "version": "0.2.2", + "version": "0.2.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "keeper-desktop", - "version": "0.2.2", + "version": "0.2.3", "hasInstallScript": true, "dependencies": { "@tanstack/react-query": "^5.52.1", diff --git a/package.json b/package.json index 18eca1d..e4213f2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "keeper-desktop", "private": true, - "version": "0.2.2", + "version": "0.2.3", "type": "module", "scripts": { "dev": "vite", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 052beb7..89f725d 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2423,7 +2423,7 @@ dependencies = [ [[package]] name = "keeper-desktop" -version = "0.2.2" +version = "0.2.3" dependencies = [ "aes-gcm", "async-hwi", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index d6443b4..9403f5b 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "keeper-desktop" -version = "0.2.2" +version = "0.2.3" description = "Bitcoin Keeper Desktop App" authors = ["Ben Kaufman"] repository = "https://github.com/bithyve/keeper-desktop" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 10c34fd..88fa05e 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -7,7 +7,7 @@ }, "package": { "productName": "Keeper Desktop (Dev)", - "version": "0.2.2" + "version": "0.2.3" }, "tauri": { "allowlist": { diff --git a/src-tauri/tauri.release.conf.json b/src-tauri/tauri.release.conf.json index dd389e4..fc0b52e 100644 --- a/src-tauri/tauri.release.conf.json +++ b/src-tauri/tauri.release.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "Keeper Desktop", - "version": "0.2.2" + "version": "0.2.3" }, "tauri": { "allowlist": { From 3aa284b576a80c44258a2a9890ff67e6fb4ea150 Mon Sep 17 00:00:00 2001 From: benk10 Date: Tue, 29 Apr 2025 15:01:06 +0300 Subject: [PATCH 3/4] Fix bitcoin new version derivations (#87) --- src-tauri/src/hwi/interface.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src-tauri/src/hwi/interface.rs b/src-tauri/src/hwi/interface.rs index 59b2121..e84667b 100644 --- a/src-tauri/src/hwi/interface.rs +++ b/src-tauri/src/hwi/interface.rs @@ -145,7 +145,8 @@ impl HWIClient { path: &DerivationPath, expert: bool, ) -> Result { - let output = self.implementation.get_xpub(&path.to_string(), expert)?; + let prefixed_path = format!("m/{}", path); + let output = self.implementation.get_xpub(&prefixed_path, expert)?; deserialize_obj!(&output) } @@ -155,9 +156,8 @@ impl HWIClient { message: &str, path: &DerivationPath, ) -> Result { - let output = self - .implementation - .sign_message(message, &path.to_string())?; + let prefixed_path = format!("m/{}", path); + let output = self.implementation.sign_message(message, &prefixed_path)?; deserialize_obj!(&output) } @@ -183,7 +183,7 @@ impl HWIClient { start: u32, end: u32, ) -> Result, Error> { - let path_str = path.map(|p| p.to_string()); + let path_str = path.map(|p| format!("m/{}/*", p)); let output = self.implementation.get_keypool( keypool, internal, @@ -222,9 +222,10 @@ impl HWIClient { path: &DerivationPath, address_type: HWIAddressType, ) -> Result { + let prefixed_path = format!("m/{}", path); let output = self .implementation - .display_address_with_path(&path.to_string(), address_type)?; + .display_address_with_path(&prefixed_path, address_type)?; deserialize_obj!(&output) } From 8deff96f409bb5694cad0b79aa303adc19f3b939 Mon Sep 17 00:00:00 2001 From: benk10 Date: Tue, 29 Apr 2025 19:07:09 +0300 Subject: [PATCH 4/4] Fix missing m in derivations --- src-tauri/src/device.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/device.rs b/src-tauri/src/device.rs index 40610db..865976e 100644 --- a/src-tauri/src/device.rs +++ b/src-tauri/src/device.rs @@ -30,11 +30,11 @@ pub fn get_xpubs( } Ok(json!({ - "singleSigPath": ss_path.to_string(), + "singleSigPath": format!("m/{}", ss_path.to_string()), "singleSigXpub": single_sig_xpub.to_string(), - "multiSigPath": ms_path.to_string(), + "multiSigPath": format!("m/{}", ms_path.to_string()), "multiSigXpub": multi_sig_xpub.to_string(), - "taprootPath": tr_path.to_string(), + "taprootPath": format!("m/{}", tr_path.to_string()), "taprootXpub": taproot_xpub.to_string(), "mfp": hwi_state.fingerprint.as_ref().unwrap().to_string().to_uppercase(), }))