@@ -844,6 +844,47 @@ where
844844 None => return Some ( Err ( Error :: UnexpectedStackEnd ) ) ,
845845 }
846846 }
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+ }
847888 Terminal :: Multi ( ref k, ref subs) if node_state. n_evaluated == 0 => {
848889 let len = self . stack . len ( ) ;
849890 if len < k + 1 {
0 commit comments