Skip to content

Commit 5b91fb1

Browse files
committed
[test] Read v2 P2P messages
1 parent 05bddb2 commit 5b91fb1

File tree

1 file changed

+41
-17
lines changed
  • test/functional/test_framework

1 file changed

+41
-17
lines changed

test/functional/test_framework/p2p.py

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
)
8383
from test_framework.v2_p2p import (
8484
EncryptedP2PState,
85+
SHORTID,
8586
)
8687

8788
logger = logging.getLogger("TestFramework.p2p")
@@ -297,23 +298,46 @@ def _on_data(self):
297298
the on_message callback for processing."""
298299
try:
299300
while True:
300-
if len(self.recvbuf) < 4:
301-
return
302-
if self.recvbuf[:4] != self.magic_bytes:
303-
raise ValueError("magic bytes mismatch: {} != {}".format(repr(self.magic_bytes), repr(self.recvbuf)))
304-
if len(self.recvbuf) < 4 + 12 + 4 + 4:
305-
return
306-
msgtype = self.recvbuf[4:4+12].split(b"\x00", 1)[0]
307-
msglen = struct.unpack("<i", self.recvbuf[4+12:4+12+4])[0]
308-
checksum = self.recvbuf[4+12+4:4+12+4+4]
309-
if len(self.recvbuf) < 4 + 12 + 4 + 4 + msglen:
310-
return
311-
msg = self.recvbuf[4+12+4+4:4+12+4+4+msglen]
312-
th = sha256(msg)
313-
h = sha256(th)
314-
if checksum != h[:4]:
315-
raise ValueError("got bad checksum " + repr(self.recvbuf))
316-
self.recvbuf = self.recvbuf[4+12+4+4+msglen:]
301+
if self.supports_v2_p2p:
302+
# v2 P2P messages are read
303+
msglen, msg = self.v2_state.v2_receive_packet(self.recvbuf)
304+
if msglen == -1:
305+
raise ValueError("invalid v2 mac tag " + repr(self.recvbuf))
306+
elif msglen == 0: # need to receive more bytes in recvbuf
307+
return
308+
self.recvbuf = self.recvbuf[msglen:]
309+
310+
assert msg # application layer messages (which aren't decoy messages) are non-empty
311+
shortid = msg[0] # 1-byte short message type ID
312+
if shortid == 0:
313+
# next 12 bytes are interpreted as ASCII message type if shortid is b'\x00'
314+
if len(msg) < 13:
315+
raise IndexError("msg needs minimum required length of 13 bytes")
316+
msgtype = msg[1:13].rstrip(b'\x00')
317+
msg = msg[13:] # msg is set to be payload
318+
else:
319+
# a 1-byte short message type ID
320+
msgtype = SHORTID.get(shortid, f"unknown-{shortid}")
321+
msg = msg[1:]
322+
else:
323+
# v1 P2P messages are read
324+
if len(self.recvbuf) < 4:
325+
return
326+
if self.recvbuf[:4] != self.magic_bytes:
327+
raise ValueError("magic bytes mismatch: {} != {}".format(repr(self.magic_bytes), repr(self.recvbuf)))
328+
if len(self.recvbuf) < 4 + 12 + 4 + 4:
329+
return
330+
msgtype = self.recvbuf[4:4+12].split(b"\x00", 1)[0]
331+
msglen = struct.unpack("<i", self.recvbuf[4+12:4+12+4])[0]
332+
checksum = self.recvbuf[4+12+4:4+12+4+4]
333+
if len(self.recvbuf) < 4 + 12 + 4 + 4 + msglen:
334+
return
335+
msg = self.recvbuf[4+12+4+4:4+12+4+4+msglen]
336+
th = sha256(msg)
337+
h = sha256(th)
338+
if checksum != h[:4]:
339+
raise ValueError("got bad checksum " + repr(self.recvbuf))
340+
self.recvbuf = self.recvbuf[4+12+4+4+msglen:]
317341
if msgtype not in MESSAGEMAP:
318342
raise ValueError("Received unknown msgtype from %s:%d: '%s' %s" % (self.dstaddr, self.dstport, msgtype, repr(msg)))
319343
f = BytesIO(msg)

0 commit comments

Comments
 (0)