@@ -27,7 +27,7 @@ use miniscript::context::NoChecks;
2727use miniscript:: ScriptContext ;
2828use Miniscript ;
2929use Terminal ;
30- use { BitcoinSig , Descriptor , ToPublicKey } ;
30+ use { Descriptor , ToPublicKey } ;
3131
3232mod error;
3333mod inner;
@@ -82,7 +82,7 @@ impl<'txin> Interpreter<'txin> {
8282 ///
8383 /// Running the iterator through will consume the internal stack of the
8484 /// `Iterpreter`, and it should not be used again after this.
85- pub fn iter < ' iter , F : FnMut ( & bitcoin:: PublicKey , BitcoinSig ) -> bool > (
85+ pub fn iter < ' iter , F : FnMut ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool > (
8686 & ' iter mut self ,
8787 verify_sig : F ,
8888 ) -> Iter < ' txin , ' iter , F > {
@@ -190,7 +190,7 @@ impl<'txin> Interpreter<'txin> {
190190 unsigned_tx : & ' a bitcoin:: Transaction ,
191191 input_idx : usize ,
192192 amount : u64 ,
193- ) -> Result < impl Fn ( & bitcoin:: PublicKey , BitcoinSig ) -> bool + ' a , Error > {
193+ ) -> Result < impl Fn ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool + ' a , Error > {
194194 // Precompute all sighash types because the borrowck doesn't like us
195195 // pulling self into the closure
196196 let sighashes = [
@@ -232,19 +232,21 @@ impl<'txin> Interpreter<'txin> {
232232 ) ?,
233233 ] ;
234234
235- Ok ( move |pk : & bitcoin:: PublicKey , ( sig, sighash_type) | {
236- // This is an awkward way to do this lookup, but it lets us do exhaustiveness
237- // checking in case future rust-bitcoin versions add new sighash types
238- let sighash = match sighash_type {
239- bitcoin:: EcdsaSigHashType :: All => sighashes[ 0 ] ,
240- bitcoin:: EcdsaSigHashType :: None => sighashes[ 1 ] ,
241- bitcoin:: EcdsaSigHashType :: Single => sighashes[ 2 ] ,
242- bitcoin:: EcdsaSigHashType :: AllPlusAnyoneCanPay => sighashes[ 3 ] ,
243- bitcoin:: EcdsaSigHashType :: NonePlusAnyoneCanPay => sighashes[ 4 ] ,
244- bitcoin:: EcdsaSigHashType :: SinglePlusAnyoneCanPay => sighashes[ 5 ] ,
245- } ;
246- secp. verify_ecdsa ( & sighash, & sig, & pk. key ) . is_ok ( )
247- } )
235+ Ok (
236+ move |pk : & bitcoin:: PublicKey , ecdsa_sig : bitcoin:: EcdsaSig | {
237+ // This is an awkward way to do this lookup, but it lets us do exhaustiveness
238+ // checking in case future rust-bitcoin versions add new sighash types
239+ let sighash = match ecdsa_sig. hash_ty {
240+ bitcoin:: EcdsaSigHashType :: All => sighashes[ 0 ] ,
241+ bitcoin:: EcdsaSigHashType :: None => sighashes[ 1 ] ,
242+ bitcoin:: EcdsaSigHashType :: Single => sighashes[ 2 ] ,
243+ bitcoin:: EcdsaSigHashType :: AllPlusAnyoneCanPay => sighashes[ 3 ] ,
244+ bitcoin:: EcdsaSigHashType :: NonePlusAnyoneCanPay => sighashes[ 4 ] ,
245+ bitcoin:: EcdsaSigHashType :: SinglePlusAnyoneCanPay => sighashes[ 5 ] ,
246+ } ;
247+ secp. verify_ecdsa ( & sighash, & ecdsa_sig. sig , & pk. key ) . is_ok ( )
248+ } ,
249+ )
248250 }
249251}
250252
@@ -327,7 +329,7 @@ struct NodeEvaluationState<'intp> {
327329///
328330/// In case the script is actually dissatisfied, this may return several values
329331/// before ultimately returning an error.
330- pub struct Iter < ' intp , ' txin : ' intp , F : FnMut ( & bitcoin:: PublicKey , BitcoinSig ) -> bool > {
332+ pub struct Iter < ' intp , ' txin : ' intp , F : FnMut ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool > {
331333 verify_sig : F ,
332334 public_key : Option < & ' intp bitcoin:: PublicKey > ,
333335 state : Vec < NodeEvaluationState < ' intp > > ,
@@ -341,7 +343,7 @@ pub struct Iter<'intp, 'txin: 'intp, F: FnMut(&bitcoin::PublicKey, BitcoinSig) -
341343impl < ' intp , ' txin : ' intp , F > Iterator for Iter < ' intp , ' txin , F >
342344where
343345 NoChecks : ScriptContext ,
344- F : FnMut ( & bitcoin:: PublicKey , BitcoinSig ) -> bool ,
346+ F : FnMut ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool ,
345347{
346348 type Item = Result < SatisfiedConstraint < ' intp , ' txin > , Error > ;
347349
@@ -362,7 +364,7 @@ where
362364impl < ' intp , ' txin : ' intp , F > Iter < ' intp , ' txin , F >
363365where
364366 NoChecks : ScriptContext ,
365- F : FnMut ( & bitcoin:: PublicKey , BitcoinSig ) -> bool ,
367+ F : FnMut ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool ,
366368{
367369 /// Helper function to push a NodeEvaluationState on state stack
368370 fn push_evaluation_state (
@@ -770,14 +772,15 @@ fn verify_sersig<'txin, F>(
770772 sigser : & [ u8 ] ,
771773) -> Result < secp256k1:: ecdsa:: Signature , Error >
772774where
773- F : FnOnce ( & bitcoin:: PublicKey , BitcoinSig ) -> bool ,
775+ F : FnOnce ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool ,
774776{
775777 if let Some ( ( sighash_byte, sig) ) = sigser. split_last ( ) {
776- let sighashtype = bitcoin:: EcdsaSigHashType :: from_u32_standard ( * sighash_byte as u32 )
778+ let hash_ty = bitcoin:: EcdsaSigHashType :: from_u32_standard ( * sighash_byte as u32 )
777779 . map_err ( |_| Error :: NonStandardSigHash ( [ sig, & [ * sighash_byte] ] . concat ( ) . to_vec ( ) ) ) ?;
778780 let sig = secp256k1:: ecdsa:: Signature :: from_der ( sig) ?;
779- if verify_sig ( pk, ( sig, sighashtype) ) {
780- Ok ( sig)
781+ let ecdsa_sig = bitcoin:: EcdsaSig { sig, hash_ty } ;
782+ if verify_sig ( pk, ecdsa_sig) {
783+ Ok ( ecdsa_sig. sig )
781784 } else {
782785 Err ( Error :: InvalidSignature ( * pk) )
783786 }
@@ -794,7 +797,6 @@ mod tests {
794797 use bitcoin:: hashes:: { hash160, ripemd160, sha256, sha256d, Hash } ;
795798 use bitcoin:: secp256k1:: { self , Secp256k1 , VerifyOnly } ;
796799 use miniscript:: context:: NoChecks ;
797- use BitcoinSig ;
798800 use Miniscript ;
799801 use MiniscriptKey ;
800802 use ToPublicKey ;
@@ -839,16 +841,17 @@ mod tests {
839841 #[ test]
840842 fn sat_constraints ( ) {
841843 let ( pks, der_sigs, secp_sigs, sighash, secp) = setup_keys_sigs ( 10 ) ;
842- let vfyfn_ =
843- |pk : & bitcoin:: PublicKey , ( sig, _) | secp. verify_ecdsa ( & sighash, & sig, & pk. key ) . is_ok ( ) ;
844+ let vfyfn_ = |pk : & bitcoin:: PublicKey , ecdsa_sig : bitcoin:: EcdsaSig | {
845+ secp. verify_ecdsa ( & sighash, & ecdsa_sig. sig , & pk. key ) . is_ok ( )
846+ } ;
844847
845848 fn from_stack < ' txin , ' elem , F > (
846849 verify_fn : F ,
847850 stack : & ' elem mut Stack < ' txin > ,
848851 ms : & ' elem Miniscript < bitcoin:: PublicKey , NoChecks > ,
849852 ) -> Iter < ' elem , ' txin , F >
850853 where
851- F : FnMut ( & bitcoin:: PublicKey , BitcoinSig ) -> bool ,
854+ F : FnMut ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool ,
852855 {
853856 Iter {
854857 verify_sig : verify_fn,
0 commit comments