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