Changeset View
Changeset View
Standalone View
Standalone View
test/functional/abc-invalid-message.py
Show All 9 Lines | |||||
import struct | import struct | ||||
from test_framework.messages import NODE_NETWORK, msg_version | from test_framework.messages import NODE_NETWORK, msg_version | ||||
from test_framework.mininode import ( | from test_framework.mininode import ( | ||||
MAGIC_BYTES, | MAGIC_BYTES, | ||||
mininode_lock, | mininode_lock, | ||||
msg_ping, | msg_ping, | ||||
network_thread_start, | |||||
P2PInterface, | P2PInterface, | ||||
) | ) | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import wait_until | from test_framework.util import wait_until | ||||
def msg_bad_checksum(connection, original_message): | def msg_bad_checksum(connection, original_message): | ||||
message_data = bytearray(connection._build_message(original_message)) | message_data = bytearray(connection._build_message(original_message)) | ||||
data = original_message.serialize() | data = original_message.serialize() | ||||
i = 0 | i = 0 | ||||
i += len(MAGIC_BYTES[connection.network]) | i += len(MAGIC_BYTES[connection.network]) | ||||
i += 12 | i += 12 | ||||
i += len(struct.pack("<I", len(data))) | i += len(struct.pack("<I", len(data))) | ||||
# 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, send_version=False, **kwargs): | def peer_connect(self, *args, services=NODE_NETWORK, send_version=False, **kwargs): | ||||
super().peer_connect(*args, send_version=send_version, **kwargs) | create_conn = super().peer_connect(*args, send_version=send_version, **kwargs) | ||||
# Send version message with invalid checksum | # Send version message with invalid checksum | ||||
vt = msg_version() | vt = msg_version() | ||||
vt.nServices = services | vt.nServices = 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 handle_connect | # Will be sent right after connection_made | ||||
self.sendbuf = 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 | ||||
bad_interface = BadVersionP2PInterface() | bad_interface = BadVersionP2PInterface() | ||||
self.nodes[0].add_p2p_connection(bad_interface) | self.nodes[0].add_p2p_connection(bad_interface) | ||||
# Also connect to a node with a valid version message | # Also connect to a node with a valid version message | ||||
interface = P2PInterface() | interface = P2PInterface() | ||||
connection = self.nodes[1].add_p2p_connection(interface) | connection = self.nodes[1].add_p2p_connection(interface) | ||||
network_thread_start() | |||||
# The invalid version message should cause a disconnect on the first | # The invalid version message should cause a disconnect on the first | ||||
# connection because we are now banned | # connection because we are now banned | ||||
bad_interface.wait_for_disconnect() | bad_interface.wait_for_disconnect() | ||||
# Node with valid version message should connect successfully | # Node with valid version message should connect successfully | ||||
connection.wait_for_verack() | connection.wait_for_verack() | ||||
# Create a valid message | # Create a valid message | ||||
Show All 25 Lines |