1% Regression tests for the SecOC_PDUTransport / SecOC_PDU layer 2 3 4# More information at http://www.secdev.org/projects/UTscapy/ 5 6 7############ 8############ 9 10+ SecOC_PDUTransport contrib tests 11 12= Load Contrib Layer 13 14load_contrib("automotive.autosar.secoc_pdu") 15 16= Prepare SecOC keys 17 18SecOC_PDU.secoc_protected_pdus_by_identifier = {0, 1, 2, 3, 17, 18} 19SecOC_PDU.register_secoc_protected_pdu(0xdeadbeef) 20 21class PDU_Payload(Packet): 22 fields_desc = [ 23 ByteField("a", 0), 24 ByteField("b", 0), 25 ByteField("c", 0) 26 ] 27 28 29class PDU_Payload2(Packet): 30 fields_desc = [ 31 ByteField("x", 0), 32 ByteField("y", 0), 33 ByteField("z", 0) 34 ] 35 36 37SecOC_PDUTransport.register_secoc_protected_pdu(32, PDU_Payload) 38SecOC_PDUTransport.register_secoc_protected_pdu(64, PDU_Payload2) 39 40 41= Defaults test 42p = SecOC_PDUTransport() 43p.show() 44assert p.pdus == [SecOC_PDU()] 45 46p = SecOC_PDU() 47assert p.pdu_id == 0 48assert p.pdu_payload_len == None 49 50 51= Build test pdu_id 52p = SecOC_PDU(bytes(SecOC_PDU(pdu_id=0x11))) 53assert len(bytes(p)) == 12 54assert p.pdu_id == 0x11 55assert p.pdu_payload_len == 4 56 57 58= Build test pdu_payload_len 59p1 = bytes(SecOC_PDU(pdu_payload_len=12, pdu_payload=bytes.fromhex("1122334455667788"))) 60print(p1.hex()) 61p = SecOC_PDU(p1) 62p.show() 63assert len(p) == 20 64assert p.pdu_id == 0 65assert p.pdu_payload_len == 12 66assert bytes(p.pdu_payload) == bytes.fromhex("1122334455667788") 67assert p.tfv == 0 68assert p.tmac == b"\x00\x00\x00" 69 70 71= Build test pdu_payload_len2 72p1 = bytes(SecOC_PDU(pdu_id=0xdeadbeef, pdu_payload_len=12, pdu_payload=bytes.fromhex("1122334455667788"), tfv=42)) 73print(p1.hex()) 74p = SecOC_PDU(p1) 75p.show() 76assert len(p) == 20 77assert p.pdu_id == 0xdeadbeef 78assert p.pdu_payload_len == 12 79assert bytes(p.pdu_payload) == bytes.fromhex("1122334455667788") 80assert p.tfv == 42 81assert p.tmac == b"\x00\x00\x00" 82 83 84= Build test id and payload len with data 85p = SecOC_PDU(bytes(SecOC_PDU(pdu_id=0x12, pdu_payload=b'\x22\x33\x22\x33'))) 86assert len(p) == 16 87assert p.pdu_id == 0x12 88print(p.pdu_payload) 89p.show() 90assert p.pdu_payload_len == 8 91assert len(p.pdu_payload) == 4 92assert bytes(p.pdu_payload) == b'\x22\x33\x22\x33' 93 94 95= Build SecOC_PDUTransport with multiple SecOC_PDU packets 96p1 = SecOC_PDUTransport( 97 b'\x00\x00\x00\x01\x00\x00\x00\x05\x11\x00\x00\x00\x00' 98 b'\x00\x00\x00\x02\x00\x00\x00\x06\x11\x44\x00\x00\x00\x00' 99 b'\x00\x00\x00\x03\x00\x00\x00\x07\x11\x33\x91\x00\x00\x00\x00') 100 101# Check if fields are set correctly within SecOC_PDU list 102assert p1.pdus[0].pdu_id == 0x1 103assert p1.pdus[0].pdu_payload_len == 5 104assert p1.pdus[1].pdu_id == 0x2 105assert p1.pdus[1].pdu_payload_len == 6 106assert p1.pdus[2].pdu_id == 0x3 107assert p1.pdus[2].pdu_payload_len == 7 108 109p2 = SecOC_PDUTransport(bytes(SecOC_PDUTransport( 110 pdus=[ 111 SecOC_PDU(pdu_id=0x1,pdu_payload_len=5, pdu_payload=Raw(b'\x11')), 112 SecOC_PDU(pdu_id=0x2, pdu_payload_len=6, pdu_payload=Raw(b'\x11\x44')), 113 SecOC_PDU(pdu_id=0x3, pdu_payload_len=7, pdu_payload=Raw(b'\x11\x33\x91')) 114 ]))) 115# Check if packets are the same 116assert p1 == p2 117 118 119= Build SecOC_PDUTransport with one SecOC_PDU packet 120p1 = SecOC_PDUTransport(b'\x00\x00\x00\x01\x00\x00\x00\x08\xaa\xaa\xaa\xaa\x11\x22\x33\x44') 121p2 = SecOC_PDUTransport(bytes(SecOC_PDUTransport(pdus=[SecOC_PDU(pdu_id=0x1, pdu_payload=Raw(b'\xaa\xaa\xaa\xaa'), tfv=0x11, tmac=b"\x22\x33\x44")]))) 122 123# Check if packets are the same 124assert p1 == p2 125# Check if fields are set correctly within SecOC_PDU list 126assert p1.pdus[0].pdu_id == 0x1 127assert p1.pdus[0].pdu_payload_len == 8 128 129 130= Build SecOC_PDUTransport with one SecOC_PDU packet and custom class 131p1 = SecOC_PDUTransport(b'\x00\x00\x00\x20\x00\x00\x00\x07\xaa\xbb\xcc\x11\x22\x33\x44') 132 133# Check if packets are the same 134assert p1 135# Check if fields are set correctly within SecOC_PDU list 136assert p1.pdus[0].pdu_id == 0x20 137assert p1.pdus[0].pdu_payload_len == 7 138assert p1.pdus[0].tmac == b"\x22\x33\x44" 139pdu = p1.pdus[0] 140pdu.show() 141assert pdu.pdu_payload.a == 0xaa 142assert pdu.pdu_payload.b == 0xbb 143assert pdu.pdu_payload.c == 0xcc 144 145 146= Build SecOC_PDUTransport with multiple SecOC_PDU packets 147p1 = SecOC_PDUTransport(bytes.fromhex("00000020 00000007 aabbcc 11223344 00000040 00000007 ddeeff 55667788 000000ff 00000008 01234567 11223344 000000ff 00000008 01234567 11223344")) 148p1.show() 149# Check if packets are the same 150assert p1 151# Check if fields are set correctly within SecOC_PDU list 152assert p1.pdus[0].pdu_id == 0x20 153assert p1.pdus[1].pdu_id == 0x40 154assert p1.pdus[2].pdu_id == 0xff 155assert p1.pdus[3].pdu_id == 0xff 156assert p1.pdus[0].pdu_payload_len == 7 157assert p1.pdus[1].pdu_payload_len == 7 158assert p1.pdus[2].pdu_payload_len == 8 159assert p1.pdus[3].pdu_payload_len == 8 160assert p1.pdus[0].tmac == b"\x22\x33\x44" 161 162try: 163 assert p1.pdus[2].tmac == b"\x22\x33\x44" 164 assert False 165except AttributeError: 166 pass 167 168assert p1.pdus[1].tmac == b"\x66\x77\x88" 169 170pdu = p1.pdus[0] 171pdu.show() 172assert pdu.pdu_payload.a == 0xaa 173assert pdu.pdu_payload.b == 0xbb 174assert pdu.pdu_payload.c == 0xcc 175 176pdu = p1.pdus[1] 177pdu.show() 178assert pdu.pdu_payload.x == 0xdd 179assert pdu.pdu_payload.y == 0xee 180assert pdu.pdu_payload.z == 0xff 181 182pdu = p1.pdus[2] 183assert "PDU" in pdu.__class__.__name__ 184assert pdu.payload.__class__.__name__ == "Raw" 185assert pdu.load == bytes.fromhex("0123456711223344") 186 187 188pdu = p1.pdus[3] 189assert "PDU" in pdu.__class__.__name__ 190assert pdu.payload.__class__.__name__ == "Raw" 191assert pdu.load == bytes.fromhex("0123456711223344") 192 193 194 195