Skip to content

Commit 6d46e4e

Browse files
committed
Remove secp256k1_num_mul from num.h
This function isn't used anywhere and will cause test failures if we implement the full num.h API for a fixed-width 256-bit numeric type. We lose the unit test for secp256k1_scalar_mul_shift_var; we compensate by improving the unit test for secp256k1_scalar_split_lambda (which is the only user of this function) to test that the algebraic relation `N = s_lam * lambda + s_1` actually holds for the lambda decomposition.
1 parent 0591ed6 commit 6d46e4e

File tree

3 files changed

+10
-73
lines changed

3 files changed

+10
-73
lines changed

src/num.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,6 @@ static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, cons
4444
/** Subtract two (signed) numbers. */
4545
static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
4646

47-
/** Multiply two (signed) numbers. */
48-
static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b);
49-
5047
/** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1,
5148
even if r was negative. */
5249
static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m);

src/num_gmp_impl.h

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -204,33 +204,6 @@ static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, cons
204204
secp256k1_num_subadd(r, a, b, 1);
205205
}
206206

207-
static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) {
208-
mp_limb_t tmp[2*NUM_LIMBS+1];
209-
secp256k1_num_sanity(a);
210-
secp256k1_num_sanity(b);
211-
212-
VERIFY_CHECK(a->limbs + b->limbs <= 2*NUM_LIMBS+1);
213-
if ((a->limbs==1 && a->data[0]==0) || (b->limbs==1 && b->data[0]==0)) {
214-
r->limbs = 1;
215-
r->neg = 0;
216-
r->data[0] = 0;
217-
return;
218-
}
219-
if (a->limbs >= b->limbs) {
220-
mpn_mul(tmp, a->data, a->limbs, b->data, b->limbs);
221-
} else {
222-
mpn_mul(tmp, b->data, b->limbs, a->data, a->limbs);
223-
}
224-
r->limbs = a->limbs + b->limbs;
225-
if (r->limbs > 1 && tmp[r->limbs - 1]==0) {
226-
r->limbs--;
227-
}
228-
VERIFY_CHECK(r->limbs <= 2*NUM_LIMBS);
229-
mpn_copyi(r->data, tmp, r->limbs);
230-
r->neg = a->neg ^ b->neg;
231-
memset(tmp, 0, sizeof(tmp));
232-
}
233-
234207
static void secp256k1_num_shift(secp256k1_num_t *r, int bits) {
235208
int i;
236209
if (bits % GMP_NUMB_BITS) {

src/tests.c

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -436,23 +436,6 @@ void scalar_test(void) {
436436
CHECK(secp256k1_num_eq(&rnum, &r2num));
437437
}
438438

439-
{
440-
/* Test that multipying the scalars is equal to multiplying their numbers modulo the order. */
441-
secp256k1_scalar_t r;
442-
secp256k1_num_t r2num;
443-
secp256k1_num_t rnum;
444-
secp256k1_num_mul(&rnum, &snum, &s2num);
445-
secp256k1_num_mod(&rnum, &order);
446-
secp256k1_scalar_mul(&r, &s, &s2);
447-
secp256k1_scalar_get_num(&r2num, &r);
448-
CHECK(secp256k1_num_eq(&rnum, &r2num));
449-
/* The result can only be zero if at least one of the factors was zero. */
450-
CHECK(secp256k1_scalar_is_zero(&r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2)));
451-
/* The results can only be equal to one of the factors if that factor was zero, or the other factor was one. */
452-
CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2)));
453-
CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s)));
454-
}
455-
456439
{
457440
secp256k1_scalar_t neg;
458441
secp256k1_num_t negnum;
@@ -479,24 +462,6 @@ void scalar_test(void) {
479462
CHECK(secp256k1_scalar_is_zero(&neg));
480463
}
481464

482-
{
483-
/* Test secp256k1_scalar_mul_shift_var. */
484-
secp256k1_scalar_t r;
485-
secp256k1_num_t one;
486-
secp256k1_num_t rnum;
487-
secp256k1_num_t rnum2;
488-
unsigned char cone[1] = {0x01};
489-
unsigned int shift = 256 + (secp256k1_rand32() % 257);
490-
secp256k1_scalar_mul_shift_var(&r, &s1, &s2, shift);
491-
secp256k1_num_mul(&rnum, &s1num, &s2num);
492-
secp256k1_num_shift(&rnum, shift - 1);
493-
secp256k1_num_set_bin(&one, cone, 1);
494-
secp256k1_num_add(&rnum, &rnum, &one);
495-
secp256k1_num_shift(&rnum, 1);
496-
secp256k1_scalar_get_num(&rnum2, &r);
497-
CHECK(secp256k1_num_eq(&rnum, &rnum2));
498-
}
499-
500465
{
501466
/* test secp256k1_scalar_shr_int */
502467
secp256k1_scalar_t r;
@@ -1725,23 +1690,25 @@ void run_ecmult_gen_blind(void) {
17251690
/***** ENDOMORPHISH TESTS *****/
17261691
void test_scalar_split(void) {
17271692
secp256k1_scalar_t full;
1728-
secp256k1_scalar_t s1, slam;
1729-
const unsigned char zero[32] = {0};
1730-
unsigned char tmp[32];
1693+
secp256k1_scalar_t s1, slam, tmp;
1694+
secp256k1_scalar_t lambda = SECP256K1_SCALAR_CONST(
1695+
0x5363ad4c, 0xc05c30e0, 0xa5261c02, 0x8812645a,
1696+
0x122e22ea, 0x20816678, 0xdf02967c, 0x1b23bd72
1697+
);
17311698

17321699
random_scalar_order_test(&full);
17331700
secp256k1_scalar_split_lambda(&s1, &slam, &full);
17341701

1702+
/* check that they are a lambda decomposition */
1703+
secp256k1_scalar_mul(&tmp, &lambda, &slam);
1704+
secp256k1_scalar_add(&tmp, &tmp, &s1);
1705+
CHECK(secp256k1_scalar_eq(&tmp, &full));
1706+
17351707
/* check that both are <= 128 bits in size */
17361708
if (secp256k1_scalar_is_high(&s1))
17371709
secp256k1_scalar_negate(&s1, &s1);
17381710
if (secp256k1_scalar_is_high(&slam))
17391711
secp256k1_scalar_negate(&slam, &slam);
1740-
1741-
secp256k1_scalar_get_b32(tmp, &s1);
1742-
CHECK(memcmp(zero, tmp, 16) == 0);
1743-
secp256k1_scalar_get_b32(tmp, &slam);
1744-
CHECK(memcmp(zero, tmp, 16) == 0);
17451712
}
17461713

17471714
void run_endomorphism_tests(void) {

0 commit comments

Comments
 (0)