• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1% Regression tests for the HSFZ layer
2
3# More information at http://www.secdev.org/projects/UTscapy/
4
5
6############
7############
8
9+ HSFZ Contrib tests
10
11= Load Contrib Layer
12load_contrib("automotive.bmw.hsfz", globals_dict=globals())
13
14= Basic Test 1
15
16pkt = HSFZ(control=1, source=0xf4, target=0x10)/Raw(b'\x11\x22\x33')
17assert bytes(pkt) == b'\x00\x00\x00\x05\x00\x01\xf4\x10\x11"3'
18
19= Basic Test 2
20
21pkt = HSFZ(control=1, source=0xf4, target=0x10)/Raw(b'\x11\x22\x33\x11\x11\x11\x11\x11')
22assert bytes(pkt) == b'\x00\x00\x00\x0a\x00\x01\xf4\x10\x11"3\x11\x11\x11\x11\x11'
23
24= Basic Dissect Test
25
26pkt = HSFZ(b'\x00\x00\x00\x0a\x00\x01\xf4\x10\x11"3\x11\x11\x11\x11\x11')
27assert pkt.length == 10
28assert pkt.source == 0xf4
29assert pkt.target == 0x10
30assert pkt.control == 1
31assert pkt[1].service == 17
32assert pkt[2].resetType == 34
33
34= Build Test
35
36pkt = HSFZ(source=0xf4, target=0x10)/Raw(b"0" * 20)
37assert bytes(pkt) == b'\x00\x00\x00\x16\x00\x01\xf4\x10' + b"0" * 20
38
39= Dissect Test
40
41pkt = HSFZ(b'\x00\x00\x00\x18\x00\x01\xf4\x10\x67\x01' + b"0" * 20)
42assert pkt.length == 24
43assert pkt.source == 0xf4
44assert pkt.target == 0x10
45assert pkt.control == 1
46assert pkt.securitySeed == b"0" * 20
47assert len(pkt[1]) == pkt.length - 2
48
49= Dissect Test with padding
50
51pkt = HSFZ(b'\x00\x00\x00\x18\x00\x01\xf4\x10\x67\x01' + b"0" * 20 + b"p" * 100)
52assert pkt.length == 24
53assert pkt.source == 0xf4
54assert pkt.target == 0x10
55assert pkt.control == 1
56assert pkt.securitySeed == b"0" * 20
57assert pkt.load == b'p' * 100
58
59= Dissect Test to short packet
60
61pkt = HSFZ(b'\x00\x00\x00\x18\x00\x01\xf4\x10\x67\x01' + b"0" * 19)
62assert pkt.length == 24
63assert pkt.source == 0xf4
64assert pkt.target == 0x10
65assert pkt.control == 1
66assert pkt.securitySeed == b"0" * 19
67
68
69= Dissect Test very long packet
70
71pkt = HSFZ(b'\x00\x0f\xff\x04\x00\x01\xf4\x10\x67\x01' + b"0" * 0xfff00)
72assert pkt.length == 0xfff04
73assert pkt.source == 0xf4
74assert pkt.target == 0x10
75assert pkt.control == 1
76assert pkt.securitySeed == b"0" * 0xfff00
77
78
79= Dissect identification
80
81pkt = HSFZ(bytes.fromhex("000000320011444941474144523130424d574d4143374346436343463837393343424d5756494e5742413558373333333246483735373334"))
82assert pkt.length == 50
83assert pkt.control == 0x11
84assert b"BMW" in pkt.identification_string
85
86pkt = UDP(bytes.fromhex("1a9be2d90040d67d000000320011444941474144523130424d574d4143374346436343463837393343424d5756494e5742413558373333333246483735373334"))
87assert pkt.length == 50
88assert pkt.control == 0x11
89assert b"BMW" in pkt.identification_string
90
91= Test HSFZSocket
92
93
94server_up = threading.Event()
95def server():
96    buffer = bytes(HSFZ(control=1, source=0xf4, target=0x10) / Raw(b'\x11\x22\x33' * 1024))
97    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
98    try:
99        sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
100        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
101        sock.bind(('127.0.0.1', 6801))
102        sock.listen(1)
103        server_up.set()
104        connection, address = sock.accept()
105        connection.send(buffer[:1024])
106        time.sleep(0.1)
107        connection.send(buffer[1024:])
108        connection.close()
109    finally:
110        sock.close()
111
112server_thread = threading.Thread(target=server)
113server_thread.start()
114server_up.wait(timeout=1)
115sock = HSFZSocket()
116
117pkts = sock.sniff(timeout=1, count=1)
118assert len(pkts) == 1
119assert len(pkts[0]) > 2048
120