|
82 | 82 | )
|
83 | 83 | from test_framework.v2_p2p import (
|
84 | 84 | EncryptedP2PState,
|
| 85 | + SHORTID, |
85 | 86 | )
|
86 | 87 |
|
87 | 88 | logger = logging.getLogger("TestFramework.p2p")
|
@@ -297,23 +298,46 @@ def _on_data(self):
|
297 | 298 | the on_message callback for processing."""
|
298 | 299 | try:
|
299 | 300 | 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:] |
317 | 341 | if msgtype not in MESSAGEMAP:
|
318 | 342 | raise ValueError("Received unknown msgtype from %s:%d: '%s' %s" % (self.dstaddr, self.dstport, msgtype, repr(msg)))
|
319 | 343 | f = BytesIO(msg)
|
|
0 commit comments