@@ -654,14 +654,10 @@ static int secp256k1_ecmult_pippenger_wnaf(secp256k1_gej *buckets, int bucket_wi
654654
655655 for (i = n_wnaf - 1 ; i >= 0 ; i -- ) {
656656 secp256k1_gej running_sum ;
657- secp256k1_gej walking_sum ;
658657
659658 for (j = 0 ; j < ECMULT_TABLE_SIZE (bucket_window + 2 ); j ++ ) {
660659 secp256k1_gej_set_infinity (& buckets [j ]);
661660 }
662- for (j = 0 ; j < bucket_window + 1 ; j ++ ) {
663- secp256k1_gej_double_var (r , r , NULL );
664- }
665661
666662 for (np = 0 ; np < no ; ++ np ) {
667663 int n = state -> wnaf_na [np * n_wnaf + i ];
@@ -688,24 +684,28 @@ static int secp256k1_ecmult_pippenger_wnaf(secp256k1_gej *buckets, int bucket_wi
688684 secp256k1_gej_add_ge_var (& buckets [idx ], & buckets [idx ], & tmp , NULL );
689685 }
690686 }
687+
688+ for (j = 0 ; j < bucket_window ; j ++ ) {
689+ secp256k1_gej_double_var (r , r , NULL );
690+ }
691+
691692 secp256k1_gej_set_infinity (& running_sum );
692- secp256k1_gej_set_infinity (& walking_sum );
693- /* Compute walking_sum as bucket[0] + 3*bucket[1] + 5*bucket[2] + ...
694- * by first setting
693+ /* Accumulate the sum: bucket[0] + 3*bucket[1] + 5*bucket[2] + 7*bucket[3] + ...
694+ * = bucket[0] + bucket[1] + bucket[2] + bucket[3] + ...
695+ * + 2 * (bucket[1] + 2*bucket[2] + 3*bucket[3] + ...)
696+ * using an intermediate running sum:
695697 * running_sum = bucket[0] + bucket[1] + bucket[2] + ...
696- * walking_sum = bucket[0] + 2*bucket[1] + 3*bucket[2] + ...
697- * and then computing
698- * walking_sum = 2*walking_sum - running_sum
698+ *
699+ * The doubling is done implicitly by deferring the final window doubling (of 'r').
699700 */
700- for (j = ECMULT_TABLE_SIZE (bucket_window + 2 ) - 1 ; j >= 0 ; j -- ) {
701+ for (j = ECMULT_TABLE_SIZE (bucket_window + 2 ) - 1 ; j > 0 ; j -- ) {
701702 secp256k1_gej_add_var (& running_sum , & running_sum , & buckets [j ], NULL );
702- secp256k1_gej_add_var (& walking_sum , & walking_sum , & running_sum , NULL );
703+ secp256k1_gej_add_var (r , r , & running_sum , NULL );
703704 }
704705
705- secp256k1_gej_double_var (& walking_sum , & walking_sum , NULL );
706- secp256k1_gej_neg (& running_sum , & running_sum );
707- secp256k1_gej_add_var (& walking_sum , & walking_sum , & running_sum , NULL );
708- secp256k1_gej_add_var (r , r , & walking_sum , NULL );
706+ secp256k1_gej_add_var (& running_sum , & running_sum , & buckets [0 ], NULL );
707+ secp256k1_gej_double_var (r , r , NULL );
708+ secp256k1_gej_add_var (r , r , & running_sum , NULL );
709709 }
710710 return 1 ;
711711}
0 commit comments