@@ -211,6 +211,9 @@ static void secp256k1_ge_table_set_globalz(size_t len, secp256k1_ge *a, const se
211
211
secp256k1_fe zs ;
212
212
213
213
if (len > 0 ) {
214
+ secp256k1_gej tmpa ;
215
+ secp256k1_fe_set_int (& tmpa .z , 1 );
216
+
214
217
/* Ensure all y values are in weak normal form for fast negation of points */
215
218
secp256k1_fe_normalize_weak (& a [i ].y );
216
219
VERIFY_GE (& a [i ]);
@@ -219,7 +222,6 @@ static void secp256k1_ge_table_set_globalz(size_t len, secp256k1_ge *a, const se
219
222
220
223
/* Work our way backwards, using the z-ratios to scale the x/y values. */
221
224
while (i > 0 ) {
222
- secp256k1_gej tmpa ;
223
225
if (i != len - 1 ) {
224
226
secp256k1_fe_mul (& zs , & zs , & zr [i ]);
225
227
}
@@ -492,11 +494,11 @@ static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, c
492
494
}
493
495
494
496
secp256k1_fe_sqr (& z12 , & a -> z );
495
- u1 = a -> x ; secp256k1_fe_normalize_weak ( & u1 );
497
+ u1 = a -> x ;
496
498
secp256k1_fe_mul (& u2 , & b -> x , & z12 );
497
- s1 = a -> y ; secp256k1_fe_normalize_weak ( & s1 );
499
+ s1 = a -> y ;
498
500
secp256k1_fe_mul (& s2 , & b -> y , & z12 ); secp256k1_fe_mul (& s2 , & s2 , & a -> z );
499
- secp256k1_fe_negate (& h , & u1 , 1 ); secp256k1_fe_add (& h , & u2 );
501
+ secp256k1_fe_negate (& h , & u1 , 6 ); secp256k1_fe_add (& h , & u2 );
500
502
secp256k1_fe_negate (& i , & s2 , 1 ); secp256k1_fe_add (& i , & s1 );
501
503
if (secp256k1_fe_normalizes_to_zero_var (& h )) {
502
504
if (secp256k1_fe_normalizes_to_zero_var (& i )) {
@@ -568,11 +570,11 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a,
568
570
secp256k1_fe_mul (& az , & a -> z , bzinv );
569
571
570
572
secp256k1_fe_sqr (& z12 , & az );
571
- u1 = a -> x ; secp256k1_fe_normalize_weak ( & u1 );
573
+ u1 = a -> x ;
572
574
secp256k1_fe_mul (& u2 , & b -> x , & z12 );
573
- s1 = a -> y ; secp256k1_fe_normalize_weak ( & s1 );
575
+ s1 = a -> y ;
574
576
secp256k1_fe_mul (& s2 , & b -> y , & z12 ); secp256k1_fe_mul (& s2 , & s2 , & az );
575
- secp256k1_fe_negate (& h , & u1 , 1 ); secp256k1_fe_add (& h , & u2 );
577
+ secp256k1_fe_negate (& h , & u1 , 6 ); secp256k1_fe_add (& h , & u2 );
576
578
secp256k1_fe_negate (& i , & s2 , 1 ); secp256k1_fe_add (& i , & s1 );
577
579
if (secp256k1_fe_normalizes_to_zero_var (& h )) {
578
580
if (secp256k1_fe_normalizes_to_zero_var (& i )) {
@@ -666,17 +668,17 @@ static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const
666
668
*/
667
669
668
670
secp256k1_fe_sqr (& zz , & a -> z ); /* z = Z1^2 */
669
- u1 = a -> x ; secp256k1_fe_normalize_weak ( & u1 ); /* u1 = U1 = X1*Z2^2 (1 ) */
671
+ u1 = a -> x ; /* u1 = U1 = X1*Z2^2 (6 ) */
670
672
secp256k1_fe_mul (& u2 , & b -> x , & zz ); /* u2 = U2 = X2*Z1^2 (1) */
671
- s1 = a -> y ; secp256k1_fe_normalize_weak ( & s1 ); /* s1 = S1 = Y1*Z2^3 (1 ) */
673
+ s1 = a -> y ; /* s1 = S1 = Y1*Z2^3 (4 ) */
672
674
secp256k1_fe_mul (& s2 , & b -> y , & zz ); /* s2 = Y2*Z1^2 (1) */
673
675
secp256k1_fe_mul (& s2 , & s2 , & a -> z ); /* s2 = S2 = Y2*Z1^3 (1) */
674
- t = u1 ; secp256k1_fe_add (& t , & u2 ); /* t = T = U1+U2 (2 ) */
675
- m = s1 ; secp256k1_fe_add (& m , & s2 ); /* m = M = S1+S2 (2 ) */
676
+ t = u1 ; secp256k1_fe_add (& t , & u2 ); /* t = T = U1+U2 (7 ) */
677
+ m = s1 ; secp256k1_fe_add (& m , & s2 ); /* m = M = S1+S2 (5 ) */
676
678
secp256k1_fe_sqr (& rr , & t ); /* rr = T^2 (1) */
677
- secp256k1_fe_negate (& m_alt , & u2 , 1 ); /* Malt = -X2*Z1^2 */
678
- secp256k1_fe_mul (& tt , & u1 , & m_alt ); /* tt = -U1*U2 (2 ) */
679
- secp256k1_fe_add (& rr , & tt ); /* rr = R = T^2-U1*U2 (3 ) */
679
+ secp256k1_fe_negate (& m_alt , & u2 , 1 ); /* Malt = -X2*Z1^2 (2) */
680
+ secp256k1_fe_mul (& tt , & u1 , & m_alt ); /* tt = -U1*U2 (1 ) */
681
+ secp256k1_fe_add (& rr , & tt ); /* rr = R = T^2-U1*U2 (2 ) */
680
682
/** If lambda = R/M = 0/0 we have a problem (except in the "trivial"
681
683
* case that Z = z1z2 = 0, and this is special-cased later on). */
682
684
degenerate = secp256k1_fe_normalizes_to_zero (& m ) &
@@ -687,24 +689,24 @@ static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const
687
689
* non-indeterminate expression for lambda is (y1 - y2)/(x1 - x2),
688
690
* so we set R/M equal to this. */
689
691
rr_alt = s1 ;
690
- secp256k1_fe_mul_int (& rr_alt , 2 ); /* rr = Y1*Z2^3 - Y2*Z1^3 (2 ) */
691
- secp256k1_fe_add (& m_alt , & u1 ); /* Malt = X1*Z2^2 - X2*Z1^2 */
692
+ secp256k1_fe_mul_int (& rr_alt , 2 ); /* rr_alt = Y1*Z2^3 - Y2*Z1^3 (8 ) */
693
+ secp256k1_fe_add (& m_alt , & u1 ); /* Malt = X1*Z2^2 - X2*Z1^2 (8) */
692
694
693
- secp256k1_fe_cmov (& rr_alt , & rr , !degenerate );
694
- secp256k1_fe_cmov (& m_alt , & m , !degenerate );
695
+ secp256k1_fe_cmov (& rr_alt , & rr , !degenerate ); /* rr_alt (8) */
696
+ secp256k1_fe_cmov (& m_alt , & m , !degenerate ); /* m_alt (5) */
695
697
/* Now Ralt / Malt = lambda and is guaranteed not to be 0/0.
696
698
* From here on out Ralt and Malt represent the numerator
697
699
* and denominator of lambda; R and M represent the explicit
698
700
* expressions x1^2 + x2^2 + x1x2 and y1 + y2. */
699
701
secp256k1_fe_sqr (& n , & m_alt ); /* n = Malt^2 (1) */
700
- secp256k1_fe_negate (& q , & t , 2 ); /* q = -T (3 ) */
702
+ secp256k1_fe_negate (& q , & t , 7 ); /* q = -T (8 ) */
701
703
secp256k1_fe_mul (& q , & q , & n ); /* q = Q = -T*Malt^2 (1) */
702
704
/* These two lines use the observation that either M == Malt or M == 0,
703
705
* so M^3 * Malt is either Malt^4 (which is computed by squaring), or
704
706
* zero (which is "computed" by cmov). So the cost is one squaring
705
707
* versus two multiplications. */
706
- secp256k1_fe_sqr (& n , & n );
707
- secp256k1_fe_cmov (& n , & m , degenerate ); /* n = M^3 * Malt (2 ) */
708
+ secp256k1_fe_sqr (& n , & n ); /* n = Malt^4 (1) */
709
+ secp256k1_fe_cmov (& n , & m , degenerate ); /* n = M^3 * Malt (5 ) */
708
710
secp256k1_fe_sqr (& t , & rr_alt ); /* t = Ralt^2 (1) */
709
711
secp256k1_fe_mul (& r -> z , & a -> z , & m_alt ); /* r->z = Z3 = Malt*Z (1) */
710
712
infinity = secp256k1_fe_normalizes_to_zero (& r -> z ) & ~a -> infinity ;
@@ -713,9 +715,9 @@ static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const
713
715
secp256k1_fe_mul_int (& t , 2 ); /* t = 2*X3 (4) */
714
716
secp256k1_fe_add (& t , & q ); /* t = 2*X3 + Q (5) */
715
717
secp256k1_fe_mul (& t , & t , & rr_alt ); /* t = Ralt*(2*X3 + Q) (1) */
716
- secp256k1_fe_add (& t , & n ); /* t = Ralt*(2*X3 + Q) + M^3*Malt (3 ) */
717
- secp256k1_fe_negate (& r -> y , & t , 3 ); /* r->y = -(Ralt*(2*X3 + Q) + M^3*Malt) (4 ) */
718
- secp256k1_fe_half (& r -> y ); /* r->y = Y3 = -(Ralt*(2*X3 + Q) + M^3*Malt)/2 (3 ) */
718
+ secp256k1_fe_add (& t , & n ); /* t = Ralt*(2*X3 + Q) + M^3*Malt (6 ) */
719
+ secp256k1_fe_negate (& r -> y , & t , 6 ); /* r->y = -(Ralt*(2*X3 + Q) + M^3*Malt) (7 ) */
720
+ secp256k1_fe_half (& r -> y ); /* r->y = Y3 = -(Ralt*(2*X3 + Q) + M^3*Malt)/2 (4 ) */
719
721
720
722
/** In case a->infinity == 1, replace r with (b->x, b->y, 1). */
721
723
secp256k1_fe_cmov (& r -> x , & b -> x , a -> infinity );
0 commit comments