@@ -654,14 +654,10 @@ static int secp256k1_ecmult_pippenger_wnaf(secp256k1_gej *buckets, int bucket_wi
654
654
655
655
for (i = n_wnaf - 1 ; i >= 0 ; i -- ) {
656
656
secp256k1_gej running_sum ;
657
- secp256k1_gej walking_sum ;
658
657
659
658
for (j = 0 ; j < ECMULT_TABLE_SIZE (bucket_window + 2 ); j ++ ) {
660
659
secp256k1_gej_set_infinity (& buckets [j ]);
661
660
}
662
- for (j = 0 ; j < bucket_window + 1 ; j ++ ) {
663
- secp256k1_gej_double_var (r , r , NULL );
664
- }
665
661
666
662
for (np = 0 ; np < no ; ++ np ) {
667
663
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
688
684
secp256k1_gej_add_ge_var (& buckets [idx ], & buckets [idx ], & tmp , NULL );
689
685
}
690
686
}
687
+
688
+ for (j = 0 ; j < bucket_window ; j ++ ) {
689
+ secp256k1_gej_double_var (r , r , NULL );
690
+ }
691
+
691
692
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:
695
697
* 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').
699
700
*/
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 -- ) {
701
702
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 );
703
704
}
704
705
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 );
709
709
}
710
710
return 1 ;
711
711
}
0 commit comments