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