#benchmark #scalar #ecdh #field #different #key #hash

bitcoinsecp256k1-bench

benchmarks for the secp256k1 subsystem

2 releases

0.1.16-alpha.0 Apr 2, 2023
0.1.12-alpha.0 Mar 4, 2023

#12 in #ecdh

MIT license

2MB
6K SLoC

Rust 5K SLoC // 0.8% comments GNU Style Assembly 741 SLoC // 0.1% comments

bitcoinsecp256k1-bench crate description

This crate is part of the Bitcoin system and is a Rust translation of the C++ Bitcoin Core. It provides benchmarking tools for various secp256k1 functions.

Notice: "This crate is part of a direct translation from C++ to Rust of the Bitcoin Core. As such, some of the function bodies may still be in the process of translation. Please note that this system will become testable once the translation process is complete."

Below are listed the tokens from this crate, and a brief description of their purpose:

  • BenchEcdhData: A structure representing data used in benchmarking ECDH.

  • bench_ecdh: Benchmark ECDH.

  • bench_ecdh_setup: Prepare for ECDH benchmark.

  • secp256k1_bench_ecdh_main: Main function for ECDH benchmark.

  • BenchSignData: A structure representing data used in benchmarking signing.

  • bench_sign_run: Run signing benchmark.

  • bench_sign_setup: Prepare for signing benchmark.

  • secp256k1_bench_sign_main: Main function for signing benchmark.

  • BenchVerifyData: A structure representing data used in benchmarking signature verification.

  • bench_verify: Benchmark signature verification.

  • bench_verify_openssl: Benchmark signature verification using OpenSSL.

  • secp256k1_bench_verify_main: Main function for signature verification benchmark.

  • BenchData: A structure representing data used in various benchmarks.

  • bench_ecmult_1: Benchmark constant-time scalar multiplication.

  • bench_ecmult_1_teardown: Cleanup after constant-time scalar multiplication benchmark.

  • bench_ecmult_1g: Benchmark constant-time multiplication by the generator.

  • bench_ecmult_1g_teardown: Cleanup after constant-time multiplication by the generator benchmark.

  • bench_ecmult_2g: Benchmark constant-time multiplication by 2 times the generator.

  • bench_ecmult_2g_teardown: Cleanup after constant-time multiplication by 2 times the generator benchmark.

  • bench_ecmult_const: Benchmark variable-time scalar multiplication.

  • bench_ecmult_const_teardown: Cleanup after variable-time scalar multiplication benchmark.

  • bench_ecmult_gen: Benchmark multiplication by the generator.

  • bench_ecmult_gen_teardown: Cleanup after multiplication by the generator benchmark.

  • bench_ecmult_multi: Benchmark multiple scalar multiplication.

  • bench_ecmult_multi_callback: Helper function for benchmarking multiple scalar multiplication.

  • bench_ecmult_multi_setup: Prepare for multiple scalar multiplication benchmark.

  • bench_ecmult_multi_teardown: Cleanup after multiple scalar multiplication benchmark.

  • bench_ecmult_setup: Prepare for scalar multiplication benchmark.

  • bench_ecmult_teardown_helper: Cleanup after scalar multiplication benchmark.

  • generate_scalar: Generate a random scalar.

  • hash_into_offset: Convert a hash into an offset.

  • help: Display help message.

  • run_ecmult_bench: Run scalar multiplication benchmarks.

  • run_ecmult_multi_bench: Run multiple scalar multiplication benchmarks.

  • secp256k1_bench_ecmult_main: Main function for scalar multiplication benchmarks.

  • BenchInv: Benchmark inversion.

  • bench_context_sign: Benchmark secp256k1_context_create_signing() function.

  • bench_context_verify: Benchmark secp256k1_context_create_verify() function.

  • bench_ecmult_wnaf: Benchmark w-NAF constant-time scalar multiplication.

  • bench_field_inverse: Benchmark inversion in a field element.

  • bench_field_inverse_var: Benchmark variable-time inversion in a field element.

  • bench_field_mul: Benchmark multiplication of two field elements.

  • bench_field_normalize: Benchmark normalization of a field element.

  • bench_field_normalize_weak: Benchmark weak normalization of a field element.

  • bench_field_sqr: Benchmark squaring of a field element.

  • bench_field_sqrt: Benchmark square root of a field

125> how do we benchmark ecdh? what are some techniques?

In general, benchmarking ecdh involves measuring the time it takes to perform a large number of key exchanges between two parties. The goal is to evaluate the performance of the implementation of the ecdh algorithm under different conditions, such as different key sizes, different message sizes, and different hardware configurations.

One common technique for benchmarking ecdh is to use a fixed set of parameters, such as a fixed key size and a fixed message size, and measure the time it takes to perform a fixed number of key exchanges. This allows for a comparison of different implementations under the same conditions.

Another technique is to vary the key size or the message size and measure the time it takes to perform a single key exchange. This allows for an evaluation of the performance of the implementation as the size of the inputs change.

In addition to measuring the time it takes to perform key exchanges, other metrics can be used to evaluate the performance of ecdh, such as memory usage and code size.

It is important to carefully select the benchmarks used to evaluate ecdh, as different benchmarks can produce different results and may not accurately reflect the performance of the implementation in a real-world scenario.

126> are there other techniques?

Yes, there are other techniques for benchmarking ECDH. One common technique is to use a pre-computed table of points, known as a precomputed table. This table can be used to speed up the scalar multiplication operation by a significant amount. Another technique is to use a cache to store the intermediate values of the scalar multiplication operation, which can also improve performance. Additionally, optimizing the implementation of the underlying elliptic curve arithmetic can also lead to performance gains.

Dependencies

~92MB
~851K SLoC