@@ -330,15 +330,14 @@ static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, s
330330}
331331
332332static void secp256k1_gej_add_var (secp256k1_gej * r , const secp256k1_gej * a , const secp256k1_gej * b , secp256k1_fe * rzr ) {
333- /* Operations: 12 mul, 4 sqr, 2 normalize, 12 mul_int/ add/negate */
334- secp256k1_fe z22 , z12 , u1 , u2 , s1 , s2 , h , i , i2 , h2 , h3 , t ;
333+ /* 12 mul, 4 sqr, 11 add/negate/normalizes_to_zero (ignoring special cases) */
334+ secp256k1_fe z22 , z12 , u1 , u2 , s1 , s2 , h , i , h2 , h3 , t ;
335335
336336 if (a -> infinity ) {
337337 VERIFY_CHECK (rzr == NULL );
338338 * r = * b ;
339339 return ;
340340 }
341-
342341 if (b -> infinity ) {
343342 if (rzr != NULL ) {
344343 secp256k1_fe_set_int (rzr , 1 );
@@ -347,15 +346,14 @@ static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, cons
347346 return ;
348347 }
349348
350- r -> infinity = 0 ;
351349 secp256k1_fe_sqr (& z22 , & b -> z );
352350 secp256k1_fe_sqr (& z12 , & a -> z );
353351 secp256k1_fe_mul (& u1 , & a -> x , & z22 );
354352 secp256k1_fe_mul (& u2 , & b -> x , & z12 );
355353 secp256k1_fe_mul (& s1 , & a -> y , & z22 ); secp256k1_fe_mul (& s1 , & s1 , & b -> z );
356354 secp256k1_fe_mul (& s2 , & b -> y , & z12 ); secp256k1_fe_mul (& s2 , & s2 , & a -> z );
357355 secp256k1_fe_negate (& h , & u1 , 1 ); secp256k1_fe_add (& h , & u2 );
358- secp256k1_fe_negate (& i , & s1 , 1 ); secp256k1_fe_add (& i , & s2 );
356+ secp256k1_fe_negate (& i , & s2 , 1 ); secp256k1_fe_add (& i , & s1 );
359357 if (secp256k1_fe_normalizes_to_zero_var (& h )) {
360358 if (secp256k1_fe_normalizes_to_zero_var (& i )) {
361359 secp256k1_gej_double_var (r , a , rzr );
@@ -367,24 +365,33 @@ static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, cons
367365 }
368366 return ;
369367 }
370- secp256k1_fe_sqr (& i2 , & i );
371- secp256k1_fe_sqr (& h2 , & h );
372- secp256k1_fe_mul (& h3 , & h , & h2 );
373- secp256k1_fe_mul (& h , & h , & b -> z );
368+
369+ r -> infinity = 0 ;
370+ secp256k1_fe_mul (& t , & h , & b -> z );
374371 if (rzr != NULL ) {
375- * rzr = h ;
372+ * rzr = t ;
376373 }
377- secp256k1_fe_mul (& r -> z , & a -> z , & h );
374+ secp256k1_fe_mul (& r -> z , & a -> z , & t );
375+
376+ secp256k1_fe_sqr (& h2 , & h );
377+ secp256k1_fe_negate (& h2 , & h2 , 1 );
378+ secp256k1_fe_mul (& h3 , & h2 , & h );
378379 secp256k1_fe_mul (& t , & u1 , & h2 );
379- r -> x = t ; secp256k1_fe_mul_int (& r -> x , 2 ); secp256k1_fe_add (& r -> x , & h3 ); secp256k1_fe_negate (& r -> x , & r -> x , 3 ); secp256k1_fe_add (& r -> x , & i2 );
380- secp256k1_fe_negate (& r -> y , & r -> x , 5 ); secp256k1_fe_add (& r -> y , & t ); secp256k1_fe_mul (& r -> y , & r -> y , & i );
381- secp256k1_fe_mul (& h3 , & h3 , & s1 ); secp256k1_fe_negate (& h3 , & h3 , 1 );
380+
381+ secp256k1_fe_sqr (& r -> x , & i );
382+ secp256k1_fe_add (& r -> x , & h3 );
383+ secp256k1_fe_add (& r -> x , & t );
384+ secp256k1_fe_add (& r -> x , & t );
385+
386+ secp256k1_fe_add (& t , & r -> x );
387+ secp256k1_fe_mul (& r -> y , & t , & i );
388+ secp256k1_fe_mul (& h3 , & h3 , & s1 );
382389 secp256k1_fe_add (& r -> y , & h3 );
383390}
384391
385392static void secp256k1_gej_add_ge_var (secp256k1_gej * r , const secp256k1_gej * a , const secp256k1_ge * b , secp256k1_fe * rzr ) {
386- /* 8 mul, 3 sqr, 4 normalize, 12 mul_int/ add/negate */
387- secp256k1_fe z12 , u1 , u2 , s1 , s2 , h , i , i2 , h2 , h3 , t ;
393+ /* 8 mul, 3 sqr, 13 add/negate/normalize_weak/normalizes_to_zero (ignoring special cases) */
394+ secp256k1_fe z12 , u1 , u2 , s1 , s2 , h , i , h2 , h3 , t ;
388395 if (a -> infinity ) {
389396 VERIFY_CHECK (rzr == NULL );
390397 secp256k1_gej_set_ge (r , b );
@@ -397,15 +404,14 @@ static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, c
397404 * r = * a ;
398405 return ;
399406 }
400- r -> infinity = 0 ;
401407
402408 secp256k1_fe_sqr (& z12 , & a -> z );
403409 u1 = a -> x ; secp256k1_fe_normalize_weak (& u1 );
404410 secp256k1_fe_mul (& u2 , & b -> x , & z12 );
405411 s1 = a -> y ; secp256k1_fe_normalize_weak (& s1 );
406412 secp256k1_fe_mul (& s2 , & b -> y , & z12 ); secp256k1_fe_mul (& s2 , & s2 , & a -> z );
407413 secp256k1_fe_negate (& h , & u1 , 1 ); secp256k1_fe_add (& h , & u2 );
408- secp256k1_fe_negate (& i , & s1 , 1 ); secp256k1_fe_add (& i , & s2 );
414+ secp256k1_fe_negate (& i , & s2 , 1 ); secp256k1_fe_add (& i , & s1 );
409415 if (secp256k1_fe_normalizes_to_zero_var (& h )) {
410416 if (secp256k1_fe_normalizes_to_zero_var (& i )) {
411417 secp256k1_gej_double_var (r , a , rzr );
@@ -417,28 +423,33 @@ static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, c
417423 }
418424 return ;
419425 }
420- secp256k1_fe_sqr (& i2 , & i );
421- secp256k1_fe_sqr (& h2 , & h );
422- secp256k1_fe_mul (& h3 , & h , & h2 );
426+
427+ r -> infinity = 0 ;
423428 if (rzr != NULL ) {
424429 * rzr = h ;
425430 }
426431 secp256k1_fe_mul (& r -> z , & a -> z , & h );
432+
433+ secp256k1_fe_sqr (& h2 , & h );
434+ secp256k1_fe_negate (& h2 , & h2 , 1 );
435+ secp256k1_fe_mul (& h3 , & h2 , & h );
427436 secp256k1_fe_mul (& t , & u1 , & h2 );
428- r -> x = t ; secp256k1_fe_mul_int (& r -> x , 2 ); secp256k1_fe_add (& r -> x , & h3 ); secp256k1_fe_negate (& r -> x , & r -> x , 3 ); secp256k1_fe_add (& r -> x , & i2 );
429- secp256k1_fe_negate (& r -> y , & r -> x , 5 ); secp256k1_fe_add (& r -> y , & t ); secp256k1_fe_mul (& r -> y , & r -> y , & i );
430- secp256k1_fe_mul (& h3 , & h3 , & s1 ); secp256k1_fe_negate (& h3 , & h3 , 1 );
437+
438+ secp256k1_fe_sqr (& r -> x , & i );
439+ secp256k1_fe_add (& r -> x , & h3 );
440+ secp256k1_fe_add (& r -> x , & t );
441+ secp256k1_fe_add (& r -> x , & t );
442+
443+ secp256k1_fe_add (& t , & r -> x );
444+ secp256k1_fe_mul (& r -> y , & t , & i );
445+ secp256k1_fe_mul (& h3 , & h3 , & s1 );
431446 secp256k1_fe_add (& r -> y , & h3 );
432447}
433448
434449static void secp256k1_gej_add_zinv_var (secp256k1_gej * r , const secp256k1_gej * a , const secp256k1_ge * b , const secp256k1_fe * bzinv ) {
435- /* 9 mul, 3 sqr, 4 normalize, 12 mul_int/ add/negate */
436- secp256k1_fe az , z12 , u1 , u2 , s1 , s2 , h , i , i2 , h2 , h3 , t ;
450+ /* 9 mul, 3 sqr, 13 add/negate/normalize_weak/normalizes_to_zero (ignoring special cases) */
451+ secp256k1_fe az , z12 , u1 , u2 , s1 , s2 , h , i , h2 , h3 , t ;
437452
438- if (b -> infinity ) {
439- * r = * a ;
440- return ;
441- }
442453 if (a -> infinity ) {
443454 secp256k1_fe bzinv2 , bzinv3 ;
444455 r -> infinity = b -> infinity ;
@@ -449,7 +460,10 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a,
449460 secp256k1_fe_set_int (& r -> z , 1 );
450461 return ;
451462 }
452- r -> infinity = 0 ;
463+ if (b -> infinity ) {
464+ * r = * a ;
465+ return ;
466+ }
453467
454468 /** We need to calculate (rx,ry,rz) = (ax,ay,az) + (bx,by,1/bzinv). Due to
455469 * secp256k1's isomorphism we can multiply the Z coordinates on both sides
@@ -467,7 +481,7 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a,
467481 s1 = a -> y ; secp256k1_fe_normalize_weak (& s1 );
468482 secp256k1_fe_mul (& s2 , & b -> y , & z12 ); secp256k1_fe_mul (& s2 , & s2 , & az );
469483 secp256k1_fe_negate (& h , & u1 , 1 ); secp256k1_fe_add (& h , & u2 );
470- secp256k1_fe_negate (& i , & s1 , 1 ); secp256k1_fe_add (& i , & s2 );
484+ secp256k1_fe_negate (& i , & s2 , 1 ); secp256k1_fe_add (& i , & s1 );
471485 if (secp256k1_fe_normalizes_to_zero_var (& h )) {
472486 if (secp256k1_fe_normalizes_to_zero_var (& i )) {
473487 secp256k1_gej_double_var (r , a , NULL );
@@ -476,14 +490,23 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a,
476490 }
477491 return ;
478492 }
479- secp256k1_fe_sqr (& i2 , & i );
493+
494+ r -> infinity = 0 ;
495+ secp256k1_fe_mul (& r -> z , & a -> z , & h );
496+
480497 secp256k1_fe_sqr (& h2 , & h );
481- secp256k1_fe_mul ( & h3 , & h , & h2 );
482- r -> z = a -> z ; secp256k1_fe_mul (& r -> z , & r -> z , & h );
498+ secp256k1_fe_negate ( & h2 , & h2 , 1 );
499+ secp256k1_fe_mul (& h3 , & h2 , & h );
483500 secp256k1_fe_mul (& t , & u1 , & h2 );
484- r -> x = t ; secp256k1_fe_mul_int (& r -> x , 2 ); secp256k1_fe_add (& r -> x , & h3 ); secp256k1_fe_negate (& r -> x , & r -> x , 3 ); secp256k1_fe_add (& r -> x , & i2 );
485- secp256k1_fe_negate (& r -> y , & r -> x , 5 ); secp256k1_fe_add (& r -> y , & t ); secp256k1_fe_mul (& r -> y , & r -> y , & i );
486- secp256k1_fe_mul (& h3 , & h3 , & s1 ); secp256k1_fe_negate (& h3 , & h3 , 1 );
501+
502+ secp256k1_fe_sqr (& r -> x , & i );
503+ secp256k1_fe_add (& r -> x , & h3 );
504+ secp256k1_fe_add (& r -> x , & t );
505+ secp256k1_fe_add (& r -> x , & t );
506+
507+ secp256k1_fe_add (& t , & r -> x );
508+ secp256k1_fe_mul (& r -> y , & t , & i );
509+ secp256k1_fe_mul (& h3 , & h3 , & s1 );
487510 secp256k1_fe_add (& r -> y , & h3 );
488511}
489512
0 commit comments