Skip to content

Commit 2c32c03

Browse files
committed
Use bitcoin::SchnorrSig type from rust-bitcoin
1 parent e26d4e6 commit 2c32c03

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
@@ -62,6 +67,17 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
6267
None
6368
}
6469

70+
/// Given a keyhash, look up the schnorr signature and the associated key
71+
/// Even if signatures for public key Hashes are not available, the users
72+
/// can use this map to provide pkh -> pk mapping which can be useful
73+
/// for dissatisfying pkh.
74+
fn lookup_pkh_schnorr_sig(
75+
&self,
76+
_: &Pk::Hash,
77+
) -> Option<(bitcoin::PublicKey, bitcoin::SchnorrSig)> {
78+
None
79+
}
80+
6581
/// Given a SHA256 hash, look up its preimage
6682
fn lookup_sha256(&self, _: sha256::Hash) -> Option<Preimage32> {
6783
None
@@ -142,6 +158,12 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for HashMap<Pk, bitcoin::Ecd
142158
}
143159
}
144160

161+
impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for HashMap<Pk, bitcoin::SchnorrSig> {
162+
fn lookup_schnorr_sig(&self, key: &Pk) -> Option<bitcoin::SchnorrSig> {
163+
self.get(key).map(|x| *x)
164+
}
165+
}
166+
145167
impl<Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for HashMap<Pk::Hash, (Pk, bitcoin::EcdsaSig)>
146168
where
147169
Pk: MiniscriptKey + ToPublicKey,
@@ -163,11 +185,36 @@ where
163185
}
164186
}
165187

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

214+
fn lookup_schnorr_sig(&self, p: &Pk) -> Option<bitcoin::SchnorrSig> {
215+
(**self).lookup_schnorr_sig(p)
216+
}
217+
171218
fn lookup_pkh_pk(&self, pkh: &Pk::Hash) -> Option<Pk> {
172219
(**self).lookup_pkh_pk(pkh)
173220
}
@@ -179,6 +226,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
179226
(**self).lookup_pkh_ecdsa_sig(pkh)
180227
}
181228

229+
fn lookup_pkh_schnorr_sig(
230+
&self,
231+
pkh: &Pk::Hash,
232+
) -> Option<(bitcoin::PublicKey, bitcoin::SchnorrSig)> {
233+
(**self).lookup_pkh_schnorr_sig(pkh)
234+
}
235+
182236
fn lookup_sha256(&self, h: sha256::Hash) -> Option<Preimage32> {
183237
(**self).lookup_sha256(h)
184238
}
@@ -209,6 +263,10 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
209263
(**self).lookup_ecdsa_sig(p)
210264
}
211265

266+
fn lookup_schnorr_sig(&self, p: &Pk) -> Option<bitcoin::SchnorrSig> {
267+
(**self).lookup_schnorr_sig(p)
268+
}
269+
212270
fn lookup_pkh_pk(&self, pkh: &Pk::Hash) -> Option<Pk> {
213271
(**self).lookup_pkh_pk(pkh)
214272
}
@@ -220,6 +278,13 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
220278
(**self).lookup_pkh_ecdsa_sig(pkh)
221279
}
222280

281+
fn lookup_pkh_schnorr_sig(
282+
&self,
283+
pkh: &Pk::Hash,
284+
) -> Option<(bitcoin::PublicKey, bitcoin::SchnorrSig)> {
285+
(**self).lookup_pkh_schnorr_sig(pkh)
286+
}
287+
223288
fn lookup_sha256(&self, h: sha256::Hash) -> Option<Preimage32> {
224289
(**self).lookup_sha256(h)
225290
}
@@ -263,6 +328,16 @@ macro_rules! impl_tuple_satisfier {
263328
None
264329
}
265330

331+
fn lookup_schnorr_sig(&self, key: &Pk) -> Option<bitcoin::SchnorrSig> {
332+
let &($(ref $ty,)*) = self;
333+
$(
334+
if let Some(result) = $ty.lookup_schnorr_sig(key) {
335+
return Some(result);
336+
}
337+
)*
338+
None
339+
}
340+
266341
fn lookup_pkh_ecdsa_sig(
267342
&self,
268343
key_hash: &Pk::Hash,
@@ -276,6 +351,19 @@ macro_rules! impl_tuple_satisfier {
276351
None
277352
}
278353

354+
fn lookup_pkh_schnorr_sig(
355+
&self,
356+
key_hash: &Pk::Hash,
357+
) -> Option<(bitcoin::PublicKey, bitcoin::SchnorrSig)> {
358+
let &($(ref $ty,)*) = self;
359+
$(
360+
if let Some(result) = $ty.lookup_pkh_schnorr_sig(key_hash) {
361+
return Some(result);
362+
}
363+
)*
364+
None
365+
}
366+
279367
fn lookup_pkh_pk(
280368
&self,
281369
key_hash: &Pk::Hash,

0 commit comments

Comments
 (0)