From f2d78eeb2572893273978470b69f16292a2e770d Mon Sep 17 00:00:00 2001 From: chenzitai Date: Wed, 1 Aug 2018 18:04:50 +0100 Subject: [PATCH] Finish decoding Data Manipulation Commands commands of MFDESFire (cherry picked from commit 502d951) --- Software/Chameleon/MFDESFire.py | 71 +++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 13 deletions(-) diff --git a/Software/Chameleon/MFDESFire.py b/Software/Chameleon/MFDESFire.py index e30e4a2..96307d8 100644 --- a/Software/Chameleon/MFDESFire.py +++ b/Software/Chameleon/MFDESFire.py @@ -27,6 +27,9 @@ StatusCode = { 0xF0 : "FILE_NOT_FOUND", 0xF1 : "ERR_FILE_INTEGRITY" } +######################### +# PICC Level Commands +######################### # Create APP CMD def decodeCreateAPP(data): note = "" @@ -147,8 +150,11 @@ def decodeGetKeyVersion(data): def decodeRespGetKeyVersion(data): return "KeyVersion" + hex(data[1]) if len(data) == 2 else strFail +############################## +# Data Manipulation Commands +############################## # Read Data -def decodeReadData(data): +def decodeFileNoOffsetLen(data): if len(data) == 8: fileNo = data[1] offSet = data[2:5] @@ -156,8 +162,32 @@ def decodeReadData(data): return "FileNo:"+hex(fileNo) + " OffSet:0x"+hexlify(offSet).decode() + " len:0x"+hexlify(length).decode() else: return strFail +# Write Data +def decodeFileNoOffsetLenData(data): + if len(data) > 8: + fileNo = data[1] + offSet = data[2:5] + length = data[5:8] + dataWrite = data[8:] + return "FileNo:"+hex(fileNo) + " OffSet:0x"+hexlify(offSet).decode() + " len:0x"+hexlify(length).decode() + \ + " Data:0x" + hexlify(dataWrite).decode() + else: + return strFail -def decodeRespReadData(data): +# Get Value +def decodeFileNo(data): + if len(data) == 2: + return "FileNo:"+hex(data[1]) + else: + return strFail +# Credit +def decodeFileNoData(data): + if len(data) >2: + return "FileNo:" + hex(data[1]) + " Data:0x" + hexlify(data[2:]).decode() + else: + return strFail + +def decodeData(data): return "Data:0x"+hexlify(data[1:]).decode() if len(data) >1 else strFail def decodeAdiFrame(data): @@ -173,31 +203,46 @@ def decodeDummy(data): MFDESFireCMDTypes = { # PICC Level Commands, GetVersion not decoded, please refer to datasheet for the meaning of resp - 0xCA : {"name": "CreateApp", "CMDdecoder":decodeCreateAPP, "RespDecoder": decodeDummy}, - 0xDA : {"name": "DelApp", "CMDdecoder":decodeDelAPP, "RespDecoder": decodeDummy}, + 0xCA : {"name": "CreateApp ", "CMDdecoder":decodeCreateAPP, "RespDecoder": decodeDummy}, + 0xDA : {"name": "DelApp ", "CMDdecoder":decodeDelAPP, "RespDecoder": decodeDummy}, 0x5A : {"name": "SelectApp ", "CMDdecoder":decodeSelectAPP, "RespDecoder": decodeDummy}, 0x6A : {"name": "GetAPPID ", "CMDdecoder":decodeGetAPPID, "RespDecoder": decodeRespGetAPPID}, - 0xFC : {"name": "FormatPICC", "CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, - 0x60 : {"name": "GetVersion", "CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, + 0xFC : {"name": "FormatPICC ", "CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, + 0x60 : {"name": "GetVersion ", "CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, # Data Manipulation Commands - 0xBD : {"name": "ReadData ", "CMDdecoder":decodeReadData, "RespDecoder": decodeRespReadData}, + 0xBD : {"name": "ReadData ", "CMDdecoder":decodeFileNoOffsetLen, "RespDecoder": decodeData}, + 0x3D : {"name": "WriteData ", "CMDdecoder":decodeFileNoOffsetLenData, "RespDecoder": decodeDummy}, + 0x6C : {"name": "GetValue ", "CMDdecoder":decodeFileNo, "RespDecoder": decodeData}, + 0x0C : {"name": "Credit ", "CMDdecoder":decodeFileNoData, "RespDecoder": decodeDummy}, + 0xDC : {"name": "Debit ", "CMDdecoder":decodeFileNoData, "RespDecoder": decodeDummy}, + 0x1C : {"name": "LimitedCredit ", "CMDdecoder":decodeFileNoData, "RespDecoder": decodeDummy}, + 0x3B : {"name": "WriteRecord ", "CMDdecoder":decodeFileNoOffsetLenData, "RespDecoder": decodeDummy}, + 0xBB : {"name": "ReadRecord ", "CMDdecoder":decodeFileNoOffsetLen, "RespDecoder": decodeData}, + 0xEB : {"name": "ClearRecordFile ", "CMDdecoder":decodeFileNo, "RespDecoder": decodeDummy}, + 0xC7 : {"name": "CommitTransaction ","CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, + 0xA7 : {"name": "AbortTransaction ","CMDdecoder":decodeDummy, "RespDecoder": decodeDummy}, # Security Related CMD - 0xAA : {"name": "AuthAES ", "CMDdecoder": decodeAuthAES, "RespDecoder": decodeRespAuthAES}, - 0x0A : {"name": "Auth3DES", "CMDdecoder": decodeAuth3DES, "RespDecoder": decodeRespAuth3DES}, - 0x54 : {"name": "ChangeKeySettings ","CMDdecoder":decodeChangeKeySettings,"respDecoder": decodeDummy}, + 0xAA : {"name": "AuthAES ", "CMDdecoder": decodeAuthAES, "RespDecoder": decodeRespAuthAES}, + 0x0A : {"name": "Auth3DES ", "CMDdecoder": decodeAuth3DES, "RespDecoder": decodeRespAuth3DES}, + 0x54 : {"name": "ChangeKeySettings ","CMDdecoder":decodeChangeKeySettings,"RespDecoder": decodeDummy}, 0x45 : {"name": "GetKeySettings ", "CMDdecoder":decodeDummy, "RespDecoder": decodeRespGetKeySettings}, 0xC4 : {"name": "ChangeKey ", "CMDdecoder":decodeChangeKey, "RespDecoder": decodeDummy}, 0x64 : {"name": "GetKeyVersion ", "CMDdecoder":decodeGetKeyVersion, "RespDecoder": decodeRespGetKeyVersion}, # Additional Frame - 0xAF: {"name": "AdditionalFrame ", "CMDdecoder": decodeAdiFrame, "RespDecoder": decodeRespAdiFrame}, + 0xAF: {"name": "AdditionalFrame ", "CMDdecoder": decodeAdiFrame, "RespDecoder": decodeRespAdiFrame}, } # Commands need to use additional frame MFDESFireAFCMD = { - 0xAA : {"name": "AuthAES", "AFReaderDecoder":decodeAuthAESAF, "AFCardDecoder": decodeCardAuthAESAF}, - 0x0A : {"name": "Auth3DES", "AFReaderDecoder":decodeAuth3DESAF, "AFCardDecoder": decodeCardAuth3DESAF}, + 0xAA : {"name": "AuthAES ", "AFReaderDecoder":decodeAuthAESAF, "AFCardDecoder": decodeCardAuthAESAF}, + 0x0A : {"name": "Auth3DES ", "AFReaderDecoder":decodeAuth3DESAF, "AFCardDecoder": decodeCardAuth3DESAF}, + + 0x3D : {"name": "WriteData ", "AFReaderDecoder":decodeData, "AFCardDecoder": decodeDummy}, + 0xBB : {"name": "ReadRecord ", "AFReaderDecoder":decodeDummy, "AFCardDecoder": decodeData}, + + 0x3B: {"name": "WriteRecord ", "AFReaderDecoder": decodeData, "AFCardDecoder": decodeDummy} }