scalar: restrict split_lambda args, improve doc and VERIFY_CHECKs
VERIFY_CHECK(r1 != r2) is added because otherwise the verify_scalar_split fails.
This commit is contained in:
parent
7f49aa7f2d
commit
eb6bebaee3
@ -88,9 +88,10 @@ static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar
|
|||||||
|
|
||||||
/** Find r1 and r2 such that r1+r2*2^128 = k. */
|
/** Find r1 and r2 such that r1+r2*2^128 = k. */
|
||||||
static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *k);
|
static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *k);
|
||||||
/** Find r1 and r2 such that r1+r2*lambda = k,
|
/** Find r1 and r2 such that r1+r2*lambda = k, where r1 and r2 or their
|
||||||
* where r1 and r2 or their negations are maximum 128 bits long (see secp256k1_ge_mul_lambda). */
|
* negations are maximum 128 bits long (see secp256k1_ge_mul_lambda). It is
|
||||||
static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *k);
|
* required that r1, r2, and k all point to different objects. */
|
||||||
|
static void secp256k1_scalar_split_lambda(secp256k1_scalar * SECP256K1_RESTRICT r1, secp256k1_scalar * SECP256K1_RESTRICT r2, const secp256k1_scalar * SECP256K1_RESTRICT k);
|
||||||
|
|
||||||
/** Multiply a and b (without taking the modulus!), divide by 2**shift, and round to the nearest integer. Shift must be at least 256. */
|
/** Multiply a and b (without taking the modulus!), divide by 2**shift, and round to the nearest integer. Shift must be at least 256. */
|
||||||
static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift);
|
static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift);
|
||||||
|
@ -52,7 +52,10 @@ static int secp256k1_scalar_set_b32_seckey(secp256k1_scalar *r, const unsigned c
|
|||||||
* nontrivial to get full test coverage for the exhaustive tests. We therefore
|
* nontrivial to get full test coverage for the exhaustive tests. We therefore
|
||||||
* (arbitrarily) set r2 = k + 5 (mod n) and r1 = k - r2 * lambda (mod n).
|
* (arbitrarily) set r2 = k + 5 (mod n) and r1 = k - r2 * lambda (mod n).
|
||||||
*/
|
*/
|
||||||
static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *k) {
|
static void secp256k1_scalar_split_lambda(secp256k1_scalar * SECP256K1_RESTRICT r1, secp256k1_scalar * SECP256K1_RESTRICT r2, const secp256k1_scalar * SECP256K1_RESTRICT k) {
|
||||||
|
VERIFY_CHECK(r1 != k);
|
||||||
|
VERIFY_CHECK(r2 != k);
|
||||||
|
VERIFY_CHECK(r1 != r2);
|
||||||
*r2 = (*k + 5) % EXHAUSTIVE_TEST_ORDER;
|
*r2 = (*k + 5) % EXHAUSTIVE_TEST_ORDER;
|
||||||
*r1 = (*k + (EXHAUSTIVE_TEST_ORDER - *r2) * EXHAUSTIVE_TEST_LAMBDA) % EXHAUSTIVE_TEST_ORDER;
|
*r1 = (*k + (EXHAUSTIVE_TEST_ORDER - *r2) * EXHAUSTIVE_TEST_LAMBDA) % EXHAUSTIVE_TEST_ORDER;
|
||||||
}
|
}
|
||||||
@ -119,7 +122,7 @@ static void secp256k1_scalar_split_lambda_verify(const secp256k1_scalar *r1, con
|
|||||||
*
|
*
|
||||||
* See proof below.
|
* See proof below.
|
||||||
*/
|
*/
|
||||||
static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *k) {
|
static void secp256k1_scalar_split_lambda(secp256k1_scalar * SECP256K1_RESTRICT r1, secp256k1_scalar * SECP256K1_RESTRICT r2, const secp256k1_scalar * SECP256K1_RESTRICT k) {
|
||||||
secp256k1_scalar c1, c2;
|
secp256k1_scalar c1, c2;
|
||||||
static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST(
|
static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST(
|
||||||
0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
|
0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,
|
||||||
@ -139,6 +142,7 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar
|
|||||||
);
|
);
|
||||||
VERIFY_CHECK(r1 != k);
|
VERIFY_CHECK(r1 != k);
|
||||||
VERIFY_CHECK(r2 != k);
|
VERIFY_CHECK(r2 != k);
|
||||||
|
VERIFY_CHECK(r1 != r2);
|
||||||
/* these _var calls are constant time since the shift amount is constant */
|
/* these _var calls are constant time since the shift amount is constant */
|
||||||
secp256k1_scalar_mul_shift_var(&c1, k, &g1, 384);
|
secp256k1_scalar_mul_shift_var(&c1, k, &g1, 384);
|
||||||
secp256k1_scalar_mul_shift_var(&c2, k, &g2, 384);
|
secp256k1_scalar_mul_shift_var(&c2, k, &g2, 384);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user