Skip to content

Commit b062556

Browse files
committed
test: Check that non empty version packet is ignored and no disconnection happens
This test type is represented using SEND_NON_EMPTY_VERSION_PACKET.
1 parent f5be6e6 commit b062556

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

test/functional/p2p_v2_misbehaving.py

+20-4
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@ class TestType(Enum):
2525
3. WRONG_GARBAGE_TERMINATOR - Disconnection happens when incorrect garbage terminator is sent
2626
4. WRONG_GARBAGE - Disconnection happens when garbage bytes that is sent is different from what the peer receives
2727
5. SEND_NO_AAD - Disconnection happens when AAD of first encrypted packet after the garbage terminator is not filled
28+
6. SEND_NON_EMPTY_VERSION_PACKET - non-empty version packet is simply ignored
2829
"""
2930
EARLY_KEY_RESPONSE = 0
3031
EXCESS_GARBAGE = 1
3132
WRONG_GARBAGE_TERMINATOR = 2
3233
WRONG_GARBAGE = 3
3334
SEND_NO_AAD = 4
35+
SEND_NON_EMPTY_VERSION_PACKET = 5
3436

3537

3638
class EarlyKeyResponseState(EncryptedP2PState):
@@ -101,6 +103,13 @@ def complete_handshake(self, response):
101103
return super().complete_handshake(response)
102104

103105

106+
class NonEmptyVersionPacketState(EncryptedP2PState):
107+
""""Add option for sending non-empty transport version packet."""
108+
def complete_handshake(self, response):
109+
self.transport_version = random.randbytes(5)
110+
return super().complete_handshake(response)
111+
112+
104113
class MisbehavingV2Peer(P2PInterface):
105114
"""Custom implementation of P2PInterface which uses modified v2 P2P protocol functions for testing purposes."""
106115
def __init__(self, test_type):
@@ -121,6 +130,8 @@ def connection_made(self, transport):
121130
self.v2_state = WrongGarbageState(initiating=True, net='regtest')
122131
elif self.test_type == TestType.SEND_NO_AAD:
123132
self.v2_state = NoAADState(initiating=True, net='regtest')
133+
elif TestType.SEND_NON_EMPTY_VERSION_PACKET:
134+
self.v2_state = NonEmptyVersionPacketState(initiating=True, net='regtest')
124135
super().connection_made(transport)
125136

126137
def data_received(self, t):
@@ -169,14 +180,19 @@ def test_v2disconnection(self):
169180
["version handshake timeout peer=2"], # WRONG_GARBAGE_TERMINATOR
170181
["V2 transport error: packet decryption failure"], # WRONG_GARBAGE
171182
["V2 transport error: packet decryption failure"], # SEND_NO_AAD
183+
[], # SEND_NON_EMPTY_VERSION_PACKET
172184
]
173185
for test_type in TestType:
174186
if test_type == TestType.EARLY_KEY_RESPONSE:
175187
continue
176-
with node0.assert_debug_log(expected_debug_message[test_type.value], timeout=5):
177-
peer = node0.add_p2p_connection(MisbehavingV2Peer(test_type), wait_for_verack=False, send_version=False, supports_v2_p2p=True, expect_success=False)
178-
peer.wait_for_disconnect()
179-
self.log.info(f"Expected disconnection for {test_type.name}")
188+
elif test_type == TestType.SEND_NON_EMPTY_VERSION_PACKET:
189+
node0.add_p2p_connection(MisbehavingV2Peer(test_type), wait_for_verack=True, send_version=True, supports_v2_p2p=True)
190+
self.log.info(f"No disconnection for {test_type.name}")
191+
else:
192+
with node0.assert_debug_log(expected_debug_message[test_type.value], timeout=5):
193+
peer = node0.add_p2p_connection(MisbehavingV2Peer(test_type), wait_for_verack=False, send_version=False, supports_v2_p2p=True, expect_success=False)
194+
peer.wait_for_disconnect()
195+
self.log.info(f"Expected disconnection for {test_type.name}")
180196

181197

182198
if __name__ == '__main__':

0 commit comments

Comments
 (0)