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