aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Wuille <pieter@wuille.net>2023-09-08 11:48:09 -0400
committerPieter Wuille <pieter@wuille.net>2023-09-10 16:11:52 -0400
commitb6934fd03f080d437acb1fd2b665503c3d6de785 (patch)
tree908f31869071c72d6f2c2b7a0fc382c40706bd7b
parentc5a63ea56f8347139bd84e1669b378ecfb234c3c (diff)
downloadbitcoin-b6934fd03f080d437acb1fd2b665503c3d6de785.tar.xz
net: merge V2Transport constructors, move key gen
This removes the ability for BIP324Cipher to generate its own key, moving that responsibility to the caller (mostly, V2Transport). This allows us to write the random-key V2Transport constructor by delegating to the explicit-key one.
-rw-r--r--src/bip324.cpp7
-rw-r--r--src/bip324.h4
-rw-r--r--src/net.cpp29
-rw-r--r--src/test/net_tests.cpp9
4 files changed, 28 insertions, 21 deletions
diff --git a/src/bip324.cpp b/src/bip324.cpp
index 314e756829..f579a25193 100644
--- a/src/bip324.cpp
+++ b/src/bip324.cpp
@@ -22,13 +22,6 @@
#include <iterator>
#include <string>
-BIP324Cipher::BIP324Cipher() noexcept
-{
- m_key.MakeNewKey(true);
- uint256 entropy = GetRandHash();
- m_our_pubkey = m_key.EllSwiftCreate(MakeByteSpan(entropy));
-}
-
BIP324Cipher::BIP324Cipher(const CKey& key, Span<const std::byte> ent32) noexcept :
m_key(key)
{
diff --git a/src/bip324.h b/src/bip324.h
index 0238c479c0..28e7c411ea 100644
--- a/src/bip324.h
+++ b/src/bip324.h
@@ -41,8 +41,8 @@ private:
std::array<std::byte, GARBAGE_TERMINATOR_LEN> m_recv_garbage_terminator;
public:
- /** Initialize a BIP324 cipher with securely generated random keys. */
- BIP324Cipher() noexcept;
+ /** No default constructor; keys must be provided to create a BIP324Cipher. */
+ BIP324Cipher() = delete;
/** Initialize a BIP324 cipher with specified key and encoding entropy (testing only). */
BIP324Cipher(const CKey& key, Span<const std::byte> ent32) noexcept;
diff --git a/src/net.cpp b/src/net.cpp
index 3955005dfa..98ca7c2bed 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -979,23 +979,24 @@ public:
const V2MessageMap V2_MESSAGE_MAP;
-} // namespace
+CKey GenerateRandomKey() noexcept
+{
+ CKey key;
+ key.MakeNewKey(/*fCompressed=*/true);
+ return key;
+}
-V2Transport::V2Transport(NodeId nodeid, bool initiating, int type_in, int version_in) noexcept :
- m_cipher{}, m_initiating{initiating}, m_nodeid{nodeid},
- m_v1_fallback{nodeid, type_in, version_in}, m_recv_type{type_in}, m_recv_version{version_in},
- m_recv_state{initiating ? RecvState::KEY : RecvState::KEY_MAYBE_V1},
- m_send_state{initiating ? SendState::AWAITING_KEY : SendState::MAYBE_V1}
+std::vector<uint8_t> GenerateRandomGarbage() noexcept
{
- // Construct garbage (including its length) using a FastRandomContext.
+ std::vector<uint8_t> ret;
FastRandomContext rng;
- size_t garbage_len = rng.randrange(MAX_GARBAGE_LEN + 1);
- // Initialize the send buffer with ellswift pubkey + garbage.
- m_send_buffer.resize(EllSwiftPubKey::size() + garbage_len);
- std::copy(std::begin(m_cipher.GetOurPubKey()), std::end(m_cipher.GetOurPubKey()), MakeWritableByteSpan(m_send_buffer).begin());
- rng.fillrand(MakeWritableByteSpan(m_send_buffer).subspan(EllSwiftPubKey::size()));
+ ret.resize(rng.randrange(V2Transport::MAX_GARBAGE_LEN + 1));
+ rng.fillrand(MakeWritableByteSpan(ret));
+ return ret;
}
+} // namespace
+
V2Transport::V2Transport(NodeId nodeid, bool initiating, int type_in, int version_in, const CKey& key, Span<const std::byte> ent32, Span<const uint8_t> garbage) noexcept :
m_cipher{key, ent32}, m_initiating{initiating}, m_nodeid{nodeid},
m_v1_fallback{nodeid, type_in, version_in}, m_recv_type{type_in}, m_recv_version{version_in},
@@ -1009,6 +1010,10 @@ V2Transport::V2Transport(NodeId nodeid, bool initiating, int type_in, int versio
std::copy(garbage.begin(), garbage.end(), m_send_buffer.begin() + EllSwiftPubKey::size());
}
+V2Transport::V2Transport(NodeId nodeid, bool initiating, int type_in, int version_in) noexcept :
+ V2Transport{nodeid, initiating, type_in, version_in, GenerateRandomKey(),
+ MakeByteSpan(GetRandHash()), GenerateRandomGarbage()} { }
+
void V2Transport::SetReceiveState(RecvState recv_state) noexcept
{
AssertLockHeld(m_recv_mutex);
diff --git a/src/test/net_tests.cpp b/src/test/net_tests.cpp
index 900e311d22..eac8e8146a 100644
--- a/src/test/net_tests.cpp
+++ b/src/test/net_tests.cpp
@@ -1008,6 +1008,14 @@ BOOST_AUTO_TEST_CASE(advertise_local_address)
namespace {
+CKey GenerateRandomTestKey() noexcept
+{
+ CKey key;
+ uint256 key_data = InsecureRand256();
+ key.Set(key_data.begin(), key_data.end(), true);
+ return key;
+}
+
/** A class for scenario-based tests of V2Transport
*
* Each V2TransportTester encapsulates a V2Transport (the one being tested), and can be told to
@@ -1031,6 +1039,7 @@ public:
/** Construct a tester object. test_initiator: whether the tested transport is initiator. */
V2TransportTester(bool test_initiator) :
m_transport(0, test_initiator, SER_NETWORK, INIT_PROTO_VERSION),
+ m_cipher{GenerateRandomTestKey(), MakeByteSpan(InsecureRand256())},
m_test_initiator(test_initiator) {}
/** Data type returned by Interact: