void test_wnaf(const secp256k1_scalar_t *number, int w) { secp256k1_scalar_t x, two, t; secp256k1_scalar_set_int(&x, 0); secp256k1_scalar_set_int(&two, 2); int wnaf[256]; int bits = secp256k1_ecmult_wnaf(wnaf, number, w); CHECK(bits <= 256); int zeroes = -1; for (int i=bits-1; i>=0; i--) { secp256k1_scalar_mul(&x, &x, &two); int v = wnaf[i]; if (v) { CHECK(zeroes == -1 || zeroes >= w-1); /* check that distance between non-zero elements is at least w-1 */ zeroes=0; CHECK((v & 1) == 1); /* check non-zero elements are odd */ CHECK(v <= (1 << (w-1)) - 1); /* check range below */ CHECK(v >= -(1 << (w-1)) - 1); /* check range above */ } else { CHECK(zeroes != -1); /* check that no unnecessary zero padding exists */ zeroes++; } if (v >= 0) { secp256k1_scalar_set_int(&t, v); } else { secp256k1_scalar_set_int(&t, -v); secp256k1_scalar_negate(&t, &t); } secp256k1_scalar_add(&x, &x, &t); } CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */ }
void test_wnaf(const secp256k1_num_t *number, int w) { secp256k1_num_t x, two, t; secp256k1_num_init(&x); secp256k1_num_init(&two); secp256k1_num_init(&t); secp256k1_num_set_int(&x, 0); secp256k1_num_set_int(&two, 2); int wnaf[257]; int bits = secp256k1_ecmult_wnaf(wnaf, number, w); int zeroes = -1; for (int i=bits-1; i>=0; i--) { secp256k1_num_mul(&x, &x, &two); int v = wnaf[i]; if (v) { assert(zeroes == -1 || zeroes >= w-1); // check that distance between non-zero elements is at least w-1 zeroes=0; assert((v & 1) == 1); // check non-zero elements are odd assert(v <= (1 << (w-1)) - 1); // check range below assert(v >= -(1 << (w-1)) - 1); // check range above } else { assert(zeroes != -1); // check that no unnecessary zero padding exists zeroes++; } secp256k1_num_set_int(&t, v); secp256k1_num_add(&x, &x, &t); } assert(secp256k1_num_cmp(&x, number) == 0); // check that wnaf represents number secp256k1_num_free(&x); secp256k1_num_free(&two); secp256k1_num_free(&t); }
void bench_ecmult_wnaf(void* arg) { int i; bench_inv_t *data = (bench_inv_t*)arg; for (i = 0; i < 20000; i++) { secp256k1_ecmult_wnaf(data->wnaf, 256, &data->scalar_x, WINDOW_A); secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); } }