Bitcoin Core  27.99.0
P2P Digital Currency
bip324_ecdh.cpp
Go to the documentation of this file.
1 // Copyright (c) 2022 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <bench/bench.h>
6 
7 #include <key.h>
8 #include <pubkey.h>
9 #include <random.h>
10 #include <span.h>
11 
12 #include <array>
13 #include <cstddef>
14 
15 static void BIP324_ECDH(benchmark::Bench& bench)
16 {
17  ECC_Start();
19 
20  std::array<std::byte, 32> key_data;
21  std::array<std::byte, EllSwiftPubKey::size()> our_ellswift_data;
22  std::array<std::byte, EllSwiftPubKey::size()> their_ellswift_data;
23 
24  rng.fillrand(key_data);
25  rng.fillrand(our_ellswift_data);
26  rng.fillrand(their_ellswift_data);
27 
28  bench.batch(1).unit("ecdh").run([&] {
29  CKey key;
30  key.Set(key_data.data(), key_data.data() + 32, true);
31  EllSwiftPubKey our_ellswift(our_ellswift_data);
32  EllSwiftPubKey their_ellswift(their_ellswift_data);
33 
34  auto ret = key.ComputeBIP324ECDHSecret(their_ellswift, our_ellswift, true);
35 
36  // To make sure that the computation is not the same on every iteration (ellswift decoding
37  // is variable-time), distribute bytes from the shared secret over the 3 inputs. The most
38  // important one is their_ellswift, because that one is actually decoded, so it's given most
39  // bytes. The data is copied into the middle, so that both halves are affected:
40  // - Copy 8 bytes from the resulting shared secret into middle of the private key.
41  std::copy(ret.begin(), ret.begin() + 8, key_data.begin() + 12);
42  // - Copy 8 bytes from the resulting shared secret into the middle of our ellswift key.
43  std::copy(ret.begin() + 8, ret.begin() + 16, our_ellswift_data.begin() + 28);
44  // - Copy 16 bytes from the resulting shared secret into the middle of their ellswift key.
45  std::copy(ret.begin() + 16, ret.end(), their_ellswift_data.begin() + 24);
46  });
47 
48  ECC_Stop();
49 }
50 
BENCHMARK(BIP324_ECDH, benchmark::PriorityLevel::HIGH)
static void BIP324_ECDH(benchmark::Bench &bench)
Definition: bip324_ecdh.cpp:15
int ret
ECC_Start()
Definition: key.cpp:435
ECC_Stop()
Definition: key.cpp:452
An encapsulated private key.
Definition: key.h:33
ECDHSecret ComputeBIP324ECDHSecret(const EllSwiftPubKey &their_ellswift, const EllSwiftPubKey &our_ellswift, bool initiating) const
Compute a BIP324-style ECDH shared secret.
Definition: key.cpp:352
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
Definition: key.h:99
Fast randomness source.
Definition: random.h:145
void fillrand(Span< std::byte > output)
Fill a byte Span with random bytes.
Definition: random.cpp:682
Main entry point to nanobench's benchmarking facility.
Definition: nanobench.h:627
Bench & run(char const *benchmarkName, Op &&op)
Repeatedly calls op() based on the configuration, and performs measurements.
Definition: nanobench.h:1234
Bench & batch(T b) noexcept
Sets the batch size.
Definition: nanobench.h:1258
Bench & unit(char const *unit)
Sets the operation unit.
@ HIGH
Definition: bench.h:47
An ElligatorSwift-encoded public key.
Definition: pubkey.h:305
static constexpr size_t size()
Definition: pubkey.h:322