diff --git a/client/src/mifare/desfirecore.c b/client/src/mifare/desfirecore.c index 379862226..a506ad460 100644 --- a/client/src/mifare/desfirecore.c +++ b/client/src/mifare/desfirecore.c @@ -1096,6 +1096,25 @@ int DesfireAbortTransaction(DesfireContext *dctx) { return DesfireCommandNoData(dctx, MFDES_ABORT_TRANSACTION); } +int DesfireReadFile(DesfireContext *dctx, uint8_t fnum, uint32_t offset, uint32_t len, uint8_t *resp, size_t *resplen) { + uint8_t data[10] = {0}; + data[0] = fnum; + Uint3byteToMemLe(&data[1], offset); + Uint3byteToMemLe(&data[4], len); + + return DesfireCommand(dctx, MFDES_READ_DATA, data, 7, resp, resplen, -1); +} + +int DesfireWriteFile(DesfireContext *dctx, uint8_t fnum, uint32_t offset, uint32_t len, uint8_t *data) { + uint8_t xdata[1024] = {0}; + xdata[0] = fnum; + Uint3byteToMemLe(&xdata[1], offset); + Uint3byteToMemLe(&xdata[4], len); + memcpy(&xdata[7], data, len); + + return DesfireCommandTxData(dctx, MFDES_WRITE_DATA, xdata, 7 + len); +} + int DesfireValueFileOperations(DesfireContext *dctx, uint8_t fid, uint8_t operation, uint32_t *value) { uint8_t data[250] = {0}; data[0] = fid; diff --git a/client/src/mifare/desfirecore.h b/client/src/mifare/desfirecore.h index 28dffccc8..8de744f5b 100644 --- a/client/src/mifare/desfirecore.h +++ b/client/src/mifare/desfirecore.h @@ -105,4 +105,7 @@ int DesfireAbortTransaction(DesfireContext *dctx); int DesfireValueFileOperations(DesfireContext *dctx, uint8_t fid, uint8_t operation, uint32_t *value); int DesfireClearRecordFile(DesfireContext *dctx, uint8_t fnum); +int DesfireReadFile(DesfireContext *dctx, uint8_t fnum, uint32_t offset, uint32_t len, uint8_t *resp, size_t *resplen); +int DesfireWriteFile(DesfireContext *dctx, uint8_t fnum, uint32_t offset, uint32_t len, uint8_t *data); + #endif // __DESFIRECORE_H diff --git a/include/protocols.h b/include/protocols.h index efa3e0a78..57c9dd86f 100644 --- a/include/protocols.h +++ b/include/protocols.h @@ -435,7 +435,9 @@ ISO 7816-4 Basic interindustry commands. For command APDU's. #define MFDES_GET_FREE_MEMORY 0x6E #define MFDES_GET_DF_NAMES 0x6D #define MFDES_GET_FILE_IDS 0x6F +#define MFDES_WRITE_DATA2 0x8D #define MFDES_ABORT_TRANSACTION 0xA7 +#define MFDES_READ_DATA2 0xAD #define MFDES_ADDITIONAL_FRAME 0xAF #define MFDES_UPDATE_RECORD1 0xBA #define MFDES_READ_RECORDS 0xBB