9 #include "../include/secp256k1.h" 26 unsigned char data[64];
33 static const unsigned char init[4][32] = {
37 0x02, 0x03, 0x05, 0x07, 0x0b, 0x0d, 0x11, 0x13,
38 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35,
39 0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59,
40 0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71, 0x7f, 0x83
45 0x82, 0x83, 0x85, 0x87, 0x8b, 0x8d, 0x81, 0x83,
46 0x97, 0xad, 0xaf, 0xb5, 0xb9, 0xbb, 0xbf, 0xc5,
47 0xdb, 0xdd, 0xe3, 0xe7, 0xe9, 0xef, 0xf3, 0xf9,
48 0x11, 0x15, 0x17, 0x1b, 0x1d, 0xb1, 0xbf, 0xd3
52 0x3d, 0x2d, 0xef, 0xf4, 0x25, 0x98, 0x4f, 0x5d,
53 0xe2, 0xca, 0x5f, 0x41, 0x3f, 0x3f, 0xce, 0x44,
54 0xaa, 0x2c, 0x53, 0x8a, 0xc6, 0x59, 0x1f, 0x38,
55 0x38, 0x23, 0xe4, 0x11, 0x27, 0xc6, 0xa0, 0xe7
59 0xbd, 0x21, 0xa5, 0xe1, 0x13, 0x50, 0x73, 0x2e,
60 0x52, 0x98, 0xc8, 0x9e, 0xab, 0x00, 0xa2, 0x68,
61 0x43, 0xf5, 0xd7, 0x49, 0x80, 0x72, 0xa7, 0xf3,
62 0xd7, 0x60, 0xe6, 0xab, 0x90, 0x92, 0xdf, 0xc5
79 memcpy(data->
data + 32,
init[1], 32);
86 for (i = 0; i < iters; i++) {
96 for (i = 0; i < iters; i++) {
105 for (i = 0; i < iters; i++) {
115 for (i = 0; i < iters; i++) {
126 for (i = 0; i < iters; i++) {
137 for (i = 0; i < iters; i++) {
148 for (i = 0; i < iters; i++) {
157 for (i = 0; i < iters; i++) {
166 for (i = 0; i < iters; i++) {
175 for (i = 0; i < iters; i++) {
184 for (i = 0; i < iters; i++) {
193 for (i = 0; i < iters; i++) {
203 for (i = 0; i < iters; i++) {
214 for (i = 0; i < iters; i++) {
227 for (i = 0; i < iters; i++) {
239 for (i = 0; i < iters; i++) {
248 for (i = 0; i < iters; i++) {
257 for (i = 0; i < iters; i++) {
266 for (i = 0; i < iters; i++) {
275 for (i = 0; i < iters; i++) {
284 for (i = 0; i < iters; ++i) {
301 int i, bits = 0, overflow = 0;
304 for (i = 0; i < iters; i++) {
308 CHECK(overflow >= 0);
309 CHECK(bits <= 256*iters);
313 int i, bits = 0, overflow = 0;
316 for (i = 0; i < iters; i++) {
320 CHECK(overflow >= 0);
321 CHECK(bits <= 256*iters);
329 for (i = 0; i < iters; i++) {
341 for (i = 0; i < iters; i++) {
353 for (i = 0; i < iters; i++) {
362 for (i = 0; i < iters; i++) {
367 int main(
int argc,
char **argv) {
373 if (d ||
have_flag(argc, argv,
"scalar") ||
have_flag(argc, argv,
"add"))
run_benchmark(
"scalar_add",
bench_scalar_add,
bench_setup, NULL, &data, 10, iters*100);
374 if (d ||
have_flag(argc, argv,
"scalar") ||
have_flag(argc, argv,
"negate"))
run_benchmark(
"scalar_negate",
bench_scalar_negate,
bench_setup, NULL, &data, 10, iters*100);
375 if (d ||
have_flag(argc, argv,
"scalar") ||
have_flag(argc, argv,
"mul"))
run_benchmark(
"scalar_mul",
bench_scalar_mul,
bench_setup, NULL, &data, 10, iters*10);
376 if (d ||
have_flag(argc, argv,
"scalar") ||
have_flag(argc, argv,
"split"))
run_benchmark(
"scalar_split",
bench_scalar_split,
bench_setup, NULL, &data, 10, iters);
377 if (d ||
have_flag(argc, argv,
"scalar") ||
have_flag(argc, argv,
"inverse"))
run_benchmark(
"scalar_inverse",
bench_scalar_inverse,
bench_setup, NULL, &data, 10, iters);
378 if (d ||
have_flag(argc, argv,
"scalar") ||
have_flag(argc, argv,
"inverse"))
run_benchmark(
"scalar_inverse_var",
bench_scalar_inverse_var,
bench_setup, NULL, &data, 10, iters);
380 if (d ||
have_flag(argc, argv,
"field") ||
have_flag(argc, argv,
"half"))
run_benchmark(
"field_half",
bench_field_half,
bench_setup, NULL, &data, 10, iters*100);
381 if (d ||
have_flag(argc, argv,
"field") ||
have_flag(argc, argv,
"normalize"))
run_benchmark(
"field_normalize",
bench_field_normalize,
bench_setup, NULL, &data, 10, iters*100);
382 if (d ||
have_flag(argc, argv,
"field") ||
have_flag(argc, argv,
"normalize"))
run_benchmark(
"field_normalize_weak",
bench_field_normalize_weak,
bench_setup, NULL, &data, 10, iters*100);
383 if (d ||
have_flag(argc, argv,
"field") ||
have_flag(argc, argv,
"sqr"))
run_benchmark(
"field_sqr",
bench_field_sqr,
bench_setup, NULL, &data, 10, iters*10);
384 if (d ||
have_flag(argc, argv,
"field") ||
have_flag(argc, argv,
"mul"))
run_benchmark(
"field_mul",
bench_field_mul,
bench_setup, NULL, &data, 10, iters*10);
385 if (d ||
have_flag(argc, argv,
"field") ||
have_flag(argc, argv,
"inverse"))
run_benchmark(
"field_inverse",
bench_field_inverse,
bench_setup, NULL, &data, 10, iters);
386 if (d ||
have_flag(argc, argv,
"field") ||
have_flag(argc, argv,
"inverse"))
run_benchmark(
"field_inverse_var",
bench_field_inverse_var,
bench_setup, NULL, &data, 10, iters);
387 if (d ||
have_flag(argc, argv,
"field") ||
have_flag(argc, argv,
"issquare"))
run_benchmark(
"field_is_square_var",
bench_field_is_square_var,
bench_setup, NULL, &data, 10, iters);
388 if (d ||
have_flag(argc, argv,
"field") ||
have_flag(argc, argv,
"sqrt"))
run_benchmark(
"field_sqrt",
bench_field_sqrt,
bench_setup, NULL, &data, 10, iters);
390 if (d ||
have_flag(argc, argv,
"group") ||
have_flag(argc, argv,
"double"))
run_benchmark(
"group_double_var",
bench_group_double_var,
bench_setup, NULL, &data, 10, iters*10);
391 if (d ||
have_flag(argc, argv,
"group") ||
have_flag(argc, argv,
"add"))
run_benchmark(
"group_add_var",
bench_group_add_var,
bench_setup, NULL, &data, 10, iters*10);
392 if (d ||
have_flag(argc, argv,
"group") ||
have_flag(argc, argv,
"add"))
run_benchmark(
"group_add_affine",
bench_group_add_affine,
bench_setup, NULL, &data, 10, iters*10);
393 if (d ||
have_flag(argc, argv,
"group") ||
have_flag(argc, argv,
"add"))
run_benchmark(
"group_add_affine_var",
bench_group_add_affine_var,
bench_setup, NULL, &data, 10, iters*10);
394 if (d ||
have_flag(argc, argv,
"group") ||
have_flag(argc, argv,
"add"))
run_benchmark(
"group_add_zinv_var",
bench_group_add_zinv_var,
bench_setup, NULL, &data, 10, iters*10);
395 if (d ||
have_flag(argc, argv,
"group") ||
have_flag(argc, argv,
"to_affine"))
run_benchmark(
"group_to_affine_var",
bench_group_to_affine_var,
bench_setup, NULL, &data, 10, iters);
397 if (d ||
have_flag(argc, argv,
"ecmult") ||
have_flag(argc, argv,
"wnaf"))
run_benchmark(
"wnaf_const",
bench_wnaf_const,
bench_setup, NULL, &data, 10, iters);
398 if (d ||
have_flag(argc, argv,
"ecmult") ||
have_flag(argc, argv,
"wnaf"))
run_benchmark(
"ecmult_wnaf",
bench_ecmult_wnaf,
bench_setup, NULL, &data, 10, iters);
400 if (d ||
have_flag(argc, argv,
"hash") ||
have_flag(argc, argv,
"sha256"))
run_benchmark(
"hash_sha256",
bench_sha256,
bench_setup, NULL, &data, 10, iters);
401 if (d ||
have_flag(argc, argv,
"hash") ||
have_flag(argc, argv,
"hmac"))
run_benchmark(
"hash_hmac_sha256",
bench_hmac_sha256,
bench_setup, NULL, &data, 10, iters);
402 if (d ||
have_flag(argc, argv,
"hash") ||
have_flag(argc, argv,
"rng6979"))
run_benchmark(
"hash_rfc6979_hmac_sha256",
bench_rfc6979_hmac_sha256,
bench_setup, NULL, &data, 10, iters);
static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b)
Multiply two scalars (modulo the group order).
static void bench_scalar_split(void *arg, int iters)
static void bench_field_mul(void *arg, int iters)
This field implementation represents the value as 10 uint32_t limbs in base 2^26. ...
static void bench_group_add_affine(void *arg, int iters)
static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr)
Set r equal to the sum of a and b.
static int secp256k1_fe_sqrt(secp256k1_fe *SECP256K1_RESTRICT r, const secp256k1_fe *SECP256K1_RESTRICT a)
Compute a square root of a field element.
#define secp256k1_fe_set_b32_limit
static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen)
#define secp256k1_fe_inv_var
secp256k1_scalar scalar[2]
static void secp256k1_scalar_split_lambda(secp256k1_scalar *SECP256K1_RESTRICT r1, secp256k1_scalar *SECP256K1_RESTRICT r2, const secp256k1_scalar *SECP256K1_RESTRICT k)
Find r1 and r2 such that r1+r2*lambda = k, where r1 and r2 or their negations are maximum 128 bits lo...
static void bench_field_normalize_weak(void *arg, int iters)
static void bench_scalar_mul(void *arg, int iters)
static void bench_field_is_square_var(void *arg, int iters)
static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a)
Set a group element equal to another which is given in jacobian coordinates.
static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t size)
#define SECP256K1_CONTEXT_NONE
Context flags to pass to secp256k1_context_create, secp256k1_context_preallocated_size, and secp256k1_context_preallocated_create.
#define secp256k1_fe_is_square_var
#define secp256k1_fe_half
static void run_benchmark(char *name, void(*benchmark)(void *), void(*setup)(void *), void(*teardown)(void *), void *data, int count, int iter)
static void bench_sha256(void *arg, int iters)
#define secp256k1_fe_normalize_weak
static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a)
Compute the complement of a scalar (modulo the group order).
static void bench_field_sqrt(void *arg, int iters)
static void bench_setup(void *arg)
static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv)
Set r equal to the sum of a and b (with the inverse of b's Z coordinate passed as bzinv)...
SECP256K1_API void secp256k1_context_destroy(secp256k1_context *ctx) SECP256K1_ARG_NONNULL(1)
Destroy a secp256k1 context object (created in dynamically allocated memory).
static int secp256k1_wnaf_const(int *wnaf, const secp256k1_scalar *scalar, int w, int size)
Convert a number to WNAF notation.
static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *bin, int *overflow)
Set a scalar from a big endian byte array.
A group element of the secp256k1 curve, in jacobian coordinates.
static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr)
Set r equal to the sum of a and b (with b given in affine coordinates).
static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr)
Set r equal to the double of a.
static void bench_field_sqr(void *arg, int iters)
static void bench_group_double_var(void *arg, int iters)
static void bench_scalar_add(void *arg, int iters)
static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *a)
Compute the inverse of a scalar (modulo the group order).
static void bench_wnaf_const(void *arg, int iters)
static int get_iters(int default_iters)
static int have_flag(int argc, char **argv, char *flag)
static void bench_scalar_inverse_var(void *arg, int iters)
static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size)
static void bench_group_to_affine_var(void *arg, int iters)
#define CHECK(cond)
Unconditional failure on condition failure.
static void bench_field_half(void *arg, int iters)
static void bench_field_normalize(void *arg, int iters)
A group element in affine coordinates on the secp256k1 curve, or occasionally on an isomorphic curve ...
static void bench_rfc6979_hmac_sha256(void *arg, int iters)
static void bench_field_inverse(void *arg, int iters)
static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32)
A scalar modulo the group order of the secp256k1 curve.
static void bench_group_add_affine_var(void *arg, int iters)
static void bench_group_add_zinv_var(void *arg, int iters)
static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t size)
static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd)
Set a group element (affine) equal to the point with the given X coordinate, and given oddness for Y...
static void bench_scalar_negate(void *arg, int iters)
static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *b)
Rescale a jacobian point by b which must be non-zero.
static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b)
Add two scalars together (modulo the group order).
static void bench_field_inverse_var(void *arg, int iters)
static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *a)
Compute the inverse of a scalar (modulo the group order), without constant-time guarantee.
#define secp256k1_fe_normalize
#define secp256k1_fe_normalize_var
static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b)
Set r equal to the sum of a and b (with b given in affine coordinates, and not infinity).
int main(int argc, char **argv)
static void secp256k1_sha256_initialize(secp256k1_sha256 *hash)
static void print_output_table_header_row(void)
static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a)
Set a group element (jacobian) equal to another which is given in affine coordinates.
static int secp256k1_ecmult_wnaf(int *wnaf, int len, const secp256k1_scalar *a, int w)
Convert a number to WNAF notation.
static void bench_ecmult_wnaf(void *arg, int iters)
static void bench_group_add_var(void *arg, int iters)
SECP256K1_API secp256k1_context * secp256k1_context_create(unsigned int flags) SECP256K1_WARN_UNUSED_RESULT
Create a secp256k1 context object (in dynamically allocated memory).
static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32)
static void bench_hmac_sha256(void *arg, int iters)
static void bench_scalar_inverse(void *arg, int iters)
static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen)
static void bench_context(void *arg, int iters)