@@ -26,7 +26,7 @@ use miniscript::context::NoChecks;
2626use miniscript:: ScriptContext ;
2727use Miniscript ;
2828use Terminal ;
29- use { BitcoinSig , Descriptor , ToPublicKey } ;
29+ use { Descriptor , ToPublicKey } ;
3030
3131mod error;
3232mod inner;
@@ -81,7 +81,7 @@ impl<'txin> Interpreter<'txin> {
8181 ///
8282 /// Running the iterator through will consume the internal stack of the
8383 /// `Iterpreter`, and it should not be used again after this.
84- pub fn iter < ' iter , F : FnMut ( & bitcoin:: PublicKey , BitcoinSig ) -> bool > (
84+ pub fn iter < ' iter , F : FnMut ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool > (
8585 & ' iter mut self ,
8686 verify_sig : F ,
8787 ) -> Iter < ' txin , ' iter , F > {
@@ -189,7 +189,7 @@ impl<'txin> Interpreter<'txin> {
189189 unsigned_tx : & ' a bitcoin:: Transaction ,
190190 input_idx : usize ,
191191 amount : u64 ,
192- ) -> Result < impl Fn ( & bitcoin:: PublicKey , BitcoinSig ) -> bool + ' a , Error > {
192+ ) -> Result < impl Fn ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool + ' a , Error > {
193193 // Precompute all sighash types because the borrowck doesn't like us
194194 // pulling self into the closure
195195 let sighashes = [
@@ -231,19 +231,21 @@ impl<'txin> Interpreter<'txin> {
231231 ) ?,
232232 ] ;
233233
234- Ok ( move |pk : & bitcoin:: PublicKey , ( sig, sighash_type) | {
235- // This is an awkward way to do this lookup, but it lets us do exhaustiveness
236- // checking in case future rust-bitcoin versions add new sighash types
237- let sighash = match sighash_type {
238- bitcoin:: EcdsaSigHashType :: All => sighashes[ 0 ] ,
239- bitcoin:: EcdsaSigHashType :: None => sighashes[ 1 ] ,
240- bitcoin:: EcdsaSigHashType :: Single => sighashes[ 2 ] ,
241- bitcoin:: EcdsaSigHashType :: AllPlusAnyoneCanPay => sighashes[ 3 ] ,
242- bitcoin:: EcdsaSigHashType :: NonePlusAnyoneCanPay => sighashes[ 4 ] ,
243- bitcoin:: EcdsaSigHashType :: SinglePlusAnyoneCanPay => sighashes[ 5 ] ,
244- } ;
245- secp. verify ( & sighash, & sig, & pk. key ) . is_ok ( )
246- } )
234+ Ok (
235+ move |pk : & bitcoin:: PublicKey , ecdsa_sig : bitcoin:: EcdsaSig | {
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 ecdsa_sig. hash_ty {
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 ( & sighash, & ecdsa_sig. sig , & pk. key ) . is_ok ( )
247+ } ,
248+ )
247249 }
248250}
249251
@@ -326,7 +328,7 @@ struct NodeEvaluationState<'intp> {
326328///
327329/// In case the script is actually dissatisfied, this may return several values
328330/// before ultimately returning an error.
329- pub struct Iter < ' intp , ' txin : ' intp , F : FnMut ( & bitcoin:: PublicKey , BitcoinSig ) -> bool > {
331+ pub struct Iter < ' intp , ' txin : ' intp , F : FnMut ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool > {
330332 verify_sig : F ,
331333 public_key : Option < & ' intp bitcoin:: PublicKey > ,
332334 state : Vec < NodeEvaluationState < ' intp > > ,
@@ -340,7 +342,7 @@ pub struct Iter<'intp, 'txin: 'intp, F: FnMut(&bitcoin::PublicKey, BitcoinSig) -
340342impl < ' intp , ' txin : ' intp , F > Iterator for Iter < ' intp , ' txin , F >
341343where
342344 NoChecks : ScriptContext ,
343- F : FnMut ( & bitcoin:: PublicKey , BitcoinSig ) -> bool ,
345+ F : FnMut ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool ,
344346{
345347 type Item = Result < SatisfiedConstraint < ' intp , ' txin > , Error > ;
346348
@@ -361,7 +363,7 @@ where
361363impl < ' intp , ' txin : ' intp , F > Iter < ' intp , ' txin , F >
362364where
363365 NoChecks : ScriptContext ,
364- F : FnMut ( & bitcoin:: PublicKey , BitcoinSig ) -> bool ,
366+ F : FnMut ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool ,
365367{
366368 /// Helper function to push a NodeEvaluationState on state stack
367369 fn push_evaluation_state (
@@ -769,14 +771,15 @@ fn verify_sersig<'txin, F>(
769771 sigser : & [ u8 ] ,
770772) -> Result < secp256k1:: Signature , Error >
771773where
772- F : FnOnce ( & bitcoin:: PublicKey , BitcoinSig ) -> bool ,
774+ F : FnOnce ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool ,
773775{
774776 if let Some ( ( sighash_byte, sig) ) = sigser. split_last ( ) {
775- let sighashtype = bitcoin:: EcdsaSigHashType :: from_u32_standard ( * sighash_byte as u32 )
777+ let hash_ty = bitcoin:: EcdsaSigHashType :: from_u32_standard ( * sighash_byte as u32 )
776778 . map_err ( |_| Error :: NonStandardSigHash ( [ sig, & [ * sighash_byte] ] . concat ( ) . to_vec ( ) ) ) ?;
777779 let sig = secp256k1:: Signature :: from_der ( sig) ?;
778- if verify_sig ( pk, ( sig, sighashtype) ) {
779- Ok ( sig)
780+ let ecdsa_sig = bitcoin:: EcdsaSig { sig, hash_ty } ;
781+ if verify_sig ( pk, ecdsa_sig) {
782+ Ok ( ecdsa_sig. sig )
780783 } else {
781784 Err ( Error :: InvalidSignature ( * pk) )
782785 }
@@ -793,7 +796,6 @@ mod tests {
793796 use bitcoin:: hashes:: { hash160, ripemd160, sha256, sha256d, Hash } ;
794797 use bitcoin:: secp256k1:: { self , Secp256k1 , VerifyOnly } ;
795798 use miniscript:: context:: NoChecks ;
796- use BitcoinSig ;
797799 use Miniscript ;
798800 use MiniscriptKey ;
799801 use ToPublicKey ;
@@ -838,16 +840,17 @@ mod tests {
838840 #[ test]
839841 fn sat_constraints ( ) {
840842 let ( pks, der_sigs, secp_sigs, sighash, secp) = setup_keys_sigs ( 10 ) ;
841- let vfyfn_ =
842- |pk : & bitcoin:: PublicKey , ( sig, _) | secp. verify ( & sighash, & sig, & pk. key ) . is_ok ( ) ;
843+ let vfyfn_ = |pk : & bitcoin:: PublicKey , ecdsa_sig : bitcoin:: EcdsaSig | {
844+ secp. verify ( & sighash, & ecdsa_sig. sig , & pk. key ) . is_ok ( )
845+ } ;
843846
844847 fn from_stack < ' txin , ' elem , F > (
845848 verify_fn : F ,
846849 stack : & ' elem mut Stack < ' txin > ,
847850 ms : & ' elem Miniscript < bitcoin:: PublicKey , NoChecks > ,
848851 ) -> Iter < ' elem , ' txin , F >
849852 where
850- F : FnMut ( & bitcoin:: PublicKey , BitcoinSig ) -> bool ,
853+ F : FnMut ( & bitcoin:: PublicKey , bitcoin :: EcdsaSig ) -> bool ,
851854 {
852855 Iter {
853856 verify_sig : verify_fn,
0 commit comments