blob: d525b8554e666e288d04efd7aa02fc39df46ab21 [file] [log] [blame]
% 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