Skip to content

Commit a256640

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 0b90f9c commit a256640

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):
@@ -122,6 +131,8 @@ def connection_made(self, transport):
122131
self.v2_state = WrongGarbageState(initiating=True, net='regtest')
123132
case TestType.SEND_NO_AAD:
124133
self.v2_state = NoAADState(initiating=True, net='regtest')
134+
case TestType.SEND_NON_EMPTY_VERSION_PACKET:
135+
self.v2_state = NonEmptyVersionPacketState(initiating=True, net='regtest')
125136
super().connection_made(transport)
126137

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

182198

183199
if __name__ == '__main__':

0 commit comments

Comments
 (0)