|
| 1 | +# WebSocket layer unit tests |
| 2 | +# Copyright (C) 2024 Lucas Drufva <lucas.drufva@gmail.com> |
| 3 | +# |
| 4 | +# Type the following command to launch start the tests: |
| 5 | +# $ test/run_tests -P "load_contrib('websocket')" -t test/contrib/websocket.uts |
| 6 | + |
| 7 | ++ Syntax check |
| 8 | += Import the WebSocket layer |
| 9 | +from scapy.contrib.websocket import * |
| 10 | + |
| 11 | ++ WebSocket protocol test |
| 12 | += Packet instantiation |
| 13 | +pkt = WebSocket(wsPayload=b"Hello, world!", opcode="text", mask=True, maskingKey=0x11223344) |
| 14 | +pkt.show() |
| 15 | +import binascii |
| 16 | +print(binascii.hexlify(bytes(pkt))) |
| 17 | +assert pkt.wsPayload == b"Hello, world!" |
| 18 | +assert pkt.mask == True |
| 19 | +assert pkt.maskingKey == 0x11223344 |
| 20 | + |
| 21 | + |
| 22 | += Packet dissection |
| 23 | +raw = b'\x01\x0dHello, world!' |
| 24 | +pkt = WebSocket(raw) |
| 25 | +pkt.show() |
| 26 | + |
| 27 | +assert pkt.fin == 0 |
| 28 | +assert pkt.rsv == 0 |
| 29 | +assert pkt.opcode == 0x1 |
| 30 | +assert pkt.mask == False |
| 31 | +assert pkt.payloadLen == 13 |
| 32 | +assert pkt.wsPayload == b'Hello, world!' |
| 33 | + |
| 34 | += Dissect masked packet |
| 35 | +raw = b'\x01\x8d\x11\x22\x33\x44\x59\x47\x5f\x28\x7e\x0e\x13\x33\x7e\x50\x5f\x20\x30' |
| 36 | +pkt = WebSocket(raw) |
| 37 | +pkt.show() |
| 38 | + |
| 39 | +assert pkt.fin == 0 |
| 40 | +assert pkt.rsv == 0 |
| 41 | +assert pkt.opcode == 0x1 |
| 42 | +assert pkt.mask == True |
| 43 | +assert pkt.payloadLen == 13 |
| 44 | +assert pkt.wsPayload == b'Hello, world!' |
| 45 | + |
| 46 | += Session with compression |
| 47 | + |
| 48 | +bind_layers(TCP, WebSocket, dport=5000) |
| 49 | +bind_layers(TCP, WebSocket, sport=5000) |
| 50 | + |
| 51 | +from scapy.sessions import TCPSession |
| 52 | + |
| 53 | +filename = scapy_path("/test/pcaps/websocket_compressed_session.pcap") |
| 54 | +pkts = sniff(offline=filename, session=TCPSession) |
| 55 | + |
| 56 | +assert len(pkts) == 13 |
| 57 | + |
| 58 | +assert pkts[7][WebSocket].wsPayload == b'Hello' |
| 59 | +assert pkts[8][WebSocket].wsPayload == b'"Hello"' |
| 60 | +assert pkts[10][WebSocket].wsPayload == b'Hello2' |
| 61 | +assert pkts[11][WebSocket].wsPayload == b'"Hello2"' |
0 commit comments