aboutsummaryrefslogtreecommitdiff
path: root/src/net.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net.cpp')
-rw-r--r--src/net.cpp27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/net.cpp b/src/net.cpp
index 25f390961b..e75089c8e9 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -987,20 +987,26 @@ V2Transport::V2Transport(NodeId nodeid, bool initiating, int type_in, int versio
m_recv_state{initiating ? RecvState::KEY : RecvState::KEY_MAYBE_V1},
m_send_state{initiating ? SendState::AWAITING_KEY : SendState::MAYBE_V1}
{
- // Initialize the send buffer with ellswift pubkey.
- m_send_buffer.resize(EllSwiftPubKey::size());
+ // Construct garbage (including its length) using a FastRandomContext.
+ 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()));
}
-V2Transport::V2Transport(NodeId nodeid, bool initiating, int type_in, int version_in, const CKey& key, Span<const std::byte> ent32) noexcept :
+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},
m_recv_state{initiating ? RecvState::KEY : RecvState::KEY_MAYBE_V1},
m_send_state{initiating ? SendState::AWAITING_KEY : SendState::MAYBE_V1}
{
- // Initialize the send buffer with ellswift pubkey.
- m_send_buffer.resize(EllSwiftPubKey::size());
+ assert(garbage.size() <= MAX_GARBAGE_LEN);
+ // Initialize the send buffer with ellswift pubkey + provided garbage.
+ m_send_buffer.resize(EllSwiftPubKey::size() + garbage.size());
std::copy(std::begin(m_cipher.GetOurPubKey()), std::end(m_cipher.GetOurPubKey()), MakeWritableByteSpan(m_send_buffer).begin());
+ std::copy(garbage.begin(), garbage.end(), m_send_buffer.begin() + EllSwiftPubKey::size());
}
void V2Transport::SetReceiveState(RecvState recv_state) noexcept
@@ -1126,16 +1132,18 @@ void V2Transport::ProcessReceivedKeyBytes() noexcept
SetSendState(SendState::READY);
// Append the garbage terminator to the send buffer.
+ size_t garbage_len = m_send_buffer.size() - EllSwiftPubKey::size();
m_send_buffer.resize(m_send_buffer.size() + BIP324Cipher::GARBAGE_TERMINATOR_LEN);
std::copy(m_cipher.GetSendGarbageTerminator().begin(),
m_cipher.GetSendGarbageTerminator().end(),
MakeWritableByteSpan(m_send_buffer).last(BIP324Cipher::GARBAGE_TERMINATOR_LEN).begin());
- // Construct garbage authentication packet in the send buffer.
+ // Construct garbage authentication packet in the send buffer (using the garbage data which
+ // is still there).
m_send_buffer.resize(m_send_buffer.size() + BIP324Cipher::EXPANSION);
m_cipher.Encrypt(
/*contents=*/{},
- /*aad=*/{}, /* empty garbage for now */
+ /*aad=*/MakeByteSpan(m_send_buffer).subspan(EllSwiftPubKey::size(), garbage_len),
/*ignore=*/false,
/*output=*/MakeWritableByteSpan(m_send_buffer).last(BIP324Cipher::EXPANSION));
@@ -1490,7 +1498,10 @@ void V2Transport::MarkBytesSent(size_t bytes_sent) noexcept
m_send_pos += bytes_sent;
Assume(m_send_pos <= m_send_buffer.size());
- if (m_send_pos == m_send_buffer.size()) {
+ // Only wipe the buffer when everything is sent in the READY state. In the AWAITING_KEY state
+ // we still need the garbage that's in the send buffer to construct the garbage authentication
+ // packet.
+ if (m_send_state == SendState::READY && m_send_pos == m_send_buffer.size()) {
m_send_pos = 0;
m_send_buffer = {};
}