From 69c6eb61737d0bbd05df58727c414104a7b59170 Mon Sep 17 00:00:00 2001 From: sanket1729 Date: Wed, 16 Feb 2022 23:45:35 -0800 Subject: [PATCH] Bug: Change type of pbst partial sig from secp key to bitcoin key This changes the type of secp signature from secp256k1::Signature to bitcoin::PublicKey. Psbt allows storing signatures for both compressed as well as uncompressed keys. This bug was introduced in #591 while trying to change the type of BIP32 keys from bitcoin::PublicKey to secp256k1::PublicKey. --- src/util/psbt/map/input.rs | 5 +++-- src/util/psbt/serialize.rs | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/util/psbt/map/input.rs b/src/util/psbt/map/input.rs index 97473839..34fd18dd 100644 --- a/src/util/psbt/map/input.rs +++ b/src/util/psbt/map/input.rs @@ -28,6 +28,7 @@ use util::psbt::map::Map; use util::psbt::raw; use util::psbt::serialize::Deserialize; use util::psbt::{Error, error}; +use util::key::PublicKey; use util::taproot::{ControlBlock, LeafVersion, TapLeafHash, TapBranchHash}; use util::sighash; @@ -89,7 +90,7 @@ pub struct Input { pub witness_utxo: Option, /// A map from public keys to their corresponding signature as would be /// pushed to the stack from a scriptSig or witness for a non-taproot inputs. - pub partial_sigs: BTreeMap, + pub partial_sigs: BTreeMap, /// The sighash type to be used for this input. Signatures for this input /// must use the sighash type. pub sighash_type: Option, @@ -209,7 +210,7 @@ impl Input { } PSBT_IN_PARTIAL_SIG => { impl_psbt_insert_pair! { - self.partial_sigs <= | + self.partial_sigs <= | } } PSBT_IN_SIGHASH_TYPE => { diff --git a/src/util/psbt/serialize.rs b/src/util/psbt/serialize.rs index f11d4e86..0ee01fdf 100644 --- a/src/util/psbt/serialize.rs +++ b/src/util/psbt/serialize.rs @@ -33,6 +33,7 @@ use util::ecdsa::{EcdsaSig, EcdsaSigError}; use util::psbt; use util::taproot::{TapBranchHash, TapLeafHash, ControlBlock, LeafVersion}; use schnorr; +use util::key::PublicKey; use super::map::{TapTree, PsbtSigHashType}; @@ -75,6 +76,21 @@ impl Deserialize for Script { } } +impl Serialize for PublicKey { + fn serialize(&self) -> Vec { + let mut buf = Vec::new(); + self.write_into(&mut buf).expect("vecs don't error"); + buf + } +} + +impl Deserialize for PublicKey { + fn deserialize(bytes: &[u8]) -> Result { + PublicKey::from_slice(bytes) + .map_err(|_| encode::Error::ParseFailed("invalid public key")) + } +} + impl Serialize for secp256k1::PublicKey { fn serialize(&self) -> Vec { self.serialize().to_vec()