Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/tests.c
Show First 20 Lines • Show All 3,225 Lines • ▼ Show 20 Lines | |||||
void test_constant_wnaf(const secp256k1_scalar *number, int w) { | void test_constant_wnaf(const secp256k1_scalar *number, int w) { | ||||
secp256k1_scalar x, shift; | secp256k1_scalar x, shift; | ||||
int wnaf[256] = {0}; | int wnaf[256] = {0}; | ||||
int i; | int i; | ||||
int skew; | int skew; | ||||
int bits = 256; | int bits = 256; | ||||
secp256k1_scalar num = *number; | secp256k1_scalar num = *number; | ||||
secp256k1_scalar scalar_skew; | |||||
secp256k1_scalar_set_int(&x, 0); | secp256k1_scalar_set_int(&x, 0); | ||||
secp256k1_scalar_set_int(&shift, 1 << w); | secp256k1_scalar_set_int(&shift, 1 << w); | ||||
/* With USE_ENDOMORPHISM on we only consider 128-bit numbers */ | /* With USE_ENDOMORPHISM on we only consider 128-bit numbers */ | ||||
#ifdef USE_ENDOMORPHISM | #ifdef USE_ENDOMORPHISM | ||||
for (i = 0; i < 16; ++i) { | for (i = 0; i < 16; ++i) { | ||||
secp256k1_scalar_shr_int(&num, 8); | secp256k1_scalar_shr_int(&num, 8); | ||||
} | } | ||||
Show All 14 Lines | for (i = WNAF_SIZE_BITS(bits, w); i >= 0; --i) { | ||||
secp256k1_scalar_set_int(&t, v); | secp256k1_scalar_set_int(&t, v); | ||||
} else { | } else { | ||||
secp256k1_scalar_set_int(&t, -v); | secp256k1_scalar_set_int(&t, -v); | ||||
secp256k1_scalar_negate(&t, &t); | secp256k1_scalar_negate(&t, &t); | ||||
} | } | ||||
secp256k1_scalar_add(&x, &x, &t); | secp256k1_scalar_add(&x, &x, &t); | ||||
} | } | ||||
/* Skew num because when encoding numbers as odd we use an offset */ | /* Skew num because when encoding numbers as odd we use an offset */ | ||||
secp256k1_scalar_cadd_bit(&num, skew == 2, 1); | secp256k1_scalar_set_int(&scalar_skew, 1 << (skew == 2)); | ||||
secp256k1_scalar_add(&num, &num, &scalar_skew); | |||||
CHECK(secp256k1_scalar_eq(&x, &num)); | CHECK(secp256k1_scalar_eq(&x, &num)); | ||||
} | } | ||||
void test_fixed_wnaf(const secp256k1_scalar *number, int w) { | void test_fixed_wnaf(const secp256k1_scalar *number, int w) { | ||||
secp256k1_scalar x, shift; | secp256k1_scalar x, shift; | ||||
int wnaf[256] = {0}; | int wnaf[256] = {0}; | ||||
int i; | int i; | ||||
int skew; | int skew; | ||||
▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | CHECK(skew == 0); | ||||
CHECK(skew == 0); | CHECK(skew == 0); | ||||
} | } | ||||
} | } | ||||
void run_wnaf(void) { | void run_wnaf(void) { | ||||
int i; | int i; | ||||
secp256k1_scalar n = {{0}}; | secp256k1_scalar n = {{0}}; | ||||
test_constant_wnaf(&n, 4); | |||||
/* Sanity check: 1 and 2 are the smallest odd and even numbers and should | /* Sanity check: 1 and 2 are the smallest odd and even numbers and should | ||||
* have easier-to-diagnose failure modes */ | * have easier-to-diagnose failure modes */ | ||||
n.d[0] = 1; | n.d[0] = 1; | ||||
test_constant_wnaf(&n, 4); | test_constant_wnaf(&n, 4); | ||||
n.d[0] = 2; | n.d[0] = 2; | ||||
test_constant_wnaf(&n, 4); | test_constant_wnaf(&n, 4); | ||||
/* Test 0 */ | /* Test -1, because it's a special case in wnaf_const */ | ||||
n = secp256k1_scalar_one; | |||||
secp256k1_scalar_negate(&n, &n); | |||||
test_constant_wnaf(&n, 4); | |||||
/* Test -2, which may not lead to overflows in wnaf_const */ | |||||
secp256k1_scalar_add(&n, &secp256k1_scalar_one, &secp256k1_scalar_one); | |||||
secp256k1_scalar_negate(&n, &n); | |||||
test_constant_wnaf(&n, 4); | |||||
/* Test (1/2) - 1 = 1/-2 and 1/2 = (1/-2) + 1 | |||||
as corner cases of negation handling in wnaf_const */ | |||||
secp256k1_scalar_inverse(&n, &n); | |||||
test_constant_wnaf(&n, 4); | |||||
secp256k1_scalar_add(&n, &n, &secp256k1_scalar_one); | |||||
test_constant_wnaf(&n, 4); | |||||
/* Test 0 for fixed wnaf */ | |||||
test_fixed_wnaf_small(); | test_fixed_wnaf_small(); | ||||
/* Random tests */ | /* Random tests */ | ||||
for (i = 0; i < count; i++) { | for (i = 0; i < count; i++) { | ||||
random_scalar_order(&n); | random_scalar_order(&n); | ||||
test_wnaf(&n, 4+(i%10)); | test_wnaf(&n, 4+(i%10)); | ||||
test_constant_wnaf_negate(&n); | test_constant_wnaf_negate(&n); | ||||
test_constant_wnaf(&n, 4 + (i % 10)); | test_constant_wnaf(&n, 4 + (i % 10)); | ||||
test_fixed_wnaf(&n, 4 + (i % 10)); | test_fixed_wnaf(&n, 4 + (i % 10)); | ||||
▲ Show 20 Lines • Show All 2,225 Lines • Show Last 20 Lines |