@@ -844,6 +844,47 @@ where
844
844
None => return Some ( Err ( Error :: UnexpectedStackEnd ) ) ,
845
845
}
846
846
}
847
+ Terminal :: MultiA ( k, ref subs) => {
848
+ if node_state. n_evaluated == subs. len ( ) {
849
+ if node_state. n_satisfied == k {
850
+ self . stack . push ( stack:: Element :: Satisfied ) ;
851
+ } else {
852
+ self . stack . push ( stack:: Element :: Dissatisfied ) ;
853
+ }
854
+ } else {
855
+ // evaluate each key with as a pk
856
+ // note that evaluate_pk will error on non-empty incorrect sigs
857
+ // push 1 on satisfied sigs and push 0 on empty sigs
858
+ match self
859
+ . stack
860
+ . evaluate_pk ( & mut self . verify_sig , & subs[ node_state. n_evaluated ] )
861
+ {
862
+ Some ( Ok ( x) ) => {
863
+ self . push_evaluation_state (
864
+ node_state. node ,
865
+ node_state. n_evaluated + 1 ,
866
+ node_state. n_satisfied + 1 ,
867
+ ) ;
868
+ match self . stack . pop ( ) {
869
+ Some ( ..) => return Some ( Ok ( x) ) ,
870
+ None => return Some ( Err ( Error :: UnexpectedStackEnd ) ) ,
871
+ }
872
+ }
873
+ None => {
874
+ self . push_evaluation_state (
875
+ node_state. node ,
876
+ node_state. n_evaluated + 1 ,
877
+ node_state. n_satisfied ,
878
+ ) ;
879
+ match self . stack . pop ( ) {
880
+ Some ( ..) => { } // not-satisfied, look for next key
881
+ None => return Some ( Err ( Error :: UnexpectedStackEnd ) ) ,
882
+ }
883
+ }
884
+ x => return x, //forward errors as is
885
+ }
886
+ }
887
+ }
847
888
Terminal :: Multi ( ref k, ref subs) if node_state. n_evaluated == 0 => {
848
889
let len = self . stack . len ( ) ;
849
890
if len < k + 1 {
0 commit comments