File tree Expand file tree Collapse file tree 4 files changed +16
-11
lines changed Expand file tree Collapse file tree 4 files changed +16
-11
lines changed Original file line number Diff line number Diff line change @@ -120,7 +120,7 @@ impl<Pk: MiniscriptKey + ToPublicKey> Bare<Pk> {
120
120
S : Satisfier < Pk > ,
121
121
{
122
122
let ms = self . ms . satisfy ( satisfier) ?;
123
- let script_sig = witness_to_scriptsig ( & ms) ;
123
+ let script_sig = witness_to_scriptsig ( & ms) ? ;
124
124
let witness = vec ! [ ] ;
125
125
Ok ( ( witness, script_sig) )
126
126
}
@@ -133,7 +133,7 @@ impl<Pk: MiniscriptKey + ToPublicKey> Bare<Pk> {
133
133
S : Satisfier < Pk > ,
134
134
{
135
135
let ms = self . ms . satisfy_malleable ( satisfier) ?;
136
- let script_sig = witness_to_scriptsig ( & ms) ;
136
+ let script_sig = witness_to_scriptsig ( & ms) ? ;
137
137
let witness = vec ! [ ] ;
138
138
Ok ( ( witness, script_sig) )
139
139
}
Original file line number Diff line number Diff line change @@ -376,14 +376,14 @@ impl<Pk: MiniscriptKey + ToPublicKey> Sh<Pk> {
376
376
ShInner :: SortedMulti ( ref smv) => {
377
377
let mut script_witness = smv. satisfy ( satisfier) ?;
378
378
script_witness. push ( smv. encode ( ) . into_bytes ( ) ) ;
379
- let script_sig = witness_to_scriptsig ( & script_witness) ;
379
+ let script_sig = witness_to_scriptsig ( & script_witness) ? ;
380
380
let witness = vec ! [ ] ;
381
381
Ok ( ( witness, script_sig) )
382
382
}
383
383
ShInner :: Ms ( ref ms) => {
384
384
let mut script_witness = ms. satisfy ( satisfier) ?;
385
385
script_witness. push ( ms. encode ( ) . into_bytes ( ) ) ;
386
- let script_sig = witness_to_scriptsig ( & script_witness) ;
386
+ let script_sig = witness_to_scriptsig ( & script_witness) ? ;
387
387
let witness = vec ! [ ] ;
388
388
Ok ( ( witness, script_sig) )
389
389
}
@@ -406,7 +406,7 @@ impl<Pk: MiniscriptKey + ToPublicKey> Sh<Pk> {
406
406
ShInner :: Ms ( ref ms) => {
407
407
let mut script_witness = ms. satisfy_malleable ( satisfier) ?;
408
408
script_witness. push ( ms. encode ( ) . into_bytes ( ) ) ;
409
- let script_sig = witness_to_scriptsig ( & script_witness) ;
409
+ let script_sig = witness_to_scriptsig ( & script_witness) ? ;
410
410
let witness = vec ! [ ] ;
411
411
Ok ( ( witness, script_sig) )
412
412
}
Original file line number Diff line number Diff line change @@ -385,7 +385,7 @@ impl ScriptContext for Legacy {
385
385
fn check_witness ( witness : & [ Vec < u8 > ] ) -> Result < ( ) , ScriptContextError > {
386
386
// In future, we could avoid by having a function to count only
387
387
// len of script instead of converting it.
388
- if witness_to_scriptsig ( witness) . len ( ) > MAX_SCRIPTSIG_SIZE {
388
+ if witness_to_scriptsig ( witness) . unwrap ( ) . len ( ) > MAX_SCRIPTSIG_SIZE {
389
389
return Err ( ScriptContextError :: MaxScriptSigSizeExceeded ) ;
390
390
}
391
391
Ok ( ( ) )
Original file line number Diff line number Diff line change 2
2
3
3
use core:: convert:: TryFrom ;
4
4
5
+ use bitcoin:: constants:: MAX_SCRIPT_ELEMENT_SIZE ;
5
6
use bitcoin:: hashes:: Hash ;
6
7
use bitcoin:: script:: { self , PushBytes , ScriptBuf } ;
7
8
use bitcoin:: PubkeyHash ;
@@ -47,18 +48,22 @@ pub(crate) fn witness_size<T: ItemSize>(wit: &[T]) -> usize {
47
48
wit. iter ( ) . map ( T :: size) . sum :: < usize > ( ) + varint_len ( wit. len ( ) )
48
49
}
49
50
50
- pub ( crate ) fn witness_to_scriptsig ( witness : & [ Vec < u8 > ] ) -> ScriptBuf {
51
+ pub ( crate ) fn witness_to_scriptsig ( witness : & [ Vec < u8 > ] ) -> Result < ScriptBuf , super :: Error > {
51
52
let mut b = script:: Builder :: new ( ) ;
52
- for wit in witness {
53
+ for ( i , wit) in witness. iter ( ) . enumerate ( ) {
53
54
if let Ok ( n) = script:: read_scriptint ( wit) {
54
55
b = b. push_int ( n) ;
55
56
} else {
56
- let push = <& PushBytes >:: try_from ( wit. as_slice ( ) )
57
- . expect ( "All pushes in miniscript are <73 bytes" ) ;
57
+ if i != witness. len ( ) - 1 {
58
+ assert ! ( wit. len( ) < 73 , "All pushes in miniscript are < 73 bytes" ) ;
59
+ } else {
60
+ assert ! ( wit. len( ) <= MAX_SCRIPT_ELEMENT_SIZE , "P2SH redeem script is <= 520 bytes" ) ;
61
+ }
62
+ let push = <& PushBytes >:: try_from ( wit. as_slice ( ) ) . expect ( "checked above" ) ;
58
63
b = b. push_slice ( push)
59
64
}
60
65
}
61
- b. into_script ( )
66
+ Ok ( b. into_script ( ) )
62
67
}
63
68
64
69
// trait for pushing key that depend on context
You can’t perform that action at this time.
0 commit comments