• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1% Regression tests for the UDS 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.uds", globals_dict=globals())
13load_contrib("automotive.ecu", globals_dict=globals())
14
15from scapy.contrib.automotive.uds_ecu_states import *
16
17= Check if positive response answers
18
19dsc = UDS(b'\x10')
20dscpr = UDS(b'\x50')
21assert dscpr.answers(dsc)
22
23= Check hashret
24dsc.hashret() == dscpr.hashret()
25
26= Check if negative response answers
27
28dsc = UDS(b'\x10')
29neg = UDS(b'\x7f\x10\x00')
30assert neg.answers(dsc)
31
32= CHECK hashret NEG
33dsc.hashret() == neg.hashret()
34
35= Check if negative response answers not
36
37dsc = UDS(b'\x10')
38neg = UDS(b'\x7f\x11\x00')
39assert not neg.answers(dsc)
40
41= Check if positive response answers not
42
43dsc = UDS(b'\x10')
44somePacket = UDS(b'\x49')
45assert not somePacket.answers(dsc)
46
47= Check UDS_DSC
48
49dsc = UDS(b'\x10\x01')
50assert dsc.service == 0x10
51assert dsc.diagnosticSessionType == 0x01
52
53= Check UDS_DSC
54
55dsc = UDS()/UDS_DSC(b'\x01')
56assert dsc.service == 0x10
57assert dsc.diagnosticSessionType == 0x01
58
59= Check UDS_DSCPR
60
61dscpr = UDS(b'\x50\x02beef')
62assert dscpr.service == 0x50
63assert dscpr.diagnosticSessionType == 0x02
64
65assert not dscpr.answers(dsc)
66
67= Check UDS_DSCPR
68
69dscpr = UDS()/UDS_DSCPR(b'\x01beef')
70assert dscpr.service == 0x50
71assert dscpr.diagnosticSessionType == 0x01
72assert dscpr.sessionParameterRecord == b"beef"
73
74assert dscpr.answers(dsc)
75
76= Check UDS_DSC
77
78dsc = UDS()/UDS_DSC(b'\x01')
79assert dsc.service == 0x10
80assert dsc.diagnosticSessionType == 0x01
81
82= Check UDS_DSCPR
83
84dscpr = UDS()/UDS_DSCPR(b'\x01beef')
85assert dscpr.service == 0x50
86assert dscpr.diagnosticSessionType == 0x01
87assert dscpr.sessionParameterRecord == b"beef"
88
89assert dscpr.answers(dsc)
90
91= Check UDS_DSC modifies ecu state
92
93dsc = UDS()/UDS_DSC(b'\x09')
94assert dsc.service == 0x10
95assert dsc.diagnosticSessionType == 0x09
96
97= Check UDS_DSCPR modifies ecu state
98
99dscpr = UDS()/UDS_DSCPR(b'\x09beef')
100assert dscpr.service == 0x50
101assert dscpr.diagnosticSessionType == 0x09
102assert dscpr.sessionParameterRecord == b"beef"
103
104ecu = Ecu()
105ecu.update(dsc)
106ecu.update(dscpr)
107assert ecu.state.session == 9
108
109= Check UDS_ER
110
111er = UDS(b'\x11\x01')
112assert er.service == 0x11
113assert er.resetType == 0x01
114
115= Check UDS_ER
116
117er = UDS()/UDS_ER(resetType="hardReset")
118assert er.service == 0x11
119assert er.resetType == 0x01
120
121= Check UDS_ERPR
122
123erpr = UDS(b'\x51\x01')
124assert erpr.service == 0x51
125assert erpr.resetType == 0x01
126
127assert erpr.answers(er)
128
129= Check UDS_ERPR
130
131erpr = UDS(b'\x51\x04\x10')
132assert erpr.service == 0x51
133assert erpr.resetType == 0x04
134assert erpr.powerDownTime == 0x10
135
136= Check UDS_ERPR modifies ecu state
137
138erpr = UDS(b'\x51\x01')
139assert erpr.service == 0x51
140assert erpr.resetType == 0x01
141
142ecu = Ecu()
143ecu.state.security_level = 5
144ecu.state.session = 3
145ecu.state.communication_control = 4
146ecu.update(er)
147ecu.update(erpr)
148
149assert ecu.state.session == 1
150
151= Check UDS_SA
152
153sa = UDS(b'\x27\x00c0ffee')
154assert sa.service == 0x27
155assert sa.securityAccessType == 0x0
156assert sa.securityKey == b'c0ffee'
157
158= Check UDS_SAPR
159
160sapr = UDS(b'\x67\x00')
161assert sapr.service == 0x67
162assert sapr.securityAccessType == 0x0
163
164assert sapr.answers(sa)
165
166= Check UDS_SA
167
168sa = UDS(b'\x27\x01c0ffee')
169assert sa.service == 0x27
170assert sa.securityAccessType == 0x1
171assert sa.securityAccessDataRecord == b'c0ffee'
172
173= Check UDS_SAPR
174
175sapr = UDS(b'\x67\x01c0ffee')
176assert sapr.service == 0x67
177assert sapr.securityAccessType == 0x1
178assert sapr.securitySeed == b'c0ffee'
179
180assert sapr.answers(sa)
181
182= Check UDS_SA
183
184sa = UDS(b'\x27\x06c0ffee')
185assert sa.service == 0x27
186assert sa.securityAccessType == 0x6
187assert sa.securityKey == b'c0ffee'
188
189
190= Check UDS_SAPR modifies ecu state
191
192sapr = UDS(b'\x67\x06')
193assert sapr.service == 0x67
194assert sapr.securityAccessType == 0x6
195
196ecu = Ecu()
197ecu.update(sa)
198ecu.update(sapr)
199assert ecu.state.security_level == 6
200
201= Check UDS_SA
202
203sa = UDS(b'\x27\x01c0ffee')
204assert sa.service == 0x27
205assert sa.securityAccessType == 0x1
206assert sa.securityAccessDataRecord == b'c0ffee'
207
208= Check UDS_SAPR
209
210sapr = UDS(b'\x67\x01c0ffee')
211assert sapr.service == 0x67
212assert sapr.securityAccessType == 0x1
213assert sapr.securitySeed == b'c0ffee'
214
215
216= Check UDS_CC
217
218cc = UDS(b'\x28\x01\xff')
219assert cc.service == 0x28
220assert cc.controlType == 0x1
221assert cc.communicationType0 == 0x3
222assert cc.communicationType1 == 0x3
223assert cc.communicationType2 == 0xf
224
225= Check UDS_CCPR
226
227ccpr = UDS(b'\x68\x01')
228assert ccpr.service == 0x68
229assert ccpr.controlType == 0x1
230
231assert ccpr.answers(cc)
232
233= Check UDS_CCPR modifies ecu state
234
235ccpr = UDS(b'\x68\x01')
236assert ccpr.service == 0x68
237assert ccpr.controlType == 0x1
238
239ecu = Ecu()
240ecu.update(cc)
241ecu.update(ccpr)
242assert ecu.state.communication_control == 1
243
244= Check UDS_AUTH
245
246auth = UDS(b"\x29\x00")
247assert auth.service == 0x29
248assert auth.subFunction == 0x0
249
250= Build UDS_AUTH
251
252auth_build = UDS()/UDS_AUTH(subFunction=0x0)
253assert bytes(auth_build) == bytes(auth)
254
255= Check UDS_AUTHPR
256
257authpr = UDS(b"\x69\x00\x00")
258assert authpr.service == 0x69
259assert authpr.subFunction == 0x0
260assert authpr.returnValue == 0x0
261
262assert authpr.answers(auth)
263
264= Build UDS_AUTHPR
265
266authpr_build = UDS()/UDS_AUTHPR(subFunction=0x0, returnValue=0x0)
267assert bytes(authpr_build) == bytes(authpr)
268
269= Check UDS_AUTH
270
271auth = UDS(b"\x29\x01\x01\x00\x01\xFF\x00\x01\xFF")
272assert auth.service == 0x29
273assert auth.subFunction == 0x1
274assert auth.communicationConfiguration == 0x1
275assert auth.lengthOfCertificateClient == 0x1
276assert auth.certificateClient == b"\xFF"
277assert auth.lengthOfChallengeClient == 0x1
278assert auth.challengeClient == b"\xFF"
279
280= Build UDS_AUTH
281
282auth_build = UDS()/UDS_AUTH(subFunction=0x1, communicationConfiguration=0x1,
283                            certificateClient=b"\xFF", challengeClient=b"\xFF")
284assert bytes(auth_build) == bytes(auth)
285
286= Check UDS_AUTHPR
287
288authpr = UDS(b"\x69\x01\x00\x00\x01\xFF\x00\x01\xFE")
289assert authpr.service == 0x69
290assert authpr.subFunction == 0x1
291assert authpr.returnValue == 0x0
292assert authpr.lengthOfChallengeServer == 0x1
293assert authpr.challengeServer == b"\xFF"
294assert authpr.lengthOfEphemeralPublicKeyServer == 0x1
295assert authpr.ephemeralPublicKeyServer == b"\xFE"
296
297assert authpr.answers(auth)
298
299= Build UDS_AUTHPR
300
301authpr_build = UDS()/UDS_AUTHPR(subFunction=0x1, returnValue=0x0,
302                                challengeServer=b"\xFF",
303                                ephemeralPublicKeyServer=b"\xFE")
304assert bytes(authpr_build) == bytes(authpr)
305
306= Check UDS_AUTH
307
308auth = UDS(b"\x29\x02\x01\x00\x01\xFF\x00\x01\xFF")
309assert auth.service == 0x29
310assert auth.subFunction == 0x2
311assert auth.communicationConfiguration == 0x1
312assert auth.lengthOfCertificateClient == 0x1
313assert auth.certificateClient == b"\xFF"
314assert auth.lengthOfChallengeClient == 0x1
315assert auth.challengeClient == b"\xFF"
316
317= Build UDS_AUTH
318
319auth_build = UDS()/UDS_AUTH(subFunction=0x2, communicationConfiguration=0x1,
320                            certificateClient=b"\xFF", challengeClient=b"\xFF")
321assert bytes(auth_build) == bytes(auth)
322
323= Check UDS_AUTHPR
324
325authpr = UDS(b"\x69\x02\x00\x00\x01\xFF\x00\x03\xC0\xFF\xEE\x00\x01\x56\x00" +
326             b"\x01\xFE")
327assert authpr.service == 0x69
328assert authpr.subFunction == 0x2
329assert authpr.returnValue == 0x0
330assert authpr.lengthOfChallengeServer == 0x1
331assert authpr.challengeServer == b"\xFF"
332assert authpr.lengthOfCertificateServer == 0x3
333assert authpr.certificateServer == b"\xC0\xFF\xEE"
334assert authpr.lengthOfProofOfOwnershipServer == 0x1
335assert authpr.proofOfOwnershipServer == b"\x56"
336assert authpr.lengthOfEphemeralPublicKeyServer == 0x1
337assert authpr.ephemeralPublicKeyServer == b"\xFE"
338
339assert authpr.answers(auth)
340
341= Build UDS_AUTHPR
342
343authpr_build = UDS()/UDS_AUTHPR(subFunction=0x2, returnValue=0x0,
344                                challengeServer=b"\xFF",
345                                certificateServer=b"\xC0\xFF\xEE",
346                                proofOfOwnershipServer=b"\x56",
347                                ephemeralPublicKeyServer=b"\xFE")
348assert bytes(authpr_build) == bytes(authpr)
349
350= Check UDS_AUTH
351
352auth = UDS(b"\x29\x03\x00\x01\xFF\x00\x02\xFF\xFE")
353assert auth.service == 0x29
354assert auth.subFunction == 0x3
355assert auth.lengthOfProofOfOwnershipClient == 0x1
356assert auth.proofOfOwnershipClient == b"\xFF"
357assert auth.lengthOfEphemeralPublicKeyClient == 0x2
358assert auth.ephemeralPublicKeyClient == b"\xFF\xFE"
359
360= Build UDS_AUTH
361
362auth_build = UDS()/UDS_AUTH(subFunction=0x3, proofOfOwnershipClient=b"\xFF",
363                            ephemeralPublicKeyClient=b"\xFF\xFE")
364assert bytes(auth_build) == bytes(auth)
365
366= Check UDS_AUTHPR
367
368authpr = UDS(b"\x69\x03\x00\x00\x01\xFE")
369assert authpr.service == 0x69
370assert authpr.subFunction == 0x3
371assert authpr.returnValue == 0x0
372assert authpr.lengthOfSessionKeyInfo == 0x1
373assert authpr.sessionKeyInfo == b"\xFE"
374
375assert authpr.answers(auth)
376
377= Build UDS_AUTHPR
378
379authpr_build = UDS()/UDS_AUTHPR(subFunction=0x3, returnValue=0x0,
380                                sessionKeyInfo=b"\xFE")
381assert bytes(authpr_build) == bytes(authpr)
382
383= Check UDS_AUTH
384
385auth = UDS(b"\x29\x04\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE")
386assert auth.service == 0x29
387assert auth.subFunction == 0x4
388assert auth.certificateEvaluationId == 0x3
389assert auth.lengthOfCertificateData == 0x5
390assert auth.certificateData == b"\xFF\x00\x02\xFF\xFE"
391
392= Build UDS_AUTH
393
394auth_build = UDS()/UDS_AUTH(subFunction=0x4, certificateEvaluationId=0x3,
395                            certificateData=b"\xFF\x00\x02\xFF\xFE")
396assert bytes(auth_build) == bytes(auth)
397
398= Check UDS_AUTHPR
399
400authpr = UDS(b"\x69\x04\x00")
401assert authpr.service == 0x69
402assert authpr.subFunction == 0x4
403assert authpr.returnValue == 0x0
404
405assert authpr.answers(auth)
406
407= Build UDS_AUTHPR
408
409authpr_build = UDS()/UDS_AUTHPR(subFunction=0x4, returnValue=0x0)
410assert bytes(authpr_build) == bytes(authpr)
411
412= Check UDS_AUTH
413
414auth = UDS(b"\x29\x05\x01\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" +
415           b"\xFF\xEE\x20\x01")
416assert auth.service == 0x29
417assert auth.subFunction == 0x5
418assert auth.communicationConfiguration == 0x1
419assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
420                                  b"\x34\x56\x03\xFF\xEE\x20\x01")
421
422= Build UDS_AUTH
423
424auth_build = UDS()/UDS_AUTH(subFunction=0x5, communicationConfiguration=0x1,
425                            algorithmIndicator=(b"\x03\x00\x05\xFF\x00\x02" +
426                                                b"\xFF\xFE\xBE\x34\x56\x03" +
427                                                b"\xFF\xEE\x20\x01"))
428assert bytes(auth_build) == bytes(auth)
429
430= Check UDS_AUTHPR
431
432authpr = UDS(b"\x69\x05\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" +
433             b"\xFF\xEE\x20\x01\x00\x01\xFF\x00\x00")
434assert authpr.service == 0x69
435assert authpr.subFunction == 0x5
436assert authpr.returnValue == 0x0
437assert authpr.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
438                                     b"\x34\x56\x03\xFF\xEE\x20\x01")
439assert authpr.lengthOfChallengeServer == 0x1
440assert authpr.challengeServer == b"\xFF"
441assert authpr.lengthOfNeededAdditionalParameter == 0x0
442assert authpr.neededAdditionalParameter == b""
443
444assert authpr.answers(auth)
445
446= Build UDS_AUTHPR
447
448authpr_build = UDS()/UDS_AUTHPR(subFunction=0x5, returnValue=0x0,
449                                algorithmIndicator=(b"\x03\x00\x05\xFF\x00" +
450                                                    b"\x02\xFF\xFE\xBE\x34" +
451                                                    b"\x56\x03\xFF\xEE\x20" +
452                                                    b"\x01"),
453                                challengeServer=b"\xFF")
454assert bytes(authpr_build) == bytes(authpr)
455
456= Check UDS_AUTH
457
458auth = UDS(b"\x29\x06\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03\xFF" +
459           b"\xEE\x20\x01\x00\x01\xFF\x00\x01\xFF\x00\x00")
460assert auth.service == 0x29
461assert auth.subFunction == 0x6
462assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
463                                  b"\x34\x56\x03\xFF\xEE\x20\x01")
464assert auth.lengthOfProofOfOwnershipClient == 0x1
465assert auth.proofOfOwnershipClient == b"\xFF"
466assert auth.lengthOfChallengeClient == 0x1
467assert auth.challengeClient == b"\xFF"
468assert auth.lengthOfAdditionalParameter == 0x0
469assert auth.additionalParameter == b""
470
471= Build UDS_AUTH
472
473auth_build = UDS()/UDS_AUTH(subFunction=0x6,
474                            algorithmIndicator=(b"\x03\x00\x05\xFF\x00\x02" +
475                                                b"\xFF\xFE\xBE\x34\x56\x03" +
476                                                b"\xFF\xEE\x20\x01"),
477                            proofOfOwnershipClient=b"\xFF",
478                            challengeClient=b"\xFF")
479assert bytes(auth_build) == bytes(auth)
480
481= Check UDS_AUTHPR
482
483authpr = UDS(b"\x69\x06\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" +
484             b"\xFF\xEE\x20\x01\x00\x01\xFE")
485assert authpr.service == 0x69
486assert authpr.subFunction == 0x6
487assert authpr.returnValue == 0x0
488assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
489                                  b"\x34\x56\x03\xFF\xEE\x20\x01")
490assert authpr.lengthOfSessionKeyInfo == 0x1
491assert authpr.sessionKeyInfo == b"\xFE"
492
493assert authpr.answers(auth)
494
495= Build UDS_AUTHPR
496
497authpr_build = UDS()/UDS_AUTHPR(subFunction=0x6, returnValue=0x0,
498                                algorithmIndicator=(b"\x03\x00\x05\xFF\x00" +
499                                                    b"\x02\xFF\xFE\xBE\x34" +
500                                                    b"\x56\x03\xFF\xEE\x20\x01"
501                                                    ),
502                                sessionKeyInfo=b"\xFE")
503assert bytes(authpr_build) == bytes(authpr)
504
505= Check UDS_AUTH
506
507auth = UDS(b"\x29\x07\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03\xFF" +
508           b"\xEE\x20\x01\x00\x01\xFF\x00\x01\xFF\x00\x02\xC0\xCA")
509assert auth.service == 0x29
510assert auth.subFunction == 0x7
511assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
512                                  b"\x34\x56\x03\xFF\xEE\x20\x01")
513assert auth.lengthOfProofOfOwnershipClient == 0x1
514assert auth.proofOfOwnershipClient == b"\xFF"
515assert auth.lengthOfChallengeClient == 0x1
516assert auth.challengeClient == b"\xFF"
517assert auth.lengthOfAdditionalParameter == 0x2
518assert auth.additionalParameter == b"\xC0\xCA"
519
520= Build UDS_AUTH
521
522auth_build = UDS()/UDS_AUTH(subFunction=0x7,
523                            algorithmIndicator=(b"\x03\x00\x05\xFF\x00\x02" +
524                                                b"\xFF\xFE\xBE\x34\x56\x03" +
525                                                b"\xFF\xEE\x20\x01"),
526                            proofOfOwnershipClient=b"\xFF",
527                            challengeClient=b"\xFF",
528                            additionalParameter=b"\xC0\xCA")
529assert bytes(auth_build) == bytes(auth)
530
531= Check UDS_AUTHPR
532
533authpr = UDS(b"\x69\x07\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" +
534             b"\xFF\xEE\x20\x01\x00\x02\xFE\x20\x00\x01\xFE")
535assert authpr.service == 0x69
536assert authpr.subFunction == 0x7
537assert authpr.returnValue == 0x0
538assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" +
539                                  b"\x34\x56\x03\xFF\xEE\x20\x01")
540assert authpr.lengthOfProofOfOwnershipServer == 0x2
541assert authpr.proofOfOwnershipServer == b"\xFE\x20"
542assert authpr.lengthOfSessionKeyInfo == 0x1
543assert authpr.sessionKeyInfo == b"\xFE"
544
545assert authpr.answers(auth)
546
547= Build UDS_AUTHPR
548
549authpr_build = UDS()/UDS_AUTHPR(subFunction=0x7, returnValue=0x0,
550                                algorithmIndicator=(b"\x03\x00\x05\xFF\x00" +
551                                                    b"\x02\xFF\xFE\xBE\x34" +
552                                                    b"\x56\x03\xFF\xEE\x20\x01"
553                                                    ),
554                                proofOfOwnershipServer=b"\xFE\x20",
555                                sessionKeyInfo=b"\xFE")
556assert bytes(authpr_build) == bytes(authpr)
557
558= Check UDS_AUTH
559
560auth = UDS(b"\x29\x08")
561assert auth.service == 0x29
562assert auth.subFunction == 0x8
563
564= Build UDS_AUTH
565
566auth_build = UDS()/UDS_AUTH(subFunction=0x8)
567assert bytes(auth_build) == bytes(auth)
568
569= Check UDS_AUTHPR
570
571authpr = UDS(b"\x69\x08\x00")
572assert authpr.service == 0x69
573assert authpr.subFunction == 0x8
574assert authpr.returnValue == 0x0
575
576assert authpr.answers(auth)
577
578= Build UDS_AUTHPR
579
580authpr_build = UDS()/UDS_AUTHPR(subFunction=0x8)
581assert bytes(authpr_build) == bytes(authpr)
582
583= Check UDS_TP
584
585tp = UDS(b'\x3E\x01')
586assert tp.service == 0x3e
587assert tp.subFunction == 0x1
588
589= Check UDS_TPPR
590
591tppr = UDS(b'\x7E\x01')
592assert tppr.service == 0x7e
593assert tppr.zeroSubFunction == 0x1
594
595assert tppr.answers(tp)
596
597= Check UDS_ATP
598
599atp = UDS(b'\x83\x01')
600assert atp.service == 0x83
601assert atp.timingParameterAccessType == 0x1
602
603= Check UDS_ATPPR
604
605atppr = UDS(b'\xc3\x01')
606assert atppr.service == 0xc3
607assert atppr.timingParameterAccessType == 0x1
608
609assert atppr.answers(atp)
610
611= Check UDS_ATP
612
613atp = UDS(b'\x83\x04coffee')
614assert atp.service == 0x83
615assert atp.timingParameterAccessType == 0x4
616assert atp.timingParameterRequestRecord == b'coffee'
617
618= Check UDS_ATPPR
619
620atppr = UDS(b'\xc3\x03coffee')
621assert atppr.service == 0xc3
622assert atppr.timingParameterAccessType == 0x3
623assert atppr.timingParameterResponseRecord == b'coffee'
624
625= Check UDS_SDT
626
627sdt = UDS(b'\x84\x80\x00\x01\x12\x34\x13\x37\x01coffee')
628assert sdt.service == 0x84
629assert sdt.requestMessage == 0x1
630assert sdt.preEstablishedKeyUsed == 0x0
631assert sdt.encryptedMessage == 0x0
632assert sdt.signedMessage == 0x0
633assert sdt.signedResponseRequested == 0x0
634assert sdt.signatureEncryptionCalculation == 0x1
635assert sdt.signatureLength == 0x1234
636assert sdt.antiReplayCounter == 0x1337
637assert sdt.internalMessageServiceRequestId == 0x1
638assert sdt.dataRecord == b'coffee'
639
640= Build UDS_SDT
641
642sdt = UDS()/UDS_SDT(requestMessage=0x1, signatureEncryptionCalculation=0x1,
643                    signatureLength=0x1234, antiReplayCounter=0x1337,
644                    internalMessageServiceRequestId=0x1, dataRecord=b'coffee')
645assert sdt.service == 0x84
646assert sdt.requestMessage == 0x1
647assert sdt.preEstablishedKeyUsed == 0x0
648assert sdt.encryptedMessage == 0x0
649assert sdt.signedMessage == 0x0
650assert sdt.signedResponseRequested == 0x0
651assert sdt.signatureEncryptionCalculation == 0x1
652assert sdt.signatureLength == 0x1234
653assert sdt.antiReplayCounter == 0x1337
654assert sdt.internalMessageServiceRequestId == 0x1
655assert sdt.dataRecord == b'coffee'
656
657= Check UDS_SDTPR
658
659sdtpr = UDS(b'\xC4\x04\x00\x01\x12\x34\x13\x37\x01coffee')
660assert sdtpr.service == 0xC4
661assert sdtpr.requestMessage == 0x0
662assert sdtpr.preEstablishedKeyUsed == 0x0
663assert sdtpr.encryptedMessage == 0x0
664assert sdtpr.signedMessage == 0x1
665assert sdtpr.signedResponseRequested == 0x0
666assert sdtpr.signatureEncryptionCalculation == 0x1
667assert sdtpr.signatureLength == 0x1234
668assert sdtpr.antiReplayCounter == 0x1337
669assert sdtpr.internalMessageServiceResponseId == 0x1
670assert sdtpr.dataRecord == b'coffee'
671
672assert sdtpr.answers(sdt)
673
674= Check UDS_CDTCS
675
676cdtcs = UDS(b'\x85\x00coffee')
677assert cdtcs.service == 0x85
678assert cdtcs.DTCSettingType == 0
679assert cdtcs.DTCSettingControlOptionRecord == b'coffee'
680
681= Check UDS_CDTCSPR
682
683cdtcspr = UDS(b'\xC5\x00')
684assert cdtcspr.service == 0xC5
685assert cdtcspr.DTCSettingType == 0
686
687assert cdtcspr.answers(cdtcs)
688
689= Check UDS_ROE
690
691roe = UDS(b'\x86\x00\x10coffee')
692assert roe.service == 0x86
693assert roe.eventType == 0
694assert roe.eventWindowTime == 16
695assert roe.eventTypeRecord == b'coffee'
696
697= Check UDS_ROEPR
698
699roepr = UDS(b'\xC6\x00\x01\x10coffee')
700assert roepr.service == 0xC6
701assert roepr.eventType == 0
702assert roepr.numberOfIdentifiedEvents == 1
703assert roepr.eventWindowTime == 16
704assert roepr.eventTypeRecord == b'coffee'
705
706assert roepr.answers(roe)
707
708= Check UDS_LC
709
710lc = UDS(b'\x87\x01\x02')
711assert lc.service == 0x87
712assert lc.linkControlType == 0x01
713assert lc.baudrateIdentifier == 0x02
714
715= Check UDS_LCPR
716
717lcpr = UDS(b'\xC7\x01')
718assert lcpr.service == 0xC7
719assert lcpr.linkControlType == 0x01
720
721assert lcpr.answers(lc)
722
723= Check UDS_LC
724
725lc = UDS(b'\x87\x02\x02\x03\x04')
726assert lc.service == 0x87
727assert lc.linkControlType == 0x02
728assert lc.baudrateHighByte == 0x02
729assert lc.baudrateMiddleByte == 0x03
730assert lc.baudrateLowByte == 0x04
731
732= Check UDS_RDBI
733
734rdbi = UDS(b'\x22\x01\x02')
735assert rdbi.service == 0x22
736assert rdbi.identifiers[0] == 0x0102
737
738= Build UDS_RDBI
739
740rdbi = UDS()/UDS_RDBI(identifiers=[0x102])
741assert rdbi.service == 0x22
742assert rdbi.identifiers[0] == 0x0102
743assert bytes(rdbi) == b'\x22\x01\x02'
744
745= Check UDS_RDBI2
746
747rdbi = UDS(b'\x22\x01\x02\x03\x04')
748assert rdbi.service == 0x22
749assert rdbi.identifiers[0] == 0x0102
750assert rdbi.identifiers[1] == 0x0304
751assert raw(rdbi) == b'\x22\x01\x02\x03\x04'
752
753= Build UDS_RDBI2
754
755rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x304])
756assert rdbi.service == 0x22
757assert rdbi.identifiers[0] == 0x0102
758assert rdbi.identifiers[1] == 0x0304
759assert raw(rdbi) == b'\x22\x01\x02\x03\x04'
760
761= Test observable dict used in UDS_RDBI, setter
762
763UDS_RDBI.dataIdentifiers[0x102] = "turbo"
764UDS_RDBI.dataIdentifiers[0x103] = "fullspeed"
765
766rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x103])
767
768assert "turbo" in plain_str(repr(rdbi))
769assert "fullspeed" in plain_str(repr(rdbi))
770
771= Test observable dict used in UDS_RDBI, deleter
772
773UDS_RDBI.dataIdentifiers[0x102] = "turbo"
774
775rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x103])
776assert "turbo" in plain_str(repr(rdbi))
777
778del UDS_RDBI.dataIdentifiers[0x102]
779UDS_RDBI.dataIdentifiers[0x103] = "slowspeed"
780
781rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x103])
782
783assert "turbo" not in plain_str(repr(rdbi))
784assert "slowspeed" in plain_str(repr(rdbi))
785
786= Check UDS_RDBIPR
787
788rdbipr = UDS(b'\x62\x01\x02dieselgate')
789assert rdbipr.service == 0x62
790assert rdbipr.dataIdentifier == 0x0102
791assert rdbipr.load == b'dieselgate'
792
793assert rdbipr.answers(rdbi)
794
795= Check UDS_RMBA
796
797rmba = UDS(b'\x23\x11\x02\x02')
798assert rmba.service == 0x23
799assert rmba.memorySizeLen == 1
800assert rmba.memoryAddressLen == 1
801assert rmba.memoryAddress1 == 2
802assert rmba.memorySize1 == 2
803
804= Check UDS_RMBA
805
806rmba = UDS(b'\x23\x22\x02\x02\x03\x03')
807assert rmba.service == 0x23
808assert rmba.memorySizeLen == 2
809assert rmba.memoryAddressLen == 2
810assert rmba.memoryAddress2 == 0x202
811assert rmba.memorySize2 == 0x303
812
813= Check UDS_RMBA
814
815rmba = UDS(b'\x23\x33\x02\x02\x02\x03\x03\x03')
816assert rmba.service == 0x23
817assert rmba.memorySizeLen == 3
818assert rmba.memoryAddressLen == 3
819assert rmba.memoryAddress3 == 0x20202
820assert rmba.memorySize3 == 0x30303
821
822= Check UDS_RMBA
823
824rmba = UDS(b'\x23\x44\x02\x02\x02\x02\x03\x03\x03\x03')
825assert rmba.service == 0x23
826assert rmba.memorySizeLen == 4
827assert rmba.memoryAddressLen == 4
828assert rmba.memoryAddress4 == 0x2020202
829assert rmba.memorySize4 == 0x3030303
830
831= Check UDS_RMBAPR
832
833rmbapr = UDS(b'\x63muchData')
834assert rmbapr.service == 0x63
835assert rmbapr.dataRecord == b'muchData'
836
837assert rmbapr.answers(rmba)
838
839= Check UDS_RSDBI
840
841rsdbi = UDS(b'\x24\x12\x34')
842assert rsdbi.service == 0x24
843assert rsdbi.dataIdentifier == 0x1234
844
845= Check UDS_RSDBIPR
846
847rsdbipr = UDS(b'\x64\x12\x34\xffmuchData')
848assert rsdbipr.service == 0x64
849assert rsdbipr.dataIdentifier == 0x1234
850assert rsdbipr.scalingByte == 255
851assert rsdbipr.dataRecord == b'muchData'
852
853assert rsdbipr.answers(rsdbi)
854
855= Check UDS_RSDBPI
856
857rsdbpi = UDS(b'\x2a\x12\x34coffee')
858assert rsdbpi.service == 0x2a
859assert rsdbpi.transmissionMode == 0x12
860assert rsdbpi.periodicDataIdentifier == 0x34
861assert rsdbpi.furtherPeriodicDataIdentifier == b'coffee'
862
863= Check UDS_RSDBPIPR
864
865rsdbpipr = UDS(b'\x6a\xff\x12\x34')
866assert rsdbpipr.service == 0x6a
867assert rsdbpipr.periodicDataIdentifier == 255
868assert rsdbpipr.dataRecord == b'\x12\x34'
869
870assert not rsdbpipr.answers(rsdbpi)
871
872= Check UDS_RSDBPIPR
873
874rsdbpipr = UDS(b'\x6a\x34\x12\x34')
875assert rsdbpipr.service == 0x6a
876assert rsdbpipr.periodicDataIdentifier == 0x34
877assert rsdbpipr.dataRecord == b'\x12\x34'
878
879assert rsdbpipr.answers(rsdbpi)
880
881= Check UDS_DDDI
882
883dddi = UDS(b'\x2c\x12coffee')
884assert dddi.service == 0x2c
885assert dddi.subFunction == 0x12
886assert dddi.dataRecord == b'coffee'
887
888= Check UDS_DDDIPR
889
890dddipr = UDS(b'\x6c\x12\x44\x55')
891assert dddipr.service == 0x6c
892assert dddipr.subFunction == 0x12
893assert dddipr.dynamicallyDefinedDataIdentifier == 0x4455
894
895assert dddipr.answers(dddi)
896
897= Check UDS_WDBI
898
899wdbi = UDS(b'\x2e\x01\x02dieselgate')
900assert wdbi.service == 0x2e
901assert wdbi.dataIdentifier == 0x0102
902assert wdbi.load == b'dieselgate'
903
904= Build UDS_WDBI
905
906wdbi = UDS()/UDS_WDBI(dataIdentifier=0x0102)/Raw(load=b'dieselgate')
907assert wdbi.service == 0x2e
908assert wdbi.dataIdentifier == 0x0102
909assert wdbi.load == b'dieselgate'
910assert bytes(wdbi) == b'\x2e\x01\x02dieselgate'
911
912= Check UDS_WDBI
913
914wdbi = UDS(b'\x2e\x01\x02dieselgate')
915assert wdbi.service == 0x2e
916assert wdbi.dataIdentifier == 0x0102
917assert wdbi.load == b'dieselgate'
918
919wdbi = UDS(b'\x2e\x02\x02benzingate')
920assert wdbi.service == 0x2e
921assert wdbi.dataIdentifier == 0x0202
922assert wdbi.load == b'benzingate'
923
924
925= Check UDS_WDBIPR
926
927wdbipr = UDS(b'\x6e\x02\x02')
928assert wdbipr.service == 0x6e
929assert wdbipr.dataIdentifier == 0x0202
930
931assert wdbipr.answers(wdbi)
932
933= Check UDS_WMBA
934
935wmba = UDS(b'\x3d\x11\x02\x02muchData')
936assert wmba.service == 0x3d
937assert wmba.memorySizeLen == 1
938assert wmba.memoryAddressLen == 1
939assert wmba.memoryAddress1 == 2
940assert wmba.memorySize1 == 2
941assert wmba.dataRecord == b'muchData'
942
943= Check UDS_WMBAPR
944
945wmbapr = UDS(b'\x7d\x11\x02\x02')
946assert wmbapr.service == 0x7d
947assert wmbapr.memorySizeLen == 1
948assert wmbapr.memoryAddressLen == 1
949assert wmbapr.memoryAddress1 == 2
950assert wmbapr.memorySize1 == 2
951
952assert wmbapr.answers(wmba)
953
954= Check UDS_WMBA
955
956wmba = UDS(b'\x3d\x22\x02\x02\x03\x03muchData')
957assert wmba.service == 0x3d
958assert wmba.memorySizeLen == 2
959assert wmba.memoryAddressLen == 2
960assert wmba.memoryAddress2 == 0x202
961assert wmba.memorySize2 == 0x303
962assert wmba.dataRecord == b'muchData'
963
964= Check UDS_WMBAPR
965
966wmbapr = UDS(b'\x7d\x22\x02\x02\x03\x03')
967assert wmbapr.service == 0x7d
968assert wmbapr.memorySizeLen == 2
969assert wmbapr.memoryAddressLen == 2
970assert wmbapr.memoryAddress2 == 0x202
971assert wmbapr.memorySize2 == 0x303
972
973assert wmbapr.answers(wmba)
974
975= Check UDS_WMBA
976
977wmba = UDS(b'\x3d\x33\x02\x02\x02\x03\x03\x03muchData')
978assert wmba.service == 0x3d
979assert wmba.memorySizeLen == 3
980assert wmba.memoryAddressLen == 3
981assert wmba.memoryAddress3 == 0x20202
982assert wmba.memorySize3 == 0x30303
983assert wmba.dataRecord == b'muchData'
984
985= Check UDS_WMBA
986
987wmba = UDS(b'\x3d\x44\x02\x02\x02\x02\x03\x03\x03\x03muchData')
988assert wmba.service == 0x3d
989assert wmba.memorySizeLen == 4
990assert wmba.memoryAddressLen == 4
991assert wmba.memoryAddress4 == 0x2020202
992assert wmba.memorySize4 == 0x3030303
993assert wmba.dataRecord == b'muchData'
994
995= Check UDS_WMBAPR
996
997wmbapr = UDS(b'\x7d\x33\x02\x02\x02\x03\x03\x03')
998assert wmbapr.service == 0x7d
999assert wmbapr.memorySizeLen == 3
1000assert wmbapr.memoryAddressLen == 3
1001assert wmbapr.memoryAddress3 == 0x20202
1002assert wmbapr.memorySize3 == 0x30303
1003
1004assert not wmbapr.answers(wmba)
1005
1006= Check UDS_WMBAPR
1007
1008wmbapr = UDS(b'\x7d\x44\x02\x02\x02\x02\x03\x03\x03\x03')
1009assert wmbapr.service == 0x7d
1010assert wmbapr.memorySizeLen == 4
1011assert wmbapr.memoryAddressLen == 4
1012assert wmbapr.memoryAddress4 == 0x2020202
1013assert wmbapr.memorySize4 == 0x3030303
1014
1015assert wmbapr.answers(wmba)
1016
1017= Check UDS_CDTCI
1018
1019cdtci = UDS(b'\x14\x44\x02\x03')
1020assert cdtci.service == 0x14
1021assert cdtci.groupOfDTCHighByte == 0x44
1022assert cdtci.groupOfDTCMiddleByte == 0x02
1023assert cdtci.groupOfDTCLowByte == 0x3
1024
1025= Check UDS_RDTCI
1026
1027rdtci = UDS(b'\x19\x44')
1028assert rdtci.service == 0x19
1029assert rdtci.reportType == 0x44
1030
1031= Check UDS_RDTCI
1032
1033rdtci = UDS(b'\x19\x01\xff')
1034assert rdtci.service == 0x19
1035assert rdtci.reportType == 0x01
1036assert rdtci.DTCStatusMask == 0xff
1037
1038= Check UDS_RDTCIPR
1039
1040rdtcipr = UDS(b'\x59\x01\xff\xee\xdd\xaa')
1041assert rdtcipr.service == 0x59
1042assert rdtcipr.reportType == 1
1043assert rdtcipr.DTCStatusAvailabilityMask == 0xff
1044assert rdtcipr.DTCFormatIdentifier == 0xee
1045assert rdtcipr.DTCCount == 0xddaa
1046
1047assert rdtcipr.answers(rdtci)
1048
1049rdtcipr1 = UDS(b'\x59\x02\xff\x11\x07\x11\'\x022\x12\'\x01\x07\x11\'\x01\x18\x12\'\x01\x13\x12\'\x01"\x11\'\x06C\x00\'\x06S\x00\'\x161\x00\'\x14\x03\x12\'')
1050
1051assert len(rdtcipr1.DTCAndStatusRecord) == 10
1052assert rdtcipr1.DTCAndStatusRecord[0].dtc.system == 0
1053assert rdtcipr1.DTCAndStatusRecord[0].dtc.type == 1
1054assert rdtcipr1.DTCAndStatusRecord[0].dtc.numeric_value_code == 263
1055assert rdtcipr1.DTCAndStatusRecord[0].dtc.additional_information_code == 17
1056assert rdtcipr1.DTCAndStatusRecord[0].status == 0x27
1057assert rdtcipr1.DTCAndStatusRecord[-1].dtc.system == 0
1058assert rdtcipr1.DTCAndStatusRecord[-1].dtc.type == 1
1059assert rdtcipr1.DTCAndStatusRecord[-1].dtc.numeric_value_code == 1027
1060assert rdtcipr1.DTCAndStatusRecord[-1].dtc.additional_information_code == 18
1061assert rdtcipr1.DTCAndStatusRecord[-1].status == 0x27
1062
1063= Check UDS_RDTCI
1064
1065rdtci = UDS(b'\x19\x02\xff')
1066assert rdtci.service == 0x19
1067assert rdtci.reportType == 0x02
1068assert rdtci.DTCStatusMask == 0xff
1069
1070= Check UDS_RDTCI
1071
1072rdtci = UDS(b'\x19\x0f\xff')
1073assert rdtci.service == 0x19
1074assert rdtci.reportType == 0x0f
1075assert rdtci.DTCStatusMask == 0xff
1076
1077= Check UDS_RDTCI
1078
1079rdtci = UDS(b'\x19\x11\xff')
1080assert rdtci.service == 0x19
1081assert rdtci.reportType == 0x11
1082assert rdtci.DTCStatusMask == 0xff
1083
1084= Check UDS_RDTCI
1085
1086rdtci = UDS(b'\x19\x12\xff')
1087assert rdtci.service == 0x19
1088assert rdtci.reportType == 0x12
1089assert rdtci.DTCStatusMask == 0xff
1090
1091= Check UDS_RDTCI
1092
1093rdtci = UDS(b'\x19\x13\xff')
1094assert rdtci.service == 0x19
1095assert rdtci.reportType == 0x13
1096assert rdtci.DTCStatusMask == 0xff
1097
1098= Check UDS_RDTCI
1099
1100rdtci = UDS(b'\x19\x03\xff\xee\xdd\xaa')
1101assert rdtci.service == 0x19
1102assert rdtci.reportType == 0x03
1103assert rdtci.dtc == DTC(bytes.fromhex("ffeedd"))
1104assert rdtci.DTCSnapshotRecordNumber == 0xaa
1105
1106= Check UDS_RDTCI
1107
1108rdtci = UDS(b'\x19\x04\xff\xee\xdd\xaa')
1109assert rdtci.service == 0x19
1110assert rdtci.reportType == 0x04
1111assert rdtci.dtc == DTC(bytes.fromhex("ffeedd"))
1112assert rdtci.DTCSnapshotRecordNumber == 0xaa
1113
1114= Check UDS_RDTCI
1115
1116rdtci = UDS(b'\x19\x05\xaa')
1117assert rdtci.service == 0x19
1118assert rdtci.reportType == 0x05
1119assert rdtci.DTCSnapshotRecordNumber == 0xaa
1120
1121= Check UDS_RDTCI
1122
1123rdtci = UDS(b'\x19\x06\xff\xee\xdd\xaa')
1124assert rdtci.service == 0x19
1125assert rdtci.reportType == 0x06
1126assert rdtci.dtc == DTC(bytes.fromhex("ffeedd"))
1127assert rdtci.DTCExtendedDataRecordNumber == 0xaa
1128
1129= Check UDS_RDTCI
1130
1131rdtci = UDS(b'\x19\x07\xaa\xbb')
1132assert rdtci.service == 0x19
1133assert rdtci.reportType == 0x07
1134assert rdtci.DTCSeverityMask == 0xaa
1135assert rdtci.DTCStatusMask == 0xbb
1136
1137= Check UDS_RDTCI
1138
1139rdtci = UDS(b'\x19\x08\xaa\xbb')
1140assert rdtci.service == 0x19
1141assert rdtci.reportType == 0x08
1142assert rdtci.DTCSeverityMask == 0xaa
1143assert rdtci.DTCStatusMask == 0xbb
1144
1145= Check UDS_RDTCI
1146
1147rdtci = UDS(b'\x19\x09\xff\xee\xdd')
1148assert rdtci.service == 0x19
1149assert rdtci.reportType == 0x09
1150assert rdtci.dtc == DTC(bytes.fromhex("ffeedd"))
1151
1152= Check UDS_RDTCI
1153
1154rdtci = UDS(b'\x19\x10\xff\xee\xdd\xaa')
1155assert rdtci.service == 0x19
1156assert rdtci.reportType == 0x10
1157assert rdtci.dtc == DTC(bytes.fromhex("ffeedd"))
1158assert rdtci.DTCExtendedDataRecordNumber == 0xaa
1159
1160
1161= Check UDS_RDTCIPR
1162
1163rdtcipr = UDS(b'\x59\x02\xff\xee\xdd\xaa\x02')
1164rdtcipr.show()
1165assert rdtcipr.service == 0x59
1166assert rdtcipr.reportType == 2
1167assert rdtcipr.DTCStatusAvailabilityMask == 0xff
1168assert rdtcipr.DTCAndStatusRecord[0].dtc.system == 3
1169assert rdtcipr.DTCAndStatusRecord[0].dtc.type == 2
1170assert rdtcipr.DTCAndStatusRecord[0].dtc.numeric_value_code == 3805
1171assert rdtcipr.DTCAndStatusRecord[0].dtc.additional_information_code == 170
1172assert rdtcipr.DTCAndStatusRecord[0].status == 2
1173
1174assert not rdtcipr.answers(rdtci)
1175
1176= Check UDS_RDTCIPR
1177
1178rdtcipr = UDS(b'\x59\x03\xff\xee\xdd\xaa')
1179assert rdtcipr.service == 0x59
1180assert rdtcipr.reportType == 3
1181assert rdtcipr.dataRecord == b'\xff\xee\xdd\xaa'
1182
1183
1184= Check UDS_RDTCIPR 2
1185req = UDS(bytes.fromhex("1904480a46ff"))
1186resp = UDS(bytes.fromhex("5904480a46af000b170002ff6417010a8278fa170c2ff1800000800104800200028003400a8004808005054002400a400004010b170002ff6417010a82ec69170c2f2c800000800100800200028003400a80048080050540024017400004"))
1187
1188assert resp.answers(req)
1189
1190req = UDS(bytes.fromhex("1904480a47ff"))
1191resp = UDS(bytes.fromhex("5904480a46af000b170002ff6417010a8278fa170c2ff1800000800104800200028003400a8004808005054002400a400004010b170002ff6417010a82ec69170c2f2c800000800100800200028003400a80048080050540024017400004"))
1192
1193assert not resp.answers(req)
1194
1195req = UDS(bytes.fromhex("1906480a46ff"))
1196resp = UDS(bytes.fromhex("5906480a46af010002070328"))
1197
1198assert resp.answers(req)
1199
1200= Check UDS_RC
1201
1202rc = UDS(b'\x31\x03\xff\xee\xdd\xaa')
1203assert rc.service == 0x31
1204assert rc.routineControlType == 3
1205assert rc.routineIdentifier == 0xffee
1206assert rc.load == b'\xdd\xaa'
1207
1208= Check UDS_RC
1209
1210rc = UDS(b'\x31\x03\xff\xee\xdd\xaa')
1211assert rc.service == 0x31
1212assert rc.routineControlType == 3
1213assert rc.routineIdentifier == 0xffee
1214assert rc.load == b'\xdd\xaa'
1215
1216
1217= Check UDS_RCPR
1218
1219rcpr = UDS(b'\x71\x03\xff\xee\xdd\xaa')
1220assert rcpr.service == 0x71
1221assert rcpr.routineControlType == 3
1222assert rcpr.routineIdentifier == 0xffee
1223assert rcpr.load == b'\xdd\xaa'
1224
1225= Check UDS_RD
1226
1227rd = UDS(b'\x34\xaa\x11\x02\x02')
1228assert rd.service == 0x34
1229assert rd.dataFormatIdentifier == 0xaa
1230assert rd.memorySizeLen == 1
1231assert rd.memoryAddressLen == 1
1232assert rd.memoryAddress1 == 2
1233assert rd.memorySize1 == 2
1234
1235
1236= Check UDS_RD
1237
1238rd = UDS(b'\x34\xaa\x22\x02\x02\x03\x03')
1239assert rd.service == 0x34
1240assert rd.dataFormatIdentifier == 0xaa
1241assert rd.memorySizeLen == 2
1242assert rd.memoryAddressLen == 2
1243assert rd.memoryAddress2 == 0x202
1244assert rd.memorySize2 == 0x303
1245
1246= Check UDS_RD
1247
1248rd = UDS(b'\x34\xaa\x33\x02\x02\x02\x03\x03\x03')
1249assert rd.service == 0x34
1250assert rd.dataFormatIdentifier == 0xaa
1251assert rd.memorySizeLen == 3
1252assert rd.memoryAddressLen == 3
1253assert rd.memoryAddress3 == 0x20202
1254assert rd.memorySize3 == 0x30303
1255
1256= Check UDS_RD
1257
1258rd = UDS(b'\x34\xaa\x44\x02\x02\x02\x02\x03\x03\x03\x03')
1259assert rd.service == 0x34
1260assert rd.dataFormatIdentifier == 0xaa
1261assert rd.memorySizeLen == 4
1262assert rd.memoryAddressLen == 4
1263assert rd.memoryAddress4 == 0x2020202
1264assert rd.memorySize4 == 0x3030303
1265
1266
1267= Check UDS_RDPR
1268
1269rdpr = UDS(b'\x74\x40\x02\x02\x02\x02\x03\x03\x03\x03')
1270assert rdpr.service == 0x74
1271assert rdpr.memorySizeLen == 4
1272assert rdpr.reserved == 0
1273assert rdpr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03'
1274
1275assert rdpr.answers(rd)
1276
1277= Check UDS_RU
1278
1279ru = UDS(b'\x35\xaa\x11\x02\x02')
1280assert ru.service == 0x35
1281assert ru.dataFormatIdentifier == 0xaa
1282assert ru.memorySizeLen == 1
1283assert ru.memoryAddressLen == 1
1284assert ru.memoryAddress1 == 2
1285assert ru.memorySize1 == 2
1286
1287= Check UDS_RU
1288
1289ru = UDS(b'\x35\xaa\x22\x02\x02\x03\x03')
1290assert ru.service == 0x35
1291assert ru.dataFormatIdentifier == 0xaa
1292assert ru.memorySizeLen == 2
1293assert ru.memoryAddressLen == 2
1294assert ru.memoryAddress2 == 0x202
1295assert ru.memorySize2 == 0x303
1296
1297
1298= Check UDS_RU
1299
1300ru = UDS(b'\x35\xaa\x33\x02\x02\x02\x03\x03\x03')
1301assert ru.service == 0x35
1302assert ru.dataFormatIdentifier == 0xaa
1303assert ru.memorySizeLen == 3
1304assert ru.memoryAddressLen == 3
1305assert ru.memoryAddress3 == 0x20202
1306assert ru.memorySize3 == 0x30303
1307
1308
1309= Check UDS_RU
1310
1311ru = UDS(b'\x35\xaa\x44\x02\x02\x02\x02\x03\x03\x03\x03')
1312assert ru.service == 0x35
1313assert ru.dataFormatIdentifier == 0xaa
1314assert ru.memorySizeLen == 4
1315assert ru.memoryAddressLen == 4
1316assert ru.memoryAddress4 == 0x2020202
1317assert ru.memorySize4 == 0x3030303
1318
1319
1320= Check UDS_RUPR
1321
1322rupr = UDS(b'\x75\x40\x02\x02\x02\x02\x03\x03\x03\x03')
1323assert rupr.service == 0x75
1324assert rupr.memorySizeLen == 4
1325assert rupr.reserved == 0
1326assert rupr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03'
1327
1328assert rupr.answers(ru)
1329
1330= Check UDS_TD
1331
1332td = UDS(b'\x36\xaapayload')
1333assert td.service == 0x36
1334assert td.blockSequenceCounter == 0xaa
1335assert td.transferRequestParameterRecord == b'payload'
1336
1337= Check UDS_TD
1338
1339td = UDS(b'\x36\xaapayload')
1340assert td.service == 0x36
1341assert td.blockSequenceCounter == 0xaa
1342assert td.transferRequestParameterRecord == b'payload'
1343
1344= Check UDS_TDPR
1345
1346tdpr = UDS(b'\x76\xaapayload')
1347assert tdpr.service == 0x76
1348assert tdpr.blockSequenceCounter == 0xaa
1349assert tdpr.transferResponseParameterRecord == b'payload'
1350
1351assert tdpr.answers(td)
1352
1353= Check UDS_RTE
1354
1355rte = UDS(b'\x37payload')
1356assert rte.service == 0x37
1357assert rte.transferRequestParameterRecord == b'payload'
1358
1359= Check UDS_RTEPR
1360
1361rtepr = UDS(b'\x77payload')
1362assert rtepr.service == 0x77
1363assert rtepr.transferResponseParameterRecord == b'payload'
1364
1365assert rtepr.answers(rte)
1366
1367= Check UDS_IOCBI
1368
1369iocbi = UDS(b'\x2f\x23\x34\xffcoffee')
1370assert iocbi.service == 0x2f
1371assert iocbi.dataIdentifier == 0x2334
1372assert iocbi.load == b'\xffcoffee'
1373
1374= Check UDS_RFT
1375
1376rft = UDS(b'\x38\x01\x00\x1ED:\\mapdata\\europe\\germany1.yxz\x11\x02\xC3\x50\x75\x30')
1377assert rft.service == 0x38
1378assert rft.modeOfOperation == 0x01
1379assert rft.filePathAndNameLength == 0x001e
1380assert rft.filePathAndName == b'D:\\mapdata\\europe\\germany1.yxz'
1381assert rft.compressionMethod == 1
1382assert rft.encryptingMethod == 1
1383assert rft.fileSizeParameterLength == 0x02
1384assert rft.fileSizeUnCompressed == b'\xc3\x50'
1385assert rft.fileSizeCompressed == b'\x75\x30'
1386
1387= Build UDS_RFT
1388
1389rft_build = UDS()/UDS_RFT(modeOfOperation=0x1,
1390                          filePathAndName=(b'D:\\mapdata\\europe\\' +
1391                                           b'germany1.yxz'),
1392                          compressionMethod=1, encryptingMethod=1,
1393                          fileSizeUnCompressed=b'\xc3\x50',
1394                          fileSizeCompressed=b'\x75\x30')
1395assert bytes(rft_build) == bytes(rft)
1396
1397= Check UDS_RFTPR
1398
1399rftpr = UDS(b'\x78\x01\x02\xc3\x50\x11')
1400assert rftpr.service == 0x78
1401assert rftpr.modeOfOperation == 0x01
1402assert rftpr.lengthFormatIdentifier == 0x02
1403assert rftpr.maxNumberOfBlockLength == b'\xc3\x50'
1404assert rftpr.compressionMethod == 1
1405assert rftpr.encryptingMethod == 1
1406
1407assert rftpr.answers(rft)
1408
1409= Build UDS_RFTPR
1410rftpr_build = UDS()/UDS_RFTPR(modeOfOperation=0x1,
1411                              maxNumberOfBlockLength=b'\xc3\x50',
1412                              compressionMethod=1, encryptingMethod=1)
1413assert bytes(rftpr_build) == bytes(rftpr)
1414
1415= Check (invalid) UDS_NRC, no reply-to service
1416
1417nrc = UDS(b'\x7f')
1418assert nrc.service == 0x7f
1419
1420= Check UDS_NRC
1421
1422nrc = UDS(b'\x7f\x22\x33')
1423assert nrc.service == 0x7f
1424assert nrc.requestServiceId == 0x22
1425assert nrc.negativeResponseCode == 0x33
1426