@@ -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 ):
@@ -121,6 +130,8 @@ def connection_made(self, transport):
121
130
self .v2_state = WrongGarbageState (initiating = True , net = 'regtest' )
122
131
elif self .test_type == TestType .SEND_NO_AAD :
123
132
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' )
124
135
super ().connection_made (transport )
125
136
126
137
def data_received (self , t ):
@@ -169,14 +180,19 @@ def test_v2disconnection(self):
169
180
["version handshake timeout peer=2" ], # WRONG_GARBAGE_TERMINATOR
170
181
["V2 transport error: packet decryption failure" ], # WRONG_GARBAGE
171
182
["V2 transport error: packet decryption failure" ], # SEND_NO_AAD
183
+ [], # SEND_NON_EMPTY_VERSION_PACKET
172
184
]
173
185
for test_type in TestType :
174
186
if test_type == TestType .EARLY_KEY_RESPONSE :
175
187
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 } " )
180
196
181
197
182
198
if __name__ == '__main__' :
0 commit comments