Skip to content

Commit 6ecbc9f

Browse files
committed
Reorder comments/function around scalar_split_lambda
1 parent 2edc514 commit 6ecbc9f

File tree

1 file changed

+48
-47
lines changed

1 file changed

+48
-47
lines changed

src/scalar_impl.h

Lines changed: 48 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,13 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar
279279
#else
280280
/**
281281
* 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+
/*
285289
* Both lambda and beta are primitive cube roots of unity. That is lamba^3 == 1 mod n and
286290
* beta^3 == 1 mod p, where n is the curve order and p is the field order.
287291
*
@@ -329,7 +333,47 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar
329333
* - either r1 < 2^128 or -r1 mod n < 2^128
330334
* - either r2 < 2^128 or -r2 mod n < 2^128
331335
*
332-
* Proof.
336+
* See proof below.
337+
*/
338+
static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *k) {
339+
secp256k1_scalar c1, c2;
340+
static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST(
341+
0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
342+
0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C3UL
343+
);
344+
static const secp256k1_scalar minus_b2 = SECP256K1_SCALAR_CONST(
345+
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL,
346+
0x8A280AC5UL, 0x0774346DUL, 0xD765CDA8UL, 0x3DB1562CUL
347+
);
348+
static const secp256k1_scalar g1 = SECP256K1_SCALAR_CONST(
349+
0x3086D221UL, 0xA7D46BCDUL, 0xE86C90E4UL, 0x9284EB15UL,
350+
0x3DAA8A14UL, 0x71E8CA7FUL, 0xE893209AUL, 0x45DBB031UL
351+
);
352+
static const secp256k1_scalar g2 = SECP256K1_SCALAR_CONST(
353+
0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C4UL,
354+
0x221208ACUL, 0x9DF506C6UL, 0x1571B4AEUL, 0x8AC47F71UL
355+
);
356+
VERIFY_CHECK(r1 != k);
357+
VERIFY_CHECK(r2 != k);
358+
/* these _var calls are constant time since the shift amount is constant */
359+
secp256k1_scalar_mul_shift_var(&c1, k, &g1, 384);
360+
secp256k1_scalar_mul_shift_var(&c2, k, &g2, 384);
361+
secp256k1_scalar_mul(&c1, &c1, &minus_b1);
362+
secp256k1_scalar_mul(&c2, &c2, &minus_b2);
363+
secp256k1_scalar_add(r2, &c1, &c2);
364+
secp256k1_scalar_mul(r1, r2, &secp256k1_const_lambda);
365+
secp256k1_scalar_negate(r1, r1);
366+
secp256k1_scalar_add(r1, r1, k);
367+
368+
#ifdef VERIFY
369+
secp256k1_scalar_split_lambda_verify(r1, r2, k);
370+
#endif
371+
}
372+
#endif
373+
374+
#ifdef VERIFY
375+
/*
376+
* Proof for secp256k1_scalar_split_lambda's bounds.
333377
*
334378
* Let
335379
* - epsilon1 = 2^256 * |g1/2^384 - b2/d|
@@ -432,13 +476,6 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar
432476
*
433477
* Q.E.D.
434478
*/
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
442479
static void secp256k1_scalar_split_lambda_verify(const secp256k1_scalar *r1, const secp256k1_scalar *r2, const secp256k1_scalar *k) {
443480
secp256k1_scalar s;
444481
unsigned char buf1[32];
@@ -472,40 +509,4 @@ static void secp256k1_scalar_split_lambda_verify(const secp256k1_scalar *r1, con
472509
}
473510
#endif
474511

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
510-
511512
#endif /* SECP256K1_SCALAR_IMPL_H */

0 commit comments

Comments
 (0)