| % Regression tests for the KWP2000 layer |
| |
| # More information at http://www.secdev.org/projects/UTscapy/ |
| |
| |
| ############ |
| ############ |
| |
| + Basic operations |
| |
| = Load module |
| load_contrib("automotive.kwp", globals_dict=globals()) |
| |
| = Check if positive response answers |
| |
| sds = KWP(b'\x10') |
| sdspr = KWP(b'\x50') |
| assert sdspr.answers(sds) |
| |
| = Check hashret |
| sds.hashret() == sdspr.hashret() |
| |
| = Check if negative response answers |
| |
| sds = KWP(b'\x10') |
| neg = KWP(b'\x7f\x10') |
| assert neg.answers(sds) |
| |
| = CHECK hashret NEG |
| sds.hashret() == neg.hashret() |
| |
| = Check if negative response answers |
| |
| conf.contribs['KWP']['treat-response-pending-as-answer'] = False |
| |
| sds = KWP(b'\x10') |
| neg = KWP(b'\x7f\x10\x78') |
| assert not neg.answers(sds) |
| |
| conf.contribs['KWP']['treat-response-pending-as-answer'] = True |
| |
| = CHECK hashret NEG |
| sds.hashret() == neg.hashret() |
| |
| = Check if negative response answers not |
| |
| sds = KWP(b'\x10') |
| neg = KWP(b'\x7f\x11') |
| assert not neg.answers(sds) |
| |
| = Check if positive response answers not |
| |
| sds = KWP(b'\x10') |
| somePacket = KWP(b'\x49') |
| assert not somePacket.answers(sds) |
| |
| = Check KWP_SDS |
| |
| sds = KWP(b'\x10\x01') |
| assert sds.service == 0x10 |
| assert sds.diagnosticSession == 0x01 |
| |
| = Check KWP_SDS |
| |
| sds = KWP()/KWP_SDS(b'\x01') |
| assert sds.service == 0x10 |
| assert sds.diagnosticSession == 0x01 |
| |
| = Check KWP_SDSPR |
| |
| sdspr = KWP(b'\x50\x02beef') |
| assert sdspr.service == 0x50 |
| assert sdspr.diagnosticSession == 0x02 |
| |
| assert not sdspr.answers(sds) |
| |
| = Check KWP_SDSPR |
| |
| sdspr = KWP()/KWP_SDSPR(b'\x01beef') |
| assert sdspr.service == 0x50 |
| assert sdspr.diagnosticSession == 0x01 |
| |
| assert sdspr.answers(sds) |
| |
| = Check KWP_SDS |
| |
| sds = KWP()/KWP_SDS(b'\x01') |
| assert sds.service == 0x10 |
| assert sds.diagnosticSession == 0x01 |
| |
| = Check KWP_SDSPR |
| |
| sdspr = KWP()/KWP_SDSPR(b'\x01beef') |
| assert sdspr.service == 0x50 |
| assert sdspr.diagnosticSession == 0x01 |
| |
| assert sdspr.answers(sds) |
| |
| = Check KWP_ER |
| |
| er = KWP(b'\x11\x01') |
| assert er.service == 0x11 |
| assert er.resetMode == 0x01 |
| |
| = Check KWP_ER |
| |
| er = KWP()/KWP_ER(resetMode="powerOnReset") |
| assert er.service == 0x11 |
| assert er.resetMode == 0x01 |
| |
| = Check KWP_ERPR |
| |
| erpr = KWP(b'\x51') |
| assert erpr.service == 0x51 |
| |
| assert erpr.answers(er) |
| |
| = Check KWP_SA |
| |
| sa = KWP(b'\x27\x00c0ffee') |
| assert sa.service == 0x27 |
| assert sa.accessMode == 0x0 |
| assert sa.key == b'c0ffee' |
| |
| = Check KWP_SAPR |
| |
| sapr = KWP(b'\x67') |
| assert sapr.service == 0x67 |
| |
| assert sapr.answers(sa) |
| |
| = Check KWP_SA |
| |
| sa = KWP(b'\x27\x01') |
| assert sa.service == 0x27 |
| assert sa.accessMode == 0x1 |
| |
| = Check KWP_SAPR |
| |
| sapr = KWP(b'\x67\x01c0ffee') |
| assert sapr.service == 0x67 |
| assert sapr.accessMode == 0x1 |
| assert sapr.seed == b'c0ffee' |
| |
| assert sapr.answers(sa) |
| |
| = Check KWP_SA |
| |
| sa = KWP(b'\x27\x00c0ffee') |
| assert sa.service == 0x27 |
| assert sa.accessMode == 0x0 |
| assert sa.key == b'c0ffee' |
| |
| = Check KWP_SA |
| |
| sa = KWP(b'\x27\x01c0ffee') |
| assert sa.service == 0x27 |
| assert sa.accessMode == 0x1 |
| |
| = Check KWP_SAPR |
| |
| sapr = KWP(b'\x67\x01c0ffee') |
| assert sapr.service == 0x67 |
| assert sapr.accessMode == 0x1 |
| assert sapr.seed == b'c0ffee' |
| |
| |
| = Check KWP_DNT |
| |
| cc = KWP(b'\x28\x01') |
| assert cc.service == 0x28 |
| assert cc.responseRequired == 0x1 |
| |
| = Check KWP_DNMTPR |
| |
| ccpr = KWP(b'\x68') |
| assert ccpr.service == 0x68 |
| assert ccpr.answers(cc) |
| |
| = Check KWP_DNMTPR |
| |
| ccpr = KWP(b'\x68abcd') |
| assert ccpr.service == 0x68 |
| assert ccpr.answers(cc) |
| |
| assert (KWP()/KWP_DNMTPR()).answers(cc) |
| |
| = Check KWP_TP |
| |
| tp = KWP(b'\x3E\x01') |
| assert tp.service == 0x3e |
| assert tp.responseRequired == 1 |
| |
| = Check KWP_TPPR |
| |
| tppr = KWP(b'\x7E') |
| assert tppr.service == 0x7e |
| |
| assert tppr.answers(tp) |
| |
| assert (KWP()/KWP_TPPR()).answers(tp) |
| |
| = Check KWP_CDTCS |
| |
| cdtcs = KWP(b'\x85\x01\x40\x00\x01') |
| assert cdtcs.service == 0x85 |
| assert cdtcs.responseRequired == 1 |
| assert cdtcs.groupOfDTC == 0x4000 |
| assert cdtcs.DTCSettingMode == 1 |
| |
| = Check KWP_CDTCSPR |
| |
| cdtcspr = KWP(b'\xC5\x00') |
| assert cdtcspr.service == 0xC5 |
| |
| assert cdtcspr.answers(cdtcs) |
| |
| = Check KWP_ROE |
| |
| roe = KWP(b'\x86\x01\x10\x00') |
| assert roe.service == 0x86 |
| assert roe.responseRequired == 1 |
| assert roe.eventType == 0 |
| assert roe.eventWindowTime == 16 |
| |
| = Check KWP_ROEPR |
| |
| roepr = KWP(b'\xC6\x00\x01') |
| assert roepr.service == 0xC6 |
| assert roepr.numberOfActivatedEvents == 0 |
| assert roepr.eventType == 0 |
| |
| assert roepr.answers(roe) |
| |
| = Check KWP_RDBI |
| |
| rdbi = KWP(b'\x22\x01\x02') |
| assert rdbi.service == 0x22 |
| assert rdbi.identifier == 0x0102 |
| |
| = Build KWP_RDBI |
| |
| rdbi = KWP()/KWP_RDBI(identifier=0x102) |
| assert rdbi.service == 0x22 |
| assert rdbi.identifier == 0x0102 |
| assert bytes(rdbi) == b'\x22\x01\x02' |
| |
| = Check KWP_RDBI2 |
| |
| rdbi = KWP(b'\x22\x01\x02') |
| assert rdbi.service == 0x22 |
| assert rdbi.identifier == 0x0102 |
| assert raw(rdbi) == b'\x22\x01\x02' |
| |
| = Build KWP_RDBI2 |
| |
| rdbi = KWP()/KWP_RDBI(identifier=0x304) |
| assert rdbi.service == 0x22 |
| assert rdbi.identifier == 0x0304 |
| assert raw(rdbi) == b'\x22\x03\x04' |
| |
| = Test observable dict used in KWP_RDBI, setter |
| |
| KWP_RDBI.dataIdentifiers[0x102] = "turbo" |
| KWP_RDBI.dataIdentifiers[0x103] = "fullspeed" |
| |
| rdbi = KWP()/KWP_RDBI(identifier=0x102) |
| |
| assert "turbo" in plain_str(repr(rdbi)) |
| |
| rdbi = KWP()/KWP_RDBI(identifier=0x103) |
| |
| assert "fullspeed" in plain_str(repr(rdbi)) |
| |
| = Test observable dict used in KWP_RDBI, deleter |
| |
| KWP_RDBI.dataIdentifiers[0x102] = "turbo" |
| |
| rdbi = KWP()/KWP_RDBI(identifier=0x102) |
| assert "turbo" in plain_str(repr(rdbi)) |
| |
| del KWP_RDBI.dataIdentifiers[0x102] |
| KWP_RDBI.dataIdentifiers[0x103] = "slowspeed" |
| |
| rdbi = KWP()/KWP_RDBI(identifier=0x102) |
| |
| assert "turbo" not in plain_str(repr(rdbi)) |
| |
| rdbi = KWP()/KWP_RDBI(identifier=0x103) |
| |
| assert "slowspeed" in plain_str(repr(rdbi)) |
| |
| = Check KWP_RDBIPR |
| |
| rdbipr = KWP(b'\x62\x01\x03dieselgate') |
| assert rdbipr.service == 0x62 |
| assert rdbipr.identifier == 0x0103 |
| assert rdbipr.load == b'dieselgate' |
| |
| assert rdbipr.answers(rdbi) |
| |
| = Check KWP_RMBA |
| |
| rmba = KWP(b'\x23\x11\x02\x02\x11') |
| assert rmba.service == 0x23 |
| assert rmba.memoryAddress == 0x110202 |
| assert rmba.memorySize == 17 |
| |
| = Check KWP_RMBAPR |
| |
| rmbapr = KWP(b'\x63muchData') |
| assert rmbapr.service == 0x63 |
| assert rmbapr.dataRecord == b'muchData' |
| |
| assert rmbapr.answers(rmba) |
| |
| = Check KWP_DDLI |
| |
| dddi = KWP(b'\x2c\x12\x44coffee') |
| assert dddi.service == 0x2c |
| assert dddi.dynamicallyDefineLocalIdentifier == 0x12 |
| assert dddi.definitionMode == 0x44 |
| assert dddi.dataRecord == b'coffee' |
| |
| = Check KWP_DDLIPR |
| |
| dddipr = KWP(b'\x6c\x12\x44\x01') |
| assert dddipr.service == 0x6c |
| assert dddipr.dynamicallyDefineLocalIdentifier == 0x12 |
| |
| assert dddipr.answers(dddi) |
| |
| = Check KWP_WDBI |
| |
| wdbi = KWP(b'\x2e\x01\x02dieselgate') |
| assert wdbi.service == 0x2e |
| assert wdbi.identifier == 0x0102 |
| assert wdbi.load == b'dieselgate' |
| |
| = Build KWP_WDBI |
| |
| wdbi = KWP()/KWP_WDBI(identifier=0x0102)/Raw(load=b'dieselgate') |
| assert wdbi.service == 0x2e |
| assert wdbi.identifier == 0x0102 |
| assert wdbi.load == b'dieselgate' |
| assert bytes(wdbi) == b'\x2e\x01\x02dieselgate' |
| |
| = Check KWP_WDBI |
| |
| wdbi = KWP(b'\x2e\x01\x02dieselgate') |
| assert wdbi.service == 0x2e |
| assert wdbi.identifier == 0x0102 |
| assert wdbi.load == b'dieselgate' |
| |
| wdbi = KWP(b'\x2e\x02\x02benzingate') |
| assert wdbi.service == 0x2e |
| assert wdbi.identifier == 0x0202 |
| assert wdbi.load == b'benzingate' |
| |
| |
| = Check KWP_WDBIPR |
| |
| wdbipr = KWP(b'\x6e\x02\x02') |
| assert wdbipr.service == 0x6e |
| assert wdbipr.identifier == 0x0202 |
| |
| assert wdbipr.answers(wdbi) |
| |
| = Check KWP_WMBA |
| |
| wmba = KWP(b'\x3d\x11\x02\x02\x02muchData') |
| assert wmba.service == 0x3d |
| assert wmba.memoryAddress == 0x110202 |
| assert wmba.memorySize == 2 |
| assert wmba.dataRecord == b'muchData' |
| |
| = Check KWP_WMBAPR |
| |
| wmbapr = KWP(b'\x7d\x11\x02\x02') |
| assert wmbapr.service == 0x7d |
| assert wmbapr.memoryAddress == 0x110202 |
| |
| assert wmbapr.answers(wmba) |
| |
| = Check KWP_CDI |
| |
| cdtci = KWP(b'\x14\x44\x02\x03') |
| assert cdtci.service == 0x14 |
| assert cdtci.groupOfDTC == 0x4402 |
| |
| cdtcipr = KWP(b'\x54\x44\x02\x03') |
| assert cdtcipr.service == 0x54 |
| assert cdtcipr.groupOfDTC == 0x4402 |
| |
| assert cdtcipr.answers(cdtci) |
| |
| = Check KWP_RC |
| |
| rc = KWP(b'\x31\xff\xee\xdd\xaa') |
| assert rc.service == 0x31 |
| assert rc.routineLocalIdentifier == 0xff |
| assert rc.load == b'\xee\xdd\xaa' |
| |
| = Check KWP_RC |
| |
| rc = KWP(b'\x31\xff\xee\xdd\xaa') |
| assert rc.service == 0x31 |
| assert rc.routineLocalIdentifier == 0xff |
| assert rc.load == b'\xee\xdd\xaa' |
| |
| |
| = Check KWP_RCPR |
| |
| rcpr = KWP(b'\x71\xff\xee\xdd\xaa') |
| assert rcpr.service == 0x71 |
| assert rcpr.routineLocalIdentifier == 0xff |
| assert rcpr.load == b'\xee\xdd\xaa' |
| |
| assert rcpr.answers(rc) |
| |
| = Check KWP_RD |
| |
| rd = KWP(b'\x34\xaa\x11\x02\x02\x10\x00\x00') |
| |
| assert rd.service == 0x34 |
| assert rd.memoryAddress == 0xaa1102 |
| assert rd.compression == 0 |
| assert rd.encryption == 2 |
| assert rd.uncompressedMemorySize == 0x100000 |
| |
| = Check KWP_RDPR |
| |
| rdpr = KWP(b'\x74\x02\x02\x02\x02\x03\x03\x03\x03') |
| assert rdpr.service == 0x74 |
| assert rdpr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03' |
| rdpr.show() |
| assert rdpr.answers(rd) |
| |
| = Check KWP_RU |
| |
| ru = KWP(b'\x35\x11\x02\x02\xa0\xff\xff\xff') |
| assert ru.service == 0x35 |
| assert ru.memoryAddress == 0x110202 |
| assert ru.compression == 10 |
| assert ru.encryption == 0 |
| assert ru.uncompressedMemorySize == 0xffffff |
| |
| = Check KWP_RUPR |
| |
| rupr = KWP(b'\x75\x02\x02\x02\x02\x03\x03\x03\x03') |
| assert rupr.service == 0x75 |
| assert rupr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03' |
| |
| assert rupr.answers(ru) |
| |
| = Check KWP_TD |
| |
| td = KWP(b'\x36\xaapayload') |
| assert td.service == 0x36 |
| assert td.blockSequenceCounter == 0xaa |
| assert td.transferDataRequestParameter == b'payload' |
| |
| = Check KWP_TDPR |
| |
| tdpr = KWP(b'\x76\xaapayload') |
| assert tdpr.service == 0x76 |
| assert tdpr.blockSequenceCounter == 0xaa |
| assert tdpr.transferDataRequestParameter == b'payload' |
| |
| assert tdpr.answers(td) |
| |
| = Check KWP_RTE |
| |
| rte = KWP(b'\x37payload') |
| assert rte.service == 0x37 |
| assert rte.transferDataRequestParameter == b'payload' |
| |
| = Check KWP_RTEPR |
| |
| rtepr = KWP(b'\x77payload') |
| assert rtepr.service == 0x77 |
| assert rtepr.transferDataRequestParameter == b'payload' |
| |
| assert rtepr.answers(rte) |
| |
| = Check KWP_IOCBI |
| |
| iocbi = KWP(b'\x30\x23\xffcoffee') |
| assert iocbi.service == 0x30 |
| assert iocbi.localIdentifier == 0x23 |
| assert iocbi.inputOutputControlParameter == 255 |
| assert iocbi.controlState == b'coffee' |
| |
| = Check KWP_IOCBIPR |
| |
| iocbipr = KWP(b'\x70\x23\xffcoffee') |
| assert iocbipr.service == 0x70 |
| assert iocbipr.localIdentifier == 0x23 |
| assert iocbipr.inputOutputControlParameter == 255 |
| assert iocbipr.controlState == b'coffee' |
| |
| assert iocbipr.answers(iocbi) |
| |
| = Check KWP_NRC |
| |
| nrc = KWP(b'\x7f\x22\x33') |
| assert nrc.service == 0x7f |
| assert nrc.requestServiceId == 0x22 |
| assert nrc.negativeResponseCode == 0x33 |