@@ -25,12 +25,14 @@ class TestType(Enum):
25
25
3. WRONG_GARBAGE_TERMINATOR - Disconnection happens when incorrect garbage terminator is sent
26
26
4. WRONG_GARBAGE - Disconnection happens when garbage bytes that is sent is different from what the peer receives
27
27
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
28
29
"""
29
30
EARLY_KEY_RESPONSE = 0
30
31
EXCESS_GARBAGE = 1
31
32
WRONG_GARBAGE_TERMINATOR = 2
32
33
WRONG_GARBAGE = 3
33
34
SEND_NO_AAD = 4
35
+ SEND_NON_EMPTY_VERSION_PACKET = 5
34
36
35
37
36
38
class EarlyKeyResponseState (EncryptedP2PState ):
@@ -101,6 +103,13 @@ def complete_handshake(self, response):
101
103
return super ().complete_handshake (response )
102
104
103
105
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
+
104
113
class MisbehavingV2Peer (P2PInterface ):
105
114
"""Custom implementation of P2PInterface which uses modified v2 P2P protocol functions for testing purposes."""
106
115
def __init__ (self , test_type ):
@@ -122,6 +131,8 @@ def connection_made(self, transport):
122
131
self .v2_state = WrongGarbageState (initiating = True , net = 'regtest' )
123
132
case TestType .SEND_NO_AAD :
124
133
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' )
125
136
super ().connection_made (transport )
126
137
127
138
def data_received (self , t ):
@@ -170,14 +181,19 @@ def test_v2disconnection(self):
170
181
["version handshake timeout peer=2" ], # WRONG_GARBAGE_TERMINATOR
171
182
["V2 transport error: packet decryption failure" ], # WRONG_GARBAGE
172
183
["V2 transport error: packet decryption failure" ], # SEND_NO_AAD
184
+ [], # SEND_NON_EMPTY_VERSION_PACKET
173
185
]
174
186
for test_type in TestType :
175
187
if test_type == TestType .EARLY_KEY_RESPONSE :
176
188
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 } " )
181
197
182
198
183
199
if __name__ == '__main__' :
0 commit comments