diff options
author | fanquake <fanquake@gmail.com> | 2023-09-07 16:10:34 +0100 |
---|---|---|
committer | fanquake <fanquake@gmail.com> | 2023-09-07 16:22:16 +0100 |
commit | 238d29aff9b43234e340a9cf17742b2be5d1e97d (patch) | |
tree | 9a7d8a19ab1d10f0f2114e826340366e5c088c0d | |
parent | 0354206a3004199648784e16eef60d2ef4d69e17 (diff) | |
parent | 1580e3be83bd03985b2f288ed70de510903068d9 (diff) | |
download | bitcoin-238d29aff9b43234e340a9cf17742b2be5d1e97d.tar.xz |
Merge bitcoin/bitcoin#28361: fuzz: add ConstructPubKeyBytes util function
1580e3be83bd03985b2f288ed70de510903068d9 fuzz: add ConstructPubKeyBytes function (josibake)
Pull request description:
In https://github.com/bitcoin/bitcoin/pull/28246 and https://github.com/bitcoin/bitcoin/pull/28122 , we add a `PubKeyDestination` and a `V0SilentPaymentsDestination`. Both of these PRs update `fuzz/util.cpp` and need a way to create well-formed pubkeys. Currently in `fuzz/util.cpp`, we have some logic for creating pubkeys in the multisig data provider. This logic is duplicated in #28246 and duplicated again in #28122. Seems much better to have a `ConstructPubKeyBytes` function that both PRs (and any future work) can reuse.
This PR introduces a function to do this and has the existing code use it. While the purpose is to introduce a utility function, the previous multisig code used `ConsumeIntegralInRange(4, 7)` which would have created some uncompressed pubkeys with the prefix 0x05, which is incorrect (see https://bitcoin.stackexchange.com/questions/57855/c-secp256k1-what-do-prefixes-0x06-and-0x07-in-an-uncompressed-public-key-signif)
tldr; using `PickValueFromArray` is more correct as it limits to the set of defined prefixes for compressed and uncompressed pubkeys.
ACKs for top commit:
Sjors:
ACK 1580e3be83bd03985b2f288ed70de510903068d9
Tree-SHA512: c87c8bcd1f6b3a97ef772be93102efb912811c59f32211cfd531a116f1da8a57c8c6ff106b34f2a2b88d8b34fb5bc30d9f9ed6d2720113ffcaaa2f8d5dc9eb27
-rw-r--r-- | src/test/fuzz/util.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/test/fuzz/util.cpp b/src/test/fuzz/util.cpp index cffe3e1f06..ca2218e94c 100644 --- a/src/test/fuzz/util.cpp +++ b/src/test/fuzz/util.cpp @@ -14,6 +14,19 @@ #include <memory> +std::vector<uint8_t> ConstructPubKeyBytes(FuzzedDataProvider& fuzzed_data_provider, Span<const uint8_t> byte_data, const bool compressed) noexcept +{ + uint8_t pk_type; + if (compressed) { + pk_type = fuzzed_data_provider.PickValueInArray({0x02, 0x03}); + } else { + pk_type = fuzzed_data_provider.PickValueInArray({0x04, 0x06, 0x07}); + } + std::vector<uint8_t> pk_data{byte_data.begin(), byte_data.begin() + (compressed ? CPubKey::COMPRESSED_SIZE : CPubKey::SIZE)}; + pk_data[0] = pk_type; + return pk_data; +} + CAmount ConsumeMoney(FuzzedDataProvider& fuzzed_data_provider, const std::optional<CAmount>& max) noexcept { return fuzzed_data_provider.ConsumeIntegralInRange<CAmount>(0, max.value_or(MAX_MONEY)); @@ -103,16 +116,12 @@ CScript ConsumeScript(FuzzedDataProvider& fuzzed_data_provider, const bool maybe // navigate the highly structured multisig format. r_script << fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(0, 22); int num_data{fuzzed_data_provider.ConsumeIntegralInRange(1, 22)}; - std::vector<uint8_t> pubkey_comp{buffer.begin(), buffer.begin() + CPubKey::COMPRESSED_SIZE}; - pubkey_comp.front() = fuzzed_data_provider.ConsumeIntegralInRange(2, 3); // Set first byte for GetLen() to pass - std::vector<uint8_t> pubkey_uncomp{buffer.begin(), buffer.begin() + CPubKey::SIZE}; - pubkey_uncomp.front() = fuzzed_data_provider.ConsumeIntegralInRange(4, 7); // Set first byte for GetLen() to pass while (num_data--) { - auto& pubkey{fuzzed_data_provider.ConsumeBool() ? pubkey_uncomp : pubkey_comp}; + auto pubkey_bytes{ConstructPubKeyBytes(fuzzed_data_provider, buffer, fuzzed_data_provider.ConsumeBool())}; if (fuzzed_data_provider.ConsumeBool()) { - pubkey.back() = num_data; // Make each pubkey different + pubkey_bytes.back() = num_data; // Make each pubkey different } - r_script << pubkey; + r_script << pubkey_bytes; } r_script << fuzzed_data_provider.ConsumeIntegralInRange<int64_t>(0, 22); }, |