Rename ECDH benchmark -> ECDHComputeKey and add ECDHKeyGen. This makes clearer what the benchmarks measure, and also allows tracking keygen performance separately as well. This is a follow-up to commit ed2f7e8c26006ff9284279702708797b46d590d6. Overview: ``` -------------------------------------------------------------------------------- Benchmark Time CPU Iterations -------------------------------------------------------------------------------- BM_SpeedECDHKeyGen/p224/threads:1 86029 ns 86029 ns 8127 BM_SpeedECDHKeyGen/p256/threads:1 7060 ns 7058 ns 98374 BM_SpeedECDHKeyGen/p384/threads:1 309585 ns 309301 ns 2267 BM_SpeedECDHKeyGen/p521/threads:1 776386 ns 775704 ns 899 BM_SpeedECDHComputeKey/p224/threads:1 91222 ns 91195 ns 7664 BM_SpeedECDHComputeKey/p256/threads:1 39382 ns 39329 ns 17586 BM_SpeedECDHComputeKey/p384/threads:1 333345 ns 333123 ns 2092 BM_SpeedECDHComputeKey/p521/threads:1 848211 ns 846023 ns 828 BM_SpeedECDHEphemeral/p224/threads:1 183712 ns 183670 ns 3809 BM_SpeedECDHEphemeral/p256/threads:1 50315 ns 50290 ns 13886 BM_SpeedECDHEphemeral/p384/threads:1 666594 ns 666588 ns 1046 BM_SpeedECDHEphemeral/p521/threads:1 1692489 ns 1692147 ns 414 ``` Change-Id: I562a6b51dd4d75dc559a70375b437f416a6a6964 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/101087 Auto-Submit: Rudolf Polzer <rpolzer@google.com> Commit-Queue: David Benjamin <davidben@google.com> Reviewed-by: David Benjamin <davidben@google.com>
diff --git a/bench/ecdh.cc b/bench/ecdh.cc index 07ea2ee..71099a8 100644 --- a/bench/ecdh.cc +++ b/bench/ecdh.cc
@@ -30,7 +30,20 @@ static constexpr size_t kMaxCoordinateSize = 66; static constexpr size_t kMaxPointBytes = 1 + 2 * kMaxCoordinateSize; -void BM_SpeedECDH(benchmark::State &state, const EC_GROUP *group) { +void BM_SpeedECDHKeyGen(benchmark::State &state, const EC_GROUP *group) { + for (auto _ : state) { + UniquePtr<EC_KEY> key(EC_KEY_new()); + if (!key || !EC_KEY_set_group(key.get(), group) || + !EC_KEY_generate_key(key.get())) { + state.SkipWithError("self keygen failed."); + return; + } + + benchmark::DoNotOptimize(key.get()); + } +} + +void BM_SpeedECDHComputeKey(benchmark::State &state, const EC_GROUP *group) { UniquePtr<EC_KEY> peer_key(EC_KEY_new()); if (!peer_key || !EC_KEY_set_group(peer_key.get(), group) || !EC_KEY_generate_key(peer_key.get())) { @@ -109,6 +122,7 @@ benchmark::ClobberMemory(); // Generate an ephemeral keypair. + // This part is basically `EC_KEY_generate_key`. UniquePtr<BIGNUM> priv(BN_new()); UniquePtr<EC_POINT> pub(EC_POINT_new(group)); if (!priv || !pub || @@ -119,6 +133,7 @@ return; } + // Serialize the public key to bytes. ScopedCBB cbb; if (!CBB_init(cbb.get(), kMaxPointBytes) || !EC_POINT_point2cbb(cbb.get(), group, pub.get(), @@ -128,7 +143,7 @@ } benchmark::DoNotOptimize(CBB_data(cbb.get())); - // Parse the peer's public key point and compute the shared secret. + // Parse the peer's public key point. UniquePtr<EC_POINT> peer_point(EC_POINT_new(group)); UniquePtr<EC_POINT> result(EC_POINT_new(group)); UniquePtr<BIGNUM> x(BN_new()); @@ -145,6 +160,8 @@ return; } + // Compute the shared secret. + // This part is basically `ECDH_compute_key`. if (!EC_POINT_mul(group, result.get(), nullptr, peer_point.get(), priv.get(), nullptr) || !EC_POINT_get_affine_coordinates_GFp(group, result.get(), x.get(), @@ -164,13 +181,22 @@ } BSSL_BENCH_LAZY_REGISTER() { - BENCHMARK_CAPTURE(BM_SpeedECDH, p224, EC_group_p224()) + BENCHMARK_CAPTURE(BM_SpeedECDHKeyGen, p224, EC_group_p224()) ->Apply(bench::SetThreads); - BENCHMARK_CAPTURE(BM_SpeedECDH, p256, EC_group_p256()) + BENCHMARK_CAPTURE(BM_SpeedECDHKeyGen, p256, EC_group_p256()) ->Apply(bench::SetThreads); - BENCHMARK_CAPTURE(BM_SpeedECDH, p384, EC_group_p384()) + BENCHMARK_CAPTURE(BM_SpeedECDHKeyGen, p384, EC_group_p384()) ->Apply(bench::SetThreads); - BENCHMARK_CAPTURE(BM_SpeedECDH, p521, EC_group_p521()) + BENCHMARK_CAPTURE(BM_SpeedECDHKeyGen, p521, EC_group_p521()) + ->Apply(bench::SetThreads); + + BENCHMARK_CAPTURE(BM_SpeedECDHComputeKey, p224, EC_group_p224()) + ->Apply(bench::SetThreads); + BENCHMARK_CAPTURE(BM_SpeedECDHComputeKey, p256, EC_group_p256()) + ->Apply(bench::SetThreads); + BENCHMARK_CAPTURE(BM_SpeedECDHComputeKey, p384, EC_group_p384()) + ->Apply(bench::SetThreads); + BENCHMARK_CAPTURE(BM_SpeedECDHComputeKey, p521, EC_group_p521()) ->Apply(bench::SetThreads); BENCHMARK_CAPTURE(BM_SpeedECDHEphemeral, p224, EC_group_p224())