50 *ge = secp256k1_ge_const_g;
58 static void bench_ecmult(
void* arg) {
61 size_t count = data->
count;
63 size_t iters = 1 +
ITERS / count;
66 for (iter = 0; iter < iters; ++iter) {
73 static void bench_ecmult_setup(
void* arg) {
79 static void bench_ecmult_teardown(
void* arg) {
84 for (iter = 0; iter < iters; ++iter) {
87 CHECK(secp256k1_gej_is_infinity(&tmp));
93 unsigned char c[11] = {
'e',
'c',
'm',
'u',
'l',
't', 0, 0, 0, 0};
94 unsigned char buf[32];
100 secp256k1_sha256_initialize(&
sha256);
101 secp256k1_sha256_write(&
sha256, c,
sizeof(c));
102 secp256k1_sha256_finalize(&
sha256, buf);
103 secp256k1_scalar_set_b32(scalar, buf, &overflow);
107 static void run_test(
bench_data* data,
size_t count,
int includes_g) {
110 size_t iters = 1 +
ITERS / count;
119 for (iter = 0; iter < iters; ++iter) {
123 for (i = 0; i + 1 < count; ++i) {
125 secp256k1_scalar_add(&total, &total, &tmp);
127 secp256k1_scalar_negate(&total, &total);
132 sprintf(str, includes_g ?
"ecmult_%ig" :
"ecmult_%i", (
int)count);
133 run_benchmark(str, bench_ecmult, bench_ecmult_setup, bench_ecmult_teardown, data, 10, count * (1 +
ITERS / count));
144 printf(
"Using pippenger_wnaf:\n");
145 data.
ecmult_multi = secp256k1_ecmult_pippenger_batch_single;
147 printf(
"Using strauss_wnaf:\n");
148 data.
ecmult_multi = secp256k1_ecmult_strauss_batch_single;
166 secp256k1_gej_set_ge(&pubkeys_gej[0], &secp256k1_ge_const_g);
167 secp256k1_scalar_set_int(&data.
seckeys[0], 1);
168 for (i = 0; i <
POINTS; ++i) {
169 generate_scalar(i, &data.
scalars[i]);
171 secp256k1_gej_double_var(&pubkeys_gej[i], &pubkeys_gej[i - 1], NULL);
178 for (i = 1; i <= 8; ++i) {
179 run_test(&data, i, 1);
182 for (p = 0; p <= 11; ++p) {
183 for (i = 9; i <= 16; ++i) {
184 run_test(&data, i << p, 1);
int main(int argc, char **argv)
#define STRAUSS_SCRATCH_OBJECTS
int(* secp256k1_ecmult_multi_func)(const secp256k1_ecmult_context *, secp256k1_scratch *, secp256k1_gej *, const secp256k1_scalar *, secp256k1_ecmult_multi_callback cb, void *, size_t)
Internal SHA-256 implementation.
#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
int have_flag(int argc, char **argv, char *flag)
void run_benchmark(char *name, void(*benchmark)(void *), void(*setup)(void *), void(*teardown)(void *), void *data, int count, int iter)
#define SECP256K1_CONTEXT_SIGN
SECP256K1_API void secp256k1_scratch_space_destroy(secp256k1_scratch_space *scratch)
Destroy a secp256k1 scratch space.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT secp256k1_scratch_space * secp256k1_scratch_space_create(const secp256k1_context *ctx, size_t max_size) SECP256K1_ARG_NONNULL(1)
Create a secp256k1 scratch space object.
SECP256K1_API secp256k1_context * secp256k1_context_create(unsigned int flags) SECP256K1_WARN_UNUSED_RESULT
Create a secp256k1 context object.
#define SECP256K1_CONTEXT_VERIFY
Flags to pass to secp256k1_context_create.
SECP256K1_API void secp256k1_context_destroy(secp256k1_context *ctx)
Destroy a secp256k1 context object.
secp256k1_scalar * seckeys
secp256k1_ecmult_multi_func ecmult_multi
secp256k1_scratch_space * scratch
secp256k1_scalar * scalars
secp256k1_gej * expected_output
secp256k1_callback error_callback
secp256k1_ecmult_context ecmult_ctx
A group element of the secp256k1 curve, in affine coordinates.
A group element of the secp256k1 curve, in jacobian coordinates.
A scalar modulo the group order of the secp256k1 curve.