• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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