From d353be45462e46a0d430224ae93aaa6d15488058 Mon Sep 17 00:00:00 2001 From: Jose Storopoli Date: Sun, 12 May 2024 08:49:14 +0000 Subject: [PATCH] bip32: derive_xpriv should not return a Result --- bitcoin/examples/bip32.rs | 2 +- bitcoin/examples/ecdsa-psbt.rs | 4 ++-- bitcoin/examples/taproot-psbt.rs | 10 +++++----- bitcoin/src/bip32.rs | 22 +++++++++------------- bitcoin/src/psbt/mod.rs | 6 +++--- bitcoin/tests/bip_174.rs | 3 +-- 6 files changed, 21 insertions(+), 26 deletions(-) diff --git a/bitcoin/examples/bip32.rs b/bitcoin/examples/bip32.rs index 901793edf..8b15ba523 100644 --- a/bitcoin/examples/bip32.rs +++ b/bitcoin/examples/bip32.rs @@ -41,7 +41,7 @@ fn main() { // derive child xpub let path = DerivationPath::from_str("84h/0h/0h").unwrap(); - let child = root.derive_priv(&secp, &path).unwrap(); + let child = root.derive_priv(&secp, &path); println!("Child at {}: {}", path, child); let xpub = Xpub::from_priv(&secp, &child); println!("Public key at {}: {}", path, xpub); diff --git a/bitcoin/examples/ecdsa-psbt.rs b/bitcoin/examples/ecdsa-psbt.rs index 428461a9a..93631fcca 100644 --- a/bitcoin/examples/ecdsa-psbt.rs +++ b/bitcoin/examples/ecdsa-psbt.rs @@ -116,11 +116,11 @@ impl ColdStorage { // Hardened children require secret data to derive. let path = "84h/0h/0h".into_derivation_path()?; - let account_0_xpriv = master_xpriv.derive_priv(secp, &path)?; + let account_0_xpriv = master_xpriv.derive_priv(secp, &path); let account_0_xpub = Xpub::from_priv(secp, &account_0_xpriv); let path = INPUT_UTXO_DERIVATION_PATH.into_derivation_path()?; - let input_xpriv = master_xpriv.derive_priv(secp, &path)?; + let input_xpriv = master_xpriv.derive_priv(secp, &path); let input_xpub = Xpub::from_priv(secp, &input_xpriv); let wallet = ColdStorage { master_xpriv, master_xpub }; diff --git a/bitcoin/examples/taproot-psbt.rs b/bitcoin/examples/taproot-psbt.rs index b5db05ab8..1b6d59c13 100644 --- a/bitcoin/examples/taproot-psbt.rs +++ b/bitcoin/examples/taproot-psbt.rs @@ -296,7 +296,7 @@ fn generate_bip86_key_spend_tx( .get(&input.tap_internal_key.ok_or("Internal key missing in PSBT")?) .ok_or("Missing taproot key origin")?; - let secret_key = master_xpriv.derive_priv(secp, &derivation_path)?.to_priv().inner; + let secret_key = master_xpriv.derive_priv(secp, &derivation_path).to_priv().inner; sign_psbt_taproot( &secret_key, input.tap_internal_key.unwrap(), @@ -391,7 +391,7 @@ impl BenefactorWallet { // that we use an unhardened path so we can make use of xpubs. let derivation_path = DerivationPath::from_str(&format!("101/1/0/0/{}", self.next))?; let internal_keypair = - self.master_xpriv.derive_priv(&self.secp, &derivation_path)?.to_keypair(&self.secp); + self.master_xpriv.derive_priv(&self.secp, &derivation_path).to_keypair(&self.secp); let beneficiary_key = self.beneficiary_xpub.derive_pub(&self.secp, &derivation_path)?.to_x_only_pub(); @@ -481,7 +481,7 @@ impl BenefactorWallet { DerivationPath::from_str(&format!("101/1/0/0/{}", self.next))?; let new_internal_keypair = self .master_xpriv - .derive_priv(&self.secp, &new_derivation_path)? + .derive_priv(&self.secp, &new_derivation_path) .to_keypair(&self.secp); let beneficiary_key = self.beneficiary_xpub.derive_pub(&self.secp, &new_derivation_path)?.to_x_only_pub(); @@ -530,7 +530,7 @@ impl BenefactorWallet { .get(&input.tap_internal_key.ok_or("Internal key missing in PSBT")?) .ok_or("Missing taproot key origin")?; let secret_key = - self.master_xpriv.derive_priv(&self.secp, &derivation_path)?.to_priv().inner; + self.master_xpriv.derive_priv(&self.secp, &derivation_path).to_priv().inner; sign_psbt_taproot( &secret_key, spend_info.internal_key(), @@ -651,7 +651,7 @@ impl BeneficiaryWallet { &psbt.inputs[0].tap_key_origins.clone() { let secret_key = - self.master_xpriv.derive_priv(&self.secp, &derivation_path)?.to_priv().inner; + self.master_xpriv.derive_priv(&self.secp, &derivation_path).to_priv().inner; for lh in leaf_hashes { let sighash_type = TapSighashType::All; let hash = SighashCache::new(&unsigned_tx).taproot_script_spend_signature_hash( diff --git a/bitcoin/src/bip32.rs b/bitcoin/src/bip32.rs index a913e44d4..dd6855077 100644 --- a/bitcoin/src/bip32.rs +++ b/bitcoin/src/bip32.rs @@ -583,27 +583,23 @@ impl Xpriv { .expect("BIP32 internal private key representation is broken") } - /// Attempts to derive an extended private key from a path. + /// Derives an extended private key from a path. /// /// The `path` argument can be both of type `DerivationPath` or `Vec`. pub fn derive_priv>( &self, secp: &Secp256k1, path: &P, - ) -> Result { + ) -> Xpriv { let mut sk: Xpriv = *self; for cnum in path.as_ref() { - sk = sk.ckd_priv(secp, *cnum)?; + sk = sk.ckd_priv(secp, *cnum) } - Ok(sk) + sk } /// Private->Private child key derivation - fn ckd_priv( - &self, - secp: &Secp256k1, - i: ChildNumber, - ) -> Result { + fn ckd_priv(&self, secp: &Secp256k1, i: ChildNumber) -> Xpriv { let mut hmac_engine: HmacEngine = HmacEngine::new(&self.chain_code[..]); match i { ChildNumber::Normal { .. } => { @@ -626,14 +622,14 @@ impl Xpriv { let tweaked = sk.add_tweak(&self.private_key.into()).expect("statistically impossible to hit"); - Ok(Xpriv { + Xpriv { network: self.network, depth: self.depth + 1, parent_fingerprint: self.fingerprint(secp), child_number: i, private_key: tweaked, chain_code: ChainCode::from_hmac(hmac_result), - }) + } } /// Decoding extended private key from binary data according to BIP 32 @@ -1001,7 +997,7 @@ mod tests { let mut pk = Xpub::from_priv(secp, &sk); // Check derivation convenience method for Xpriv - assert_eq!(&sk.derive_priv(secp, &path).unwrap().to_string()[..], expected_sk); + assert_eq!(&sk.derive_priv(secp, &path).to_string()[..], expected_sk); // Check derivation convenience method for Xpub, should error // appropriately if any ChildNumber is hardened @@ -1013,7 +1009,7 @@ mod tests { // Derive keys, checking hardened and non-hardened derivation one-by-one for &num in path.0.iter() { - sk = sk.ckd_priv(secp, num).unwrap(); + sk = sk.ckd_priv(secp, num); match num { Normal { .. } => { let pk2 = pk.ckd_pub(secp, num).unwrap(); diff --git a/bitcoin/src/psbt/mod.rs b/bitcoin/src/psbt/mod.rs index 3d428fdac..667719ec2 100644 --- a/bitcoin/src/psbt/mod.rs +++ b/bitcoin/src/psbt/mod.rs @@ -762,7 +762,7 @@ impl GetKey for Xpriv { KeyRequest::Pubkey(_) => Err(GetKeyError::NotSupported), KeyRequest::Bip32((fingerprint, path)) => { let key = if self.fingerprint(secp) == fingerprint { - let k = self.derive_priv(secp, &path)?; + let k = self.derive_priv(secp, &path); Some(k.to_priv()) } else { None @@ -808,7 +808,7 @@ impl GetKey for $set { KeyRequest::Bip32((fingerprint, path)) => { for xpriv in self.iter() { if xpriv.parent_fingerprint == fingerprint { - let k = xpriv.derive_priv(secp, &path)?; + let k = xpriv.derive_priv(secp, &path); return Ok(Some(k.to_priv())); } } @@ -1366,7 +1366,7 @@ mod tests { ChildNumber::from_normal_idx(31337).unwrap(), ]; - sk = sk.derive_priv(secp, &dpath).unwrap(); + sk = sk.derive_priv(secp, &dpath); let pk = Xpub::from_priv(secp, &sk); diff --git a/bitcoin/tests/bip_174.rs b/bitcoin/tests/bip_174.rs index fa32a0ced..522360c65 100644 --- a/bitcoin/tests/bip_174.rs +++ b/bitcoin/tests/bip_174.rs @@ -317,8 +317,7 @@ fn parse_and_verify_keys( let path = derivation_path.into_derivation_path().expect("failed to convert derivation path"); - let derived_priv = - ext_priv.derive_priv(secp, &path).expect("failed to derive ext priv key").to_priv(); + let derived_priv = ext_priv.derive_priv(secp, &path).to_priv(); assert_eq!(wif_priv, derived_priv); let derived_pub = derived_priv.public_key(secp); key_map.insert(derived_pub, derived_priv);