Skip to content

Commit 4a5aae9

Browse files
committed
Merge bitcoin#28634: test: BIP324: add check for detection of missing garbage terminator
3bb51c2 test: BIP324: add check for missing garbage terminator detection (Sebastian Falbesoner) Pull request description: This PR adds test coverage for the "missing garbage terminator" detection on incoming v2 transport (BIP324) connections: https://github.com/bitcoin/bitcoin/blob/04265ba9378efbd4c35b33390b1e5cf246d420a9/src/net.cpp#L1205-L1209 Note that this always happens at the same exact amount of bytes sent in (after 64 + 4095 + 16 = 4175 bytes), if at no point, the last 16 bytes of potential authentication data match the garbage, i.e. all the previous bytes after the ellswift pubkey. To keep it simple, we just send in zero-value bytes here and verify that the detection hits exactly after the last bytes is sent. AFAICT, with this PR all the v2 transport errors that can be triggered in this simple way of "just open a socket and send in a fixed byte-string" are covered. For more advanced test, we need BIP324 cryptography in the test framework in order to perform a v2 handshake etc. (PRs bitcoin#28374, bitcoin#24748). ACKs for top commit: sipa: utACK 3bb51c2 laanwj: ACK 3bb51c2 Tree-SHA512: f88275061c7c377a3d9f2608452671afc26deb6d5bd5be596de987c7e5042555153ffe681760c33bce2b921ae04e50f349ea0128a677e6443a95a079e52cdc5f
2 parents ccf7895 + 3bb51c2 commit 4a5aae9

File tree

1 file changed

+13
-0
lines changed

1 file changed

+13
-0
lines changed

test/functional/p2p_v2_transport.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,19 @@ def run_test(self):
148148
with self.nodes[0].assert_debug_log("V2 transport error: V1 peer with wrong MessageStart"):
149149
s.sendall(wrong_network_magic_prefix + b"somepayload")
150150

151+
# Check detection of missing garbage terminator (hits after fixed amount of data if terminator never matches garbage)
152+
MAX_KEY_GARB_AND_GARBTERM_LEN = 64 + 4095 + 16
153+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
154+
num_peers = len(self.nodes[0].getpeerinfo())
155+
s.connect(("127.0.0.1", p2p_port(0)))
156+
self.wait_until(lambda: len(self.nodes[0].getpeerinfo()) == num_peers + 1)
157+
s.sendall(b'\x00' * (MAX_KEY_GARB_AND_GARBTERM_LEN - 1))
158+
self.wait_until(lambda: self.nodes[0].getpeerinfo()[-1]["bytesrecv"] == MAX_KEY_GARB_AND_GARBTERM_LEN - 1)
159+
with self.nodes[0].assert_debug_log("V2 transport error: missing garbage terminator"):
160+
s.sendall(b'\x00') # send out last byte
161+
# should disconnect immediately
162+
self.wait_until(lambda: len(self.nodes[0].getpeerinfo()) == num_peers)
163+
151164

152165
if __name__ == '__main__':
153166
V2TransportTest().main()

0 commit comments

Comments
 (0)