Changeset View
Changeset View
Standalone View
Standalone View
test/functional/abc-invalid-message.py
Show All 26 Lines | def msg_bad_checksum(connection, original_message): | ||||
# Make the checksum invalid | # Make the checksum invalid | ||||
message_data[i] = message_data[i] ^ 0xAA | message_data[i] = message_data[i] ^ 0xAA | ||||
return message_data | return message_data | ||||
class BadVersionP2PInterface(P2PInterface): | class BadVersionP2PInterface(P2PInterface): | ||||
def peer_connect(self, *args, services=NODE_NETWORK, | def peer_connect(self, *args, services=NODE_NETWORK, | ||||
send_version=False, **kwargs): | send_version=False, **kwargs): | ||||
create_conn = super().peer_connect(*args, send_version=send_version, **kwargs) | self.services = services | ||||
return super().peer_connect(*args, send_version=send_version, **kwargs) | |||||
def send_version(self): | |||||
# Send version message with invalid checksum | # Send version message with invalid checksum | ||||
vt = msg_version() | vt = msg_version() | ||||
vt.nServices = services | vt.nServices = self.services | ||||
vt.addrTo.ip = self.dstaddr | vt.addrTo.ip = self.dstaddr | ||||
vt.addrTo.port = self.dstport | vt.addrTo.port = self.dstport | ||||
vt.addrFrom.ip = "0.0.0.0" | vt.addrFrom.ip = "0.0.0.0" | ||||
vt.addrFrom.port = 0 | vt.addrFrom.port = 0 | ||||
invalid_vt = msg_bad_checksum(self, vt) | invalid_vt = msg_bad_checksum(self, vt) | ||||
# Will be sent right after connection_made | self.send_raw_message(invalid_vt) | ||||
self.on_connection_send_msg = invalid_vt | |||||
self.on_connection_send_msg_is_raw = True | |||||
return create_conn | |||||
class InvalidMessageTest(BitcoinTestFramework): | class InvalidMessageTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.setup_clean_chain = False | self.setup_clean_chain = False | ||||
self.num_nodes = 2 | self.num_nodes = 2 | ||||
def run_test(self): | def run_test(self): | ||||
# Try to connect to a node using an invalid checksum on version message | # Try to connect to a node using an invalid checksum on version message. | ||||
# The version message is delayed because add_p2p_connection checks that | |||||
# the connection is established, and sending a bad version immedately | |||||
# on the first connection might get our peer disconnected before the | |||||
# check happened, causing the test to fail. | |||||
bad_interface = BadVersionP2PInterface() | bad_interface = BadVersionP2PInterface() | ||||
self.nodes[0].add_p2p_connection( | self.nodes[0].add_p2p_connection( | ||||
bad_interface, send_version=False, wait_for_verack=False) | bad_interface, send_version=False, wait_for_verack=False) | ||||
# Also connect to a node with a valid version message | # Also connect to a node with a valid version message | ||||
interface = P2PInterface() | interface = P2PInterface() | ||||
# Node with valid version message should connect successfully | # Node with valid version message should connect successfully | ||||
connection = self.nodes[1].add_p2p_connection(interface) | connection = self.nodes[1].add_p2p_connection(interface) | ||||
# The invalid version message should cause a disconnect on the first | self.log.info( | ||||
# connection because we are now banned | "Send an invalid version message and check we get banned") | ||||
bad_interface.send_version() | |||||
bad_interface.wait_for_disconnect() | bad_interface.wait_for_disconnect() | ||||
# Create a valid message | # Create a valid message | ||||
valid_message = msg_ping(interface.ping_counter) | valid_message = msg_ping(interface.ping_counter) | ||||
def wait_for_ping(): | def wait_for_ping(): | ||||
def check_ping(): | def check_ping(): | ||||
if not interface.last_message.get("pong"): | if not interface.last_message.get("pong"): | ||||
Show All 20 Lines |