@@ -330,15 +330,14 @@ static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, s
330
330
}
331
331
332
332
static 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 ;
335
335
336
336
if (a -> infinity ) {
337
337
VERIFY_CHECK (rzr == NULL );
338
338
* r = * b ;
339
339
return ;
340
340
}
341
-
342
341
if (b -> infinity ) {
343
342
if (rzr != NULL ) {
344
343
secp256k1_fe_set_int (rzr , 1 );
@@ -347,15 +346,14 @@ static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, cons
347
346
return ;
348
347
}
349
348
350
- r -> infinity = 0 ;
351
349
secp256k1_fe_sqr (& z22 , & b -> z );
352
350
secp256k1_fe_sqr (& z12 , & a -> z );
353
351
secp256k1_fe_mul (& u1 , & a -> x , & z22 );
354
352
secp256k1_fe_mul (& u2 , & b -> x , & z12 );
355
353
secp256k1_fe_mul (& s1 , & a -> y , & z22 ); secp256k1_fe_mul (& s1 , & s1 , & b -> z );
356
354
secp256k1_fe_mul (& s2 , & b -> y , & z12 ); secp256k1_fe_mul (& s2 , & s2 , & a -> z );
357
355
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 );
359
357
if (secp256k1_fe_normalizes_to_zero_var (& h )) {
360
358
if (secp256k1_fe_normalizes_to_zero_var (& i )) {
361
359
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
367
365
}
368
366
return ;
369
367
}
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 );
374
371
if (rzr != NULL ) {
375
- * rzr = h ;
372
+ * rzr = t ;
376
373
}
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 );
378
379
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 );
382
389
secp256k1_fe_add (& r -> y , & h3 );
383
390
}
384
391
385
392
static 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 ;
388
395
if (a -> infinity ) {
389
396
VERIFY_CHECK (rzr == NULL );
390
397
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
397
404
* r = * a ;
398
405
return ;
399
406
}
400
- r -> infinity = 0 ;
401
407
402
408
secp256k1_fe_sqr (& z12 , & a -> z );
403
409
u1 = a -> x ; secp256k1_fe_normalize_weak (& u1 );
404
410
secp256k1_fe_mul (& u2 , & b -> x , & z12 );
405
411
s1 = a -> y ; secp256k1_fe_normalize_weak (& s1 );
406
412
secp256k1_fe_mul (& s2 , & b -> y , & z12 ); secp256k1_fe_mul (& s2 , & s2 , & a -> z );
407
413
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 );
409
415
if (secp256k1_fe_normalizes_to_zero_var (& h )) {
410
416
if (secp256k1_fe_normalizes_to_zero_var (& i )) {
411
417
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
417
423
}
418
424
return ;
419
425
}
420
- secp256k1_fe_sqr (& i2 , & i );
421
- secp256k1_fe_sqr (& h2 , & h );
422
- secp256k1_fe_mul (& h3 , & h , & h2 );
426
+
427
+ r -> infinity = 0 ;
423
428
if (rzr != NULL ) {
424
429
* rzr = h ;
425
430
}
426
431
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 );
427
436
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 );
431
446
secp256k1_fe_add (& r -> y , & h3 );
432
447
}
433
448
434
449
static 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 ;
437
452
438
- if (b -> infinity ) {
439
- * r = * a ;
440
- return ;
441
- }
442
453
if (a -> infinity ) {
443
454
secp256k1_fe bzinv2 , bzinv3 ;
444
455
r -> infinity = b -> infinity ;
@@ -449,7 +460,10 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a,
449
460
secp256k1_fe_set_int (& r -> z , 1 );
450
461
return ;
451
462
}
452
- r -> infinity = 0 ;
463
+ if (b -> infinity ) {
464
+ * r = * a ;
465
+ return ;
466
+ }
453
467
454
468
/** We need to calculate (rx,ry,rz) = (ax,ay,az) + (bx,by,1/bzinv). Due to
455
469
* 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,
467
481
s1 = a -> y ; secp256k1_fe_normalize_weak (& s1 );
468
482
secp256k1_fe_mul (& s2 , & b -> y , & z12 ); secp256k1_fe_mul (& s2 , & s2 , & az );
469
483
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 );
471
485
if (secp256k1_fe_normalizes_to_zero_var (& h )) {
472
486
if (secp256k1_fe_normalizes_to_zero_var (& i )) {
473
487
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,
476
490
}
477
491
return ;
478
492
}
479
- secp256k1_fe_sqr (& i2 , & i );
493
+
494
+ r -> infinity = 0 ;
495
+ secp256k1_fe_mul (& r -> z , & a -> z , & h );
496
+
480
497
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 );
483
500
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 );
487
510
secp256k1_fe_add (& r -> y , & h3 );
488
511
}
489
512
0 commit comments