@@ -279,9 +279,17 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar
279
279
#else
280
280
/**
281
281
* The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where
282
- * lambda is {0x53,0x63,0xad,0x4c,0xc0,0x5c,0x30,0xe0,0xa5,0x26,0x1c,0x02,0x88,0x12,0x64,0x5a,
283
- * 0x12,0x2e,0x22,0xea,0x20,0x81,0x66,0x78,0xdf,0x02,0x96,0x7c,0x1b,0x23,0xbd,0x72}
284
- *
282
+ * lambda is: */
283
+ static const secp256k1_scalar secp256k1_const_lambda = SECP256K1_SCALAR_CONST (
284
+ 0x5363AD4CUL , 0xC05C30E0UL , 0xA5261C02UL , 0x8812645AUL ,
285
+ 0x122E22EAUL , 0x20816678UL , 0xDF02967CUL , 0x1B23BD72UL
286
+ );
287
+
288
+ #ifdef VERIFY
289
+ static void secp256k1_scalar_split_lambda_verify (const secp256k1_scalar * r1 , const secp256k1_scalar * r2 , const secp256k1_scalar * k );
290
+ #endif
291
+
292
+ /*
285
293
* Both lambda and beta are primitive cube roots of unity. That is lamba^3 == 1 mod n and
286
294
* beta^3 == 1 mod p, where n is the curve order and p is the field order.
287
295
*
@@ -329,7 +337,46 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar
329
337
* - either r1 < 2^128 or -r1 mod n < 2^128
330
338
* - either r2 < 2^128 or -r2 mod n < 2^128
331
339
*
332
- * Proof.
340
+ * See proof below.
341
+ */
342
+ static void secp256k1_scalar_split_lambda (secp256k1_scalar * r1 , secp256k1_scalar * r2 , const secp256k1_scalar * k ) {
343
+ secp256k1_scalar c1 , c2 ;
344
+ static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST (
345
+ 0x00000000UL , 0x00000000UL , 0x00000000UL , 0x00000000UL ,
346
+ 0xE4437ED6UL , 0x010E8828UL , 0x6F547FA9UL , 0x0ABFE4C3UL
347
+ );
348
+ static const secp256k1_scalar minus_b2 = SECP256K1_SCALAR_CONST (
349
+ 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFEUL ,
350
+ 0x8A280AC5UL , 0x0774346DUL , 0xD765CDA8UL , 0x3DB1562CUL
351
+ );
352
+ static const secp256k1_scalar g1 = SECP256K1_SCALAR_CONST (
353
+ 0x3086D221UL , 0xA7D46BCDUL , 0xE86C90E4UL , 0x9284EB15UL ,
354
+ 0x3DAA8A14UL , 0x71E8CA7FUL , 0xE893209AUL , 0x45DBB031UL
355
+ );
356
+ static const secp256k1_scalar g2 = SECP256K1_SCALAR_CONST (
357
+ 0xE4437ED6UL , 0x010E8828UL , 0x6F547FA9UL , 0x0ABFE4C4UL ,
358
+ 0x221208ACUL , 0x9DF506C6UL , 0x1571B4AEUL , 0x8AC47F71UL
359
+ );
360
+ VERIFY_CHECK (r1 != k );
361
+ VERIFY_CHECK (r2 != k );
362
+ /* these _var calls are constant time since the shift amount is constant */
363
+ secp256k1_scalar_mul_shift_var (& c1 , k , & g1 , 384 );
364
+ secp256k1_scalar_mul_shift_var (& c2 , k , & g2 , 384 );
365
+ secp256k1_scalar_mul (& c1 , & c1 , & minus_b1 );
366
+ secp256k1_scalar_mul (& c2 , & c2 , & minus_b2 );
367
+ secp256k1_scalar_add (r2 , & c1 , & c2 );
368
+ secp256k1_scalar_mul (r1 , r2 , & secp256k1_const_lambda );
369
+ secp256k1_scalar_negate (r1 , r1 );
370
+ secp256k1_scalar_add (r1 , r1 , k );
371
+
372
+ #ifdef VERIFY
373
+ secp256k1_scalar_split_lambda_verify (r1 , r2 , k );
374
+ #endif
375
+ }
376
+
377
+ #ifdef VERIFY
378
+ /*
379
+ * Proof for secp256k1_scalar_split_lambda's bounds.
333
380
*
334
381
* Let
335
382
* - epsilon1 = 2^256 * |g1/2^384 - b2/d|
@@ -432,13 +479,6 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar
432
479
*
433
480
* Q.E.D.
434
481
*/
435
-
436
- static const secp256k1_scalar secp256k1_const_lambda = SECP256K1_SCALAR_CONST (
437
- 0x5363AD4CUL , 0xC05C30E0UL , 0xA5261C02UL , 0x8812645AUL ,
438
- 0x122E22EAUL , 0x20816678UL , 0xDF02967CUL , 0x1B23BD72UL
439
- );
440
-
441
- #ifdef VERIFY
442
482
static void secp256k1_scalar_split_lambda_verify (const secp256k1_scalar * r1 , const secp256k1_scalar * r2 , const secp256k1_scalar * k ) {
443
483
secp256k1_scalar s ;
444
484
unsigned char buf1 [32 ];
@@ -470,42 +510,7 @@ static void secp256k1_scalar_split_lambda_verify(const secp256k1_scalar *r1, con
470
510
secp256k1_scalar_get_b32 (buf2 , & s );
471
511
VERIFY_CHECK (secp256k1_memcmp_var (buf1 , k2_bound , 32 ) < 0 || secp256k1_memcmp_var (buf2 , k2_bound , 32 ) < 0 );
472
512
}
473
- #endif
474
-
475
- static void secp256k1_scalar_split_lambda (secp256k1_scalar * r1 , secp256k1_scalar * r2 , const secp256k1_scalar * k ) {
476
- secp256k1_scalar c1 , c2 ;
477
- static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST (
478
- 0x00000000UL , 0x00000000UL , 0x00000000UL , 0x00000000UL ,
479
- 0xE4437ED6UL , 0x010E8828UL , 0x6F547FA9UL , 0x0ABFE4C3UL
480
- );
481
- static const secp256k1_scalar minus_b2 = SECP256K1_SCALAR_CONST (
482
- 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFFUL , 0xFFFFFFFEUL ,
483
- 0x8A280AC5UL , 0x0774346DUL , 0xD765CDA8UL , 0x3DB1562CUL
484
- );
485
- static const secp256k1_scalar g1 = SECP256K1_SCALAR_CONST (
486
- 0x3086D221UL , 0xA7D46BCDUL , 0xE86C90E4UL , 0x9284EB15UL ,
487
- 0x3DAA8A14UL , 0x71E8CA7FUL , 0xE893209AUL , 0x45DBB031UL
488
- );
489
- static const secp256k1_scalar g2 = SECP256K1_SCALAR_CONST (
490
- 0xE4437ED6UL , 0x010E8828UL , 0x6F547FA9UL , 0x0ABFE4C4UL ,
491
- 0x221208ACUL , 0x9DF506C6UL , 0x1571B4AEUL , 0x8AC47F71UL
492
- );
493
- VERIFY_CHECK (r1 != k );
494
- VERIFY_CHECK (r2 != k );
495
- /* these _var calls are constant time since the shift amount is constant */
496
- secp256k1_scalar_mul_shift_var (& c1 , k , & g1 , 384 );
497
- secp256k1_scalar_mul_shift_var (& c2 , k , & g2 , 384 );
498
- secp256k1_scalar_mul (& c1 , & c1 , & minus_b1 );
499
- secp256k1_scalar_mul (& c2 , & c2 , & minus_b2 );
500
- secp256k1_scalar_add (r2 , & c1 , & c2 );
501
- secp256k1_scalar_mul (r1 , r2 , & secp256k1_const_lambda );
502
- secp256k1_scalar_negate (r1 , r1 );
503
- secp256k1_scalar_add (r1 , r1 , k );
504
-
505
- #ifdef VERIFY
506
- secp256k1_scalar_split_lambda_verify (r1 , r2 , k );
507
- #endif
508
- }
509
- #endif
513
+ #endif /* VERIFY */
514
+ #endif /* !defined(EXHAUSTIVE_TEST_ORDER) */
510
515
511
516
#endif /* SECP256K1_SCALAR_IMPL_H */
0 commit comments