Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/tests.c
Show First 20 Lines • Show All 3,016 Lines • ▼ Show 20 Lines | for (i = 0; i < 16; ++i) { | ||||
secp256k1_scalar_shr_int(&num, 8); | secp256k1_scalar_shr_int(&num, 8); | ||||
} | } | ||||
#endif | #endif | ||||
skew = secp256k1_wnaf_fixed(wnaf, &num, w); | skew = secp256k1_wnaf_fixed(wnaf, &num, w); | ||||
for (i = WNAF_SIZE(w)-1; i >= 0; --i) { | for (i = WNAF_SIZE(w)-1; i >= 0; --i) { | ||||
secp256k1_scalar t; | secp256k1_scalar t; | ||||
int v = wnaf[i]; | int v = wnaf[i]; | ||||
CHECK(v != 0); /* check nonzero */ | CHECK(v == 0 || v & 1); /* check parity */ | ||||
CHECK(v & 1); /* check parity */ | |||||
CHECK(v > -(1 << w)); /* check range above */ | CHECK(v > -(1 << w)); /* check range above */ | ||||
CHECK(v < (1 << w)); /* check range below */ | CHECK(v < (1 << w)); /* check range below */ | ||||
secp256k1_scalar_mul(&x, &x, &shift); | secp256k1_scalar_mul(&x, &x, &shift); | ||||
if (v >= 0) { | if (v >= 0) { | ||||
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); | ||||
} | } | ||||
/* If skew is 1 then add 1 to num */ | /* If skew is 1 then add 1 to num */ | ||||
secp256k1_scalar_cadd_bit(&num, 0, skew == 1); | secp256k1_scalar_cadd_bit(&num, 0, skew == 1); | ||||
CHECK(secp256k1_scalar_eq(&x, &num)); | CHECK(secp256k1_scalar_eq(&x, &num)); | ||||
} | } | ||||
void test_fixed_wnaf_zero(int w) { | /* Checks that the first 8 elements of wnaf are equal to wnaf_expected and the | ||||
* rest is 0.*/ | |||||
void test_fixed_wnaf_small_helper(int *wnaf, int *wnaf_expected, int w) { | |||||
int i; | |||||
for (i = WNAF_SIZE(w)-1; i >= 8; --i) { | |||||
CHECK(wnaf[i] == 0); | |||||
} | |||||
for (i = 7; i >= 0; --i) { | |||||
CHECK(wnaf[i] == wnaf_expected[i]); | |||||
} | |||||
} | |||||
void test_fixed_wnaf_small(void) { | |||||
int w = 4; | |||||
int wnaf[256] = {0}; | int wnaf[256] = {0}; | ||||
int i; | int i; | ||||
int skew; | int skew; | ||||
secp256k1_scalar num; | secp256k1_scalar num; | ||||
secp256k1_scalar_set_int(&num, 0); | secp256k1_scalar_set_int(&num, 0); | ||||
skew = secp256k1_wnaf_fixed(wnaf, &num, w); | skew = secp256k1_wnaf_fixed(wnaf, &num, w); | ||||
for (i = WNAF_SIZE(w)-1; i >= 0; --i) { | for (i = WNAF_SIZE(w)-1; i >= 0; --i) { | ||||
int v = wnaf[i]; | int v = wnaf[i]; | ||||
CHECK(v == 0); | CHECK(v == 0); | ||||
} | } | ||||
CHECK(skew == 0); | CHECK(skew == 0); | ||||
secp256k1_scalar_set_int(&num, 1); | |||||
skew = secp256k1_wnaf_fixed(wnaf, &num, w); | |||||
for (i = WNAF_SIZE(w)-1; i >= 1; --i) { | |||||
int v = wnaf[i]; | |||||
CHECK(v == 0); | |||||
} | |||||
CHECK(wnaf[0] == 1); | |||||
CHECK(skew == 0); | |||||
{ | |||||
int wnaf_expected[8] = { 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf }; | |||||
secp256k1_scalar_set_int(&num, 0xffffffff); | |||||
skew = secp256k1_wnaf_fixed(wnaf, &num, w); | |||||
test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w); | |||||
CHECK(skew == 0); | |||||
} | |||||
{ | |||||
int wnaf_expected[8] = { -1, -1, -1, -1, -1, -1, -1, 0xf }; | |||||
secp256k1_scalar_set_int(&num, 0xeeeeeeee); | |||||
skew = secp256k1_wnaf_fixed(wnaf, &num, w); | |||||
test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w); | |||||
CHECK(skew == 1); | |||||
} | |||||
{ | |||||
int wnaf_expected[8] = { 1, 0, 1, 0, 1, 0, 1, 0 }; | |||||
secp256k1_scalar_set_int(&num, 0x01010101); | |||||
skew = secp256k1_wnaf_fixed(wnaf, &num, w); | |||||
test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w); | |||||
CHECK(skew == 0); | |||||
} | |||||
{ | |||||
int wnaf_expected[8] = { -0xf, 0, 0xf, -0xf, 0, 0xf, 1, 0 }; | |||||
secp256k1_scalar_set_int(&num, 0x01ef1ef1); | |||||
skew = secp256k1_wnaf_fixed(wnaf, &num, w); | |||||
test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w); | |||||
CHECK(skew == 0); | |||||
} | |||||
} | } | ||||
void run_wnaf(void) { | void run_wnaf(void) { | ||||
int i; | int i; | ||||
secp256k1_scalar n = {{0}}; | secp256k1_scalar n = {{0}}; | ||||
/* 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 0 */ | ||||
test_fixed_wnaf_zero(4); | 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 1,965 Lines • Show Last 20 Lines |