Skip to content

Commit 7158d34

Browse files
committed
Use bitcoin::SchnorrSig type from rust-bitcoin
1 parent 4a3e1ab commit 7158d34

File tree

2 files changed

+97
-0
lines changed

2 files changed

+97
-0
lines changed

src/interpreter/error.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ pub enum Error {
3737
IncorrectWScriptHash,
3838
/// MultiSig missing at least `1` witness elements out of `k + 1` required
3939
InsufficientSignaturesMultiSig,
40+
/// Invalid Sighash type
41+
InvalidSchnorrSigHashType(Vec<u8>),
4042
/// Signature failed to verify
4143
InvalidSignature(bitcoin::PublicKey),
4244
/// Last byte of this signature isn't a standard sighash type
@@ -138,6 +140,13 @@ impl fmt::Display for Error {
138140
}
139141
Error::IncorrectWScriptHash => f.write_str("witness script did not match scriptpubkey"),
140142
Error::InsufficientSignaturesMultiSig => f.write_str("Insufficient signatures for CMS"),
143+
Error::InvalidSchnorrSigHashType(ref sig) => {
144+
write!(
145+
f,
146+
"Invalid sighash type for schnorr signature '{}'",
147+
sig.to_hex()
148+
)
149+
}
141150
Error::InvalidSignature(pk) => write!(f, "bad signature with pk {}", pk),
142151
Error::NonStandardSigHash(ref sig) => {
143152
write!(

src/miniscript/satisfy.rs

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
4646
None
4747
}
4848

49+
/// Given a public key, look up an schnorr signature with that key
50+
fn lookup_schnorr_sig(&self, _: &Pk) -> Option<bitcoin::SchnorrSig> {
51+
None
52+
}
53+
4954
/// Given a `Pkh`, lookup corresponding `Pk`
5055
fn lookup_pkh_pk(&self, _: &Pk::Hash) -> Option<Pk> {
5156
None
@@ -59,6 +64,17 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
5964
None
6065
}
6166

67+
/// Given a keyhash, look up the schnorr signature and the associated key
68+
/// Even if signatures for public key Hashes are not available, the users
69+
/// can use this map to provide pkh -> pk mapping which can be useful
70+
/// for dissatisfying pkh.
71+
fn lookup_pkh_schnorr_sig(
72+
&self,
73+
_: &Pk::Hash,
74+
) -> Option<(bitcoin::PublicKey, bitcoin::SchnorrSig)> {
75+
None
76+
}
77+
6278
/// Given a SHA256 hash, look up its preimage
6379
fn lookup_sha256(&self, _: sha256::Hash) -> Option<Preimage32> {
6480
None
@@ -139,6 +155,12 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for HashMap<Pk, bitcoin::Ecd
139155
}
140156
}
141157

158+
impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for HashMap<Pk, bitcoin::SchnorrSig> {
159+
fn lookup_schnorr_sig(&self, key: &Pk) -> Option<bitcoin::SchnorrSig> {
160+
self.get(key).map(|x| *x)
161+
}
162+
}
163+
142164
impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for HashMap<Pk::Hash, (Pk, bitcoin::EcdsaSig)>
143165
where
144166
Pk: MiniscriptKey + ToPublicKey,
@@ -160,11 +182,36 @@ where
160182
}
161183
}
162184

185+
impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for HashMap<Pk::Hash, (Pk, bitcoin::SchnorrSig)>
186+
where
187+
Pk: MiniscriptKey + ToPublicKey,
188+
{
189+
fn lookup_schnorr_sig(&self, key: &Pk) -> Option<bitcoin::SchnorrSig> {
190+
self.get(&key.to_pubkeyhash()).map(|x| x.1)
191+
}
192+
193+
fn lookup_pkh_pk(&self, pk_hash: &Pk::Hash) -> Option<Pk> {
194+
self.get(pk_hash).map(|x| x.0.clone())
195+
}
196+
197+
fn lookup_pkh_schnorr_sig(
198+
&self,
199+
pk_hash: &Pk::Hash,
200+
) -> Option<(bitcoin::PublicKey, bitcoin::SchnorrSig)> {
201+
self.get(pk_hash)
202+
.map(|&(ref pk, sig)| (pk.to_public_key(), sig))
203+
}
204+
}
205+
163206
impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'a S {
164207
fn lookup_ec_sig(&self, p: &Pk) -> Option<bitcoin::EcdsaSig> {
165208
(**self).lookup_ec_sig(p)
166209
}
167210

211+
fn lookup_schnorr_sig(&self, p: &Pk) -> Option<bitcoin::SchnorrSig> {
212+
(**self).lookup_schnorr_sig(p)
213+
}
214+
168215
fn lookup_pkh_pk(&self, pkh: &Pk::Hash) -> Option<Pk> {
169216
(**self).lookup_pkh_pk(pkh)
170217
}
@@ -173,6 +220,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
173220
(**self).lookup_pkh_ec_sig(pkh)
174221
}
175222

223+
fn lookup_pkh_schnorr_sig(
224+
&self,
225+
pkh: &Pk::Hash,
226+
) -> Option<(bitcoin::PublicKey, bitcoin::SchnorrSig)> {
227+
(**self).lookup_pkh_schnorr_sig(pkh)
228+
}
229+
176230
fn lookup_sha256(&self, h: sha256::Hash) -> Option<Preimage32> {
177231
(**self).lookup_sha256(h)
178232
}
@@ -203,6 +257,10 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
203257
(**self).lookup_ec_sig(p)
204258
}
205259

260+
fn lookup_schnorr_sig(&self, p: &Pk) -> Option<bitcoin::SchnorrSig> {
261+
(**self).lookup_schnorr_sig(p)
262+
}
263+
206264
fn lookup_pkh_pk(&self, pkh: &Pk::Hash) -> Option<Pk> {
207265
(**self).lookup_pkh_pk(pkh)
208266
}
@@ -211,6 +269,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
211269
(**self).lookup_pkh_ec_sig(pkh)
212270
}
213271

272+
fn lookup_pkh_schnorr_sig(
273+
&self,
274+
pkh: &Pk::Hash,
275+
) -> Option<(bitcoin::PublicKey, bitcoin::SchnorrSig)> {
276+
(**self).lookup_pkh_schnorr_sig(pkh)
277+
}
278+
214279
fn lookup_sha256(&self, h: sha256::Hash) -> Option<Preimage32> {
215280
(**self).lookup_sha256(h)
216281
}
@@ -254,6 +319,16 @@ macro_rules! impl_tuple_satisfier {
254319
None
255320
}
256321

322+
fn lookup_schnorr_sig(&self, key: &Pk) -> Option<bitcoin::SchnorrSig> {
323+
let &($(ref $ty,)*) = self;
324+
$(
325+
if let Some(result) = $ty.lookup_schnorr_sig(key) {
326+
return Some(result);
327+
}
328+
)*
329+
None
330+
}
331+
257332
fn lookup_pkh_ec_sig(
258333
&self,
259334
key_hash: &Pk::Hash,
@@ -267,6 +342,19 @@ macro_rules! impl_tuple_satisfier {
267342
None
268343
}
269344

345+
fn lookup_pkh_schnorr_sig(
346+
&self,
347+
key_hash: &Pk::Hash,
348+
) -> Option<(bitcoin::PublicKey, bitcoin::SchnorrSig)> {
349+
let &($(ref $ty,)*) = self;
350+
$(
351+
if let Some(result) = $ty.lookup_pkh_schnorr_sig(key_hash) {
352+
return Some(result);
353+
}
354+
)*
355+
None
356+
}
357+
270358
fn lookup_pkh_pk(
271359
&self,
272360
key_hash: &Pk::Hash,

0 commit comments

Comments
 (0)