• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1% Regression tests for the KWP2000 layer
2
3# More information at http://www.secdev.org/projects/UTscapy/
4
5
6############
7############
8
9+ Basic operations
10
11= Load module
12load_contrib("automotive.kwp", globals_dict=globals())
13
14= Check if positive response answers
15
16sds = KWP(b'\x10')
17sdspr = KWP(b'\x50')
18assert sdspr.answers(sds)
19
20= Check hashret
21sds.hashret() == sdspr.hashret()
22
23= Check if negative response answers
24
25sds = KWP(b'\x10')
26neg = KWP(b'\x7f\x10')
27assert neg.answers(sds)
28
29= CHECK hashret NEG
30sds.hashret() == neg.hashret()
31
32= Check if negative response answers
33
34conf.contribs['KWP']['treat-response-pending-as-answer'] = False
35
36sds = KWP(b'\x10')
37neg = KWP(b'\x7f\x10\x78')
38assert not neg.answers(sds)
39
40conf.contribs['KWP']['treat-response-pending-as-answer'] = True
41
42= CHECK hashret NEG
43sds.hashret() == neg.hashret()
44
45= Check if negative response answers not
46
47sds = KWP(b'\x10')
48neg = KWP(b'\x7f\x11')
49assert not neg.answers(sds)
50
51= Check if positive response answers not
52
53sds = KWP(b'\x10')
54somePacket = KWP(b'\x49')
55assert not somePacket.answers(sds)
56
57= Check KWP_SDS
58
59sds = KWP(b'\x10\x01')
60assert sds.service == 0x10
61assert sds.diagnosticSession == 0x01
62
63= Check KWP_SDS
64
65sds = KWP()/KWP_SDS(b'\x01')
66assert sds.service == 0x10
67assert sds.diagnosticSession == 0x01
68
69= Check KWP_SDSPR
70
71sdspr = KWP(b'\x50\x02beef')
72assert sdspr.service == 0x50
73assert sdspr.diagnosticSession == 0x02
74
75assert not sdspr.answers(sds)
76
77= Check KWP_SDSPR
78
79sdspr = KWP()/KWP_SDSPR(b'\x01beef')
80assert sdspr.service == 0x50
81assert sdspr.diagnosticSession == 0x01
82
83assert sdspr.answers(sds)
84
85= Check KWP_SDS
86
87sds = KWP()/KWP_SDS(b'\x01')
88assert sds.service == 0x10
89assert sds.diagnosticSession == 0x01
90
91= Check KWP_SDSPR
92
93sdspr = KWP()/KWP_SDSPR(b'\x01beef')
94assert sdspr.service == 0x50
95assert sdspr.diagnosticSession == 0x01
96
97assert sdspr.answers(sds)
98
99= Check KWP_ER
100
101er = KWP(b'\x11\x01')
102assert er.service == 0x11
103assert er.resetMode == 0x01
104
105= Check KWP_ER
106
107er = KWP()/KWP_ER(resetMode="powerOnReset")
108assert er.service == 0x11
109assert er.resetMode == 0x01
110
111= Check KWP_ERPR
112
113erpr = KWP(b'\x51')
114assert erpr.service == 0x51
115
116assert erpr.answers(er)
117
118= Check KWP_SA
119
120sa = KWP(b'\x27\x00c0ffee')
121assert sa.service == 0x27
122assert sa.accessMode == 0x0
123assert sa.key == b'c0ffee'
124
125= Check KWP_SAPR
126
127sapr = KWP(b'\x67')
128assert sapr.service == 0x67
129
130assert sapr.answers(sa)
131
132= Check KWP_SA
133
134sa = KWP(b'\x27\x01')
135assert sa.service == 0x27
136assert sa.accessMode == 0x1
137
138= Check KWP_SAPR
139
140sapr = KWP(b'\x67\x01c0ffee')
141assert sapr.service == 0x67
142assert sapr.accessMode == 0x1
143assert sapr.seed == b'c0ffee'
144
145assert sapr.answers(sa)
146
147= Check KWP_SA
148
149sa = KWP(b'\x27\x00c0ffee')
150assert sa.service == 0x27
151assert sa.accessMode == 0x0
152assert sa.key == b'c0ffee'
153
154= Check KWP_SA
155
156sa = KWP(b'\x27\x01c0ffee')
157assert sa.service == 0x27
158assert sa.accessMode == 0x1
159
160= Check KWP_SAPR
161
162sapr = KWP(b'\x67\x01c0ffee')
163assert sapr.service == 0x67
164assert sapr.accessMode == 0x1
165assert sapr.seed == b'c0ffee'
166
167
168= Check KWP_DNT
169
170cc = KWP(b'\x28\x01')
171assert cc.service == 0x28
172assert cc.responseRequired == 0x1
173
174= Check KWP_DNMTPR
175
176ccpr = KWP(b'\x68')
177assert ccpr.service == 0x68
178assert ccpr.answers(cc)
179
180= Check KWP_DNMTPR
181
182ccpr = KWP(b'\x68abcd')
183assert ccpr.service == 0x68
184assert ccpr.answers(cc)
185
186assert (KWP()/KWP_DNMTPR()).answers(cc)
187
188= Check KWP_TP
189
190tp = KWP(b'\x3E\x01')
191assert tp.service == 0x3e
192assert tp.responseRequired == 1
193
194= Check KWP_TPPR
195
196tppr = KWP(b'\x7E')
197assert tppr.service == 0x7e
198
199assert tppr.answers(tp)
200
201assert (KWP()/KWP_TPPR()).answers(tp)
202
203= Check KWP_CDTCS
204
205cdtcs = KWP(b'\x85\x01\x40\x00\x01')
206assert cdtcs.service == 0x85
207assert cdtcs.responseRequired == 1
208assert cdtcs.groupOfDTC == 0x4000
209assert cdtcs.DTCSettingMode == 1
210
211= Check KWP_CDTCSPR
212
213cdtcspr = KWP(b'\xC5\x00')
214assert cdtcspr.service == 0xC5
215
216assert cdtcspr.answers(cdtcs)
217
218= Check KWP_ROE
219
220roe = KWP(b'\x86\x01\x10\x00')
221assert roe.service == 0x86
222assert roe.responseRequired == 1
223assert roe.eventType == 0
224assert roe.eventWindowTime == 16
225
226= Check KWP_ROEPR
227
228roepr = KWP(b'\xC6\x00\x01')
229assert roepr.service == 0xC6
230assert roepr.numberOfActivatedEvents == 0
231assert roepr.eventType == 0
232
233assert roepr.answers(roe)
234
235= Check KWP_RDBI
236
237rdbi = KWP(b'\x22\x01\x02')
238assert rdbi.service == 0x22
239assert rdbi.identifier == 0x0102
240
241= Build KWP_RDBI
242
243rdbi = KWP()/KWP_RDBI(identifier=0x102)
244assert rdbi.service == 0x22
245assert rdbi.identifier == 0x0102
246assert bytes(rdbi) == b'\x22\x01\x02'
247
248= Check KWP_RDBI2
249
250rdbi = KWP(b'\x22\x01\x02')
251assert rdbi.service == 0x22
252assert rdbi.identifier == 0x0102
253assert raw(rdbi) == b'\x22\x01\x02'
254
255= Build KWP_RDBI2
256
257rdbi = KWP()/KWP_RDBI(identifier=0x304)
258assert rdbi.service == 0x22
259assert rdbi.identifier == 0x0304
260assert raw(rdbi) == b'\x22\x03\x04'
261
262= Test observable dict used in KWP_RDBI, setter
263
264KWP_RDBI.dataIdentifiers[0x102] = "turbo"
265KWP_RDBI.dataIdentifiers[0x103] = "fullspeed"
266
267rdbi = KWP()/KWP_RDBI(identifier=0x102)
268
269assert "turbo" in plain_str(repr(rdbi))
270
271rdbi = KWP()/KWP_RDBI(identifier=0x103)
272
273assert "fullspeed" in plain_str(repr(rdbi))
274
275= Test observable dict used in KWP_RDBI, deleter
276
277KWP_RDBI.dataIdentifiers[0x102] = "turbo"
278
279rdbi = KWP()/KWP_RDBI(identifier=0x102)
280assert "turbo" in plain_str(repr(rdbi))
281
282del KWP_RDBI.dataIdentifiers[0x102]
283KWP_RDBI.dataIdentifiers[0x103] = "slowspeed"
284
285rdbi = KWP()/KWP_RDBI(identifier=0x102)
286
287assert "turbo" not in plain_str(repr(rdbi))
288
289rdbi = KWP()/KWP_RDBI(identifier=0x103)
290
291assert "slowspeed" in plain_str(repr(rdbi))
292
293= Check KWP_RDBIPR
294
295rdbipr = KWP(b'\x62\x01\x03dieselgate')
296assert rdbipr.service == 0x62
297assert rdbipr.identifier == 0x0103
298assert rdbipr.load == b'dieselgate'
299
300assert rdbipr.answers(rdbi)
301
302= Check KWP_RMBA
303
304rmba = KWP(b'\x23\x11\x02\x02\x11')
305assert rmba.service == 0x23
306assert rmba.memoryAddress == 0x110202
307assert rmba.memorySize == 17
308
309= Check KWP_RMBAPR
310
311rmbapr = KWP(b'\x63muchData')
312assert rmbapr.service == 0x63
313assert rmbapr.dataRecord == b'muchData'
314
315assert rmbapr.answers(rmba)
316
317= Check KWP_DDLI
318
319dddi = KWP(b'\x2c\x12\x44coffee')
320assert dddi.service == 0x2c
321assert dddi.dynamicallyDefineLocalIdentifier == 0x12
322assert dddi.definitionMode == 0x44
323assert dddi.dataRecord == b'coffee'
324
325= Check KWP_DDLIPR
326
327dddipr = KWP(b'\x6c\x12\x44\x01')
328assert dddipr.service == 0x6c
329assert dddipr.dynamicallyDefineLocalIdentifier == 0x12
330
331assert dddipr.answers(dddi)
332
333= Check KWP_WDBI
334
335wdbi = KWP(b'\x2e\x01\x02dieselgate')
336assert wdbi.service == 0x2e
337assert wdbi.identifier == 0x0102
338assert wdbi.load == b'dieselgate'
339
340= Build KWP_WDBI
341
342wdbi = KWP()/KWP_WDBI(identifier=0x0102)/Raw(load=b'dieselgate')
343assert wdbi.service == 0x2e
344assert wdbi.identifier == 0x0102
345assert wdbi.load == b'dieselgate'
346assert bytes(wdbi) == b'\x2e\x01\x02dieselgate'
347
348= Check KWP_WDBI
349
350wdbi = KWP(b'\x2e\x01\x02dieselgate')
351assert wdbi.service == 0x2e
352assert wdbi.identifier == 0x0102
353assert wdbi.load == b'dieselgate'
354
355wdbi = KWP(b'\x2e\x02\x02benzingate')
356assert wdbi.service == 0x2e
357assert wdbi.identifier == 0x0202
358assert wdbi.load == b'benzingate'
359
360
361= Check KWP_WDBIPR
362
363wdbipr = KWP(b'\x6e\x02\x02')
364assert wdbipr.service == 0x6e
365assert wdbipr.identifier == 0x0202
366
367assert wdbipr.answers(wdbi)
368
369= Check KWP_WMBA
370
371wmba = KWP(b'\x3d\x11\x02\x02\x02muchData')
372assert wmba.service == 0x3d
373assert wmba.memoryAddress == 0x110202
374assert wmba.memorySize == 2
375assert wmba.dataRecord == b'muchData'
376
377= Check KWP_WMBAPR
378
379wmbapr = KWP(b'\x7d\x11\x02\x02')
380assert wmbapr.service == 0x7d
381assert wmbapr.memoryAddress == 0x110202
382
383assert wmbapr.answers(wmba)
384
385= Check KWP_CDI
386
387cdtci = KWP(b'\x14\x44\x02\x03')
388assert cdtci.service == 0x14
389assert cdtci.groupOfDTC == 0x4402
390
391cdtcipr = KWP(b'\x54\x44\x02\x03')
392assert cdtcipr.service == 0x54
393assert cdtcipr.groupOfDTC == 0x4402
394
395assert cdtcipr.answers(cdtci)
396
397= Check KWP_RC
398
399rc = KWP(b'\x31\xff\xee\xdd\xaa')
400assert rc.service == 0x31
401assert rc.routineLocalIdentifier == 0xff
402assert rc.load == b'\xee\xdd\xaa'
403
404= Check KWP_RC
405
406rc = KWP(b'\x31\xff\xee\xdd\xaa')
407assert rc.service == 0x31
408assert rc.routineLocalIdentifier == 0xff
409assert rc.load == b'\xee\xdd\xaa'
410
411
412= Check KWP_RCPR
413
414rcpr = KWP(b'\x71\xff\xee\xdd\xaa')
415assert rcpr.service == 0x71
416assert rcpr.routineLocalIdentifier == 0xff
417assert rcpr.load == b'\xee\xdd\xaa'
418
419assert rcpr.answers(rc)
420
421= Check KWP_RD
422
423rd = KWP(b'\x34\xaa\x11\x02\x02\x10\x00\x00')
424
425assert rd.service == 0x34
426assert rd.memoryAddress == 0xaa1102
427assert rd.compression == 0
428assert rd.encryption == 2
429assert rd.uncompressedMemorySize == 0x100000
430
431= Check KWP_RDPR
432
433rdpr = KWP(b'\x74\x02\x02\x02\x02\x03\x03\x03\x03')
434assert rdpr.service == 0x74
435assert rdpr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03'
436rdpr.show()
437assert rdpr.answers(rd)
438
439= Check KWP_RU
440
441ru = KWP(b'\x35\x11\x02\x02\xa0\xff\xff\xff')
442assert ru.service == 0x35
443assert ru.memoryAddress == 0x110202
444assert ru.compression == 10
445assert ru.encryption == 0
446assert ru.uncompressedMemorySize == 0xffffff
447
448= Check KWP_RUPR
449
450rupr = KWP(b'\x75\x02\x02\x02\x02\x03\x03\x03\x03')
451assert rupr.service == 0x75
452assert rupr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03'
453
454assert rupr.answers(ru)
455
456= Check KWP_TD
457
458td = KWP(b'\x36\xaapayload')
459assert td.service == 0x36
460assert td.blockSequenceCounter == 0xaa
461assert td.transferDataRequestParameter == b'payload'
462
463= Check KWP_TDPR
464
465tdpr = KWP(b'\x76\xaapayload')
466assert tdpr.service == 0x76
467assert tdpr.blockSequenceCounter == 0xaa
468assert tdpr.transferDataRequestParameter == b'payload'
469
470assert tdpr.answers(td)
471
472= Check KWP_RTE
473
474rte = KWP(b'\x37payload')
475assert rte.service == 0x37
476assert rte.transferDataRequestParameter == b'payload'
477
478= Check KWP_RTEPR
479
480rtepr = KWP(b'\x77payload')
481assert rtepr.service == 0x77
482assert rtepr.transferDataRequestParameter == b'payload'
483
484assert rtepr.answers(rte)
485
486= Check KWP_IOCBI
487
488iocbi = KWP(b'\x30\x23\xffcoffee')
489assert iocbi.service == 0x30
490assert iocbi.localIdentifier == 0x23
491assert iocbi.inputOutputControlParameter == 255
492assert iocbi.controlState == b'coffee'
493
494= Check KWP_IOCBIPR
495
496iocbipr = KWP(b'\x70\x23\xffcoffee')
497assert iocbipr.service == 0x70
498assert iocbipr.localIdentifier == 0x23
499assert iocbipr.inputOutputControlParameter == 255
500assert iocbipr.controlState == b'coffee'
501
502assert iocbipr.answers(iocbi)
503
504= Check KWP_NRC
505
506nrc = KWP(b'\x7f\x22\x33')
507assert nrc.service == 0x7f
508assert nrc.requestServiceId == 0x22
509assert nrc.negativeResponseCode == 0x33
510