Skip to content

Commit ae528cb

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 dc2137a commit ae528cb

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):
@@ -86,6 +88,13 @@ def complete_handshake(self, response):
8688
return super().complete_handshake(response)
8789

8890

91+
class NonEmptyVersionPacketState(EncryptedP2PState):
92+
""""Add option for sending non-empty transport version packet."""
93+
def complete_handshake(self, response):
94+
self.transport_version = random.randbytes(5)
95+
return super().complete_handshake(response)
96+
97+
8998
class MisbehavingV2Peer(P2PInterface):
9099
"""Custom implementation of P2PInterface which uses modified v2 P2P protocol functions for testing purposes."""
91100
def __init__(self, test_type):
@@ -103,6 +112,8 @@ def connection_made(self, transport):
103112
self.v2_state = WrongGarbageState(initiating=True, net='regtest')
104113
elif self.test_type == TestType.SEND_NO_AAD:
105114
self.v2_state = NoAADState(initiating=True, net='regtest')
115+
elif TestType.SEND_NON_EMPTY_VERSION_PACKET:
116+
self.v2_state = NonEmptyVersionPacketState(initiating=True, net='regtest')
106117
super().connection_made(transport)
107118

108119
def data_received(self, t):
@@ -148,14 +159,19 @@ def test_v2disconnection(self):
148159
["V2 handshake timeout peer=2"], # WRONG_GARBAGE_TERMINATOR
149160
["V2 transport error: packet decryption failure"], # WRONG_GARBAGE
150161
["V2 transport error: packet decryption failure"], # SEND_NO_AAD
162+
[], # SEND_NON_EMPTY_VERSION_PACKET
151163
]
152164
for test_type in TestType:
153165
if test_type == TestType.EARLY_KEY_RESPONSE:
154166
continue
155-
with node0.assert_debug_log(expected_debug_message[test_type.value], timeout=5):
156-
peer = node0.add_p2p_connection(MisbehavingV2Peer(test_type), wait_for_verack=False, send_version=False, supports_v2_p2p=True, expect_success=False)
157-
peer.wait_for_disconnect()
158-
self.log.info(f"Expected disconnection for {test_type.name}")
167+
elif test_type == TestType.SEND_NON_EMPTY_VERSION_PACKET:
168+
node0.add_p2p_connection(MisbehavingV2Peer(test_type), wait_for_verack=True, send_version=True, supports_v2_p2p=True)
169+
self.log.info(f"No disconnection for {test_type.name}")
170+
else:
171+
with node0.assert_debug_log(expected_debug_message[test_type.value], timeout=5):
172+
peer = node0.add_p2p_connection(MisbehavingV2Peer(test_type), wait_for_verack=False, send_version=False, supports_v2_p2p=True, expect_success=False)
173+
peer.wait_for_disconnect()
174+
self.log.info(f"Expected disconnection for {test_type.name}")
159175

160176

161177
if __name__ == '__main__':

0 commit comments

Comments
 (0)