From 9d6567edceb9a612869ecff3d525b6e9d8a4acc2 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Fri, 20 Aug 2021 17:36:43 +0300 Subject: [PATCH] plain read works --- client/src/cmdhfmfdes.c | 8 ++++++-- client/src/mifare/desfirecore.c | 10 +++++----- client/src/mifare/desfirecrypto.c | 3 +-- client/src/mifare/desfirecrypto.h | 3 +-- client/src/mifare/desfiresecurechan.c | 5 +++++ 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/client/src/cmdhfmfdes.c b/client/src/cmdhfmfdes.c index 5208d305a..a221ed267 100644 --- a/client/src/cmdhfmfdes.c +++ b/client/src/cmdhfmfdes.c @@ -4461,6 +4461,9 @@ static int DesfileReadFileAndPrint(DesfireContext *dctx, uint8_t fnum, int filet int res = 0; // length of record for record file size_t reclen = 0; + + // iso chaining works in the lrp mode + dctx->isoChaining = (dctx->secureChannel == DACLRP); // get file settings if (filetype == RFTAuto) { @@ -4502,7 +4505,7 @@ static int DesfileReadFileAndPrint(DesfireContext *dctx, uint8_t fnum, int filet if (fsettings.fileCommMode != 0 && noauth) PrintAndLogEx(WARNING, "File needs communication mode `%s` but there is no authentication", CLIGetOptionListStr(DesfireCommunicationModeOpts, fsettings.commMode)); - if ((fsettings.rAccess < 0x0e && fsettings.rAccess != dctx->keyNum) || (fsettings.rwAccess < 0x0e && fsettings.rwAccess != dctx->keyNum)) + if ((fsettings.rAccess < 0x0e && fsettings.rAccess != dctx->keyNum) && (fsettings.rwAccess < 0x0e && fsettings.rwAccess != dctx->keyNum)) PrintAndLogEx(WARNING, "File needs to be authenticated with key 0x%02x or 0x%02x but current authentication key is 0x%02x", fsettings.rAccess, fsettings.rwAccess, dctx->keyNum); if (fsettings.rAccess == 0x0f && fsettings.rwAccess == 0x0f) @@ -4630,7 +4633,8 @@ static int CmdHF14ADesReadData(const char *Cmd) { "hf mfdes read --aid 123456 --fileisoid 1000 --type data -c iso -> read file via ISO channel: app=123456, iso id=1000, offset=0. Select via native ISO wrapper\n" "hf mfdes read --appisoid 0102 --fileisoid 1000 --type data -c iso -> read file via ISO channel: app iso id=0102, iso id=1000, offset=0. Select via ISO commands\n" "hf mfdes read --appisoid 0102 --fileisoid 1100 --type record -c iso --offset 000005 --length 000001 -> get one record (number 5) from file 1100 via iso commands\n" - "hf mfdes read --appisoid 0102 --fileisoid 1100 --type record -c iso --offset 000005 --length 000000 -> get all record (from 5 to 1) from file 1100 via iso commands"); + "hf mfdes read --appisoid 0102 --fileisoid 1100 --type record -c iso --offset 000005 --length 000000 -> get all record (from 5 to 1) from file 1100 via iso commands\n" + "hf mfdes read --appisoid df01 --fid 00 -s lrp -t aes -> read via lrp"); void *argtable[] = { arg_param_begin, diff --git a/client/src/mifare/desfirecore.c b/client/src/mifare/desfirecore.c index 2f8b33006..767c977a0 100644 --- a/client/src/mifare/desfirecore.c +++ b/client/src/mifare/desfirecore.c @@ -2083,7 +2083,7 @@ int DesfireReadFile(DesfireContext *dctx, uint8_t fnum, uint32_t offset, uint32_ Uint3byteToMemLe(&data[1], offset); Uint3byteToMemLe(&data[4], len); - return DesfireCommand(dctx, MFDES_READ_DATA, data, 7, resp, resplen, -1); + return DesfireCommand(dctx, (dctx->isoChaining) ? MFDES_READ_DATA2 : MFDES_READ_DATA, data, 7, resp, resplen, -1); } int DesfireWriteFile(DesfireContext *dctx, uint8_t fnum, uint32_t offset, uint32_t len, uint8_t *data) { @@ -2093,7 +2093,7 @@ int DesfireWriteFile(DesfireContext *dctx, uint8_t fnum, uint32_t offset, uint32 Uint3byteToMemLe(&xdata[4], len); memcpy(&xdata[7], data, len); - return DesfireCommandTxData(dctx, MFDES_WRITE_DATA, xdata, 7 + len); + return DesfireCommandTxData(dctx, (dctx->isoChaining) ? MFDES_WRITE_DATA2 : MFDES_WRITE_DATA, xdata, 7 + len); } int DesfireValueFileOperations(DesfireContext *dctx, uint8_t fid, uint8_t operation, uint32_t *value) { @@ -2119,7 +2119,7 @@ int DesfireReadRecords(DesfireContext *dctx, uint8_t fnum, uint32_t recnum, uint Uint3byteToMemLe(&data[1], recnum); Uint3byteToMemLe(&data[4], reccount); - return DesfireCommand(dctx, MFDES_READ_RECORDS, data, 7, resp, resplen, -1); + return DesfireCommand(dctx, (dctx->isoChaining) ? MFDES_READ_RECORDS2 : MFDES_READ_RECORDS, data, 7, resp, resplen, -1); } int DesfireWriteRecord(DesfireContext *dctx, uint8_t fnum, uint32_t offset, uint32_t len, uint8_t *data) { @@ -2129,7 +2129,7 @@ int DesfireWriteRecord(DesfireContext *dctx, uint8_t fnum, uint32_t offset, uint Uint3byteToMemLe(&xdata[4], len); memcpy(&xdata[7], data, len); - return DesfireCommandTxData(dctx, MFDES_WRITE_RECORD, xdata, 7 + len); + return DesfireCommandTxData(dctx, (dctx->isoChaining) ? MFDES_WRITE_RECORD2 : MFDES_WRITE_RECORD, xdata, 7 + len); } int DesfireUpdateRecord(DesfireContext *dctx, uint8_t fnum, uint32_t recnum, uint32_t offset, uint32_t len, uint8_t *data) { @@ -2140,7 +2140,7 @@ int DesfireUpdateRecord(DesfireContext *dctx, uint8_t fnum, uint32_t recnum, uin Uint3byteToMemLe(&xdata[7], len); memcpy(&xdata[10], data, len); - return DesfireCommandTxData(dctx, MFDES_UPDATE_RECORD, xdata, 10 + len); + return DesfireCommandTxData(dctx, (dctx->isoChaining) ? MFDES_UPDATE_RECORD2 : MFDES_UPDATE_RECORD, xdata, 10 + len); } static void PrintKeySettingsPICC(uint8_t keysettings, uint8_t numkeys, bool print2ndbyte) { diff --git a/client/src/mifare/desfirecrypto.c b/client/src/mifare/desfirecrypto.c index 500486486..fee29f340 100644 --- a/client/src/mifare/desfirecrypto.c +++ b/client/src/mifare/desfirecrypto.c @@ -37,12 +37,11 @@ void DesfireClearContext(DesfireContext *ctx) { ctx->keyType = T_DES; memset(ctx->key, 0, sizeof(ctx->key)); - LRPClearContext(&ctx->lrpCtx); - ctx->secureChannel = DACNone; ctx->cmdSet = DCCNative; ctx->commMode = DCMNone; + ctx->isoChaining = false; ctx->appSelected = false; ctx->selectedAID = 0; diff --git a/client/src/mifare/desfirecrypto.h b/client/src/mifare/desfirecrypto.h index 7d19a5c28..78d0ceee5 100644 --- a/client/src/mifare/desfirecrypto.h +++ b/client/src/mifare/desfirecrypto.h @@ -78,8 +78,6 @@ typedef struct DesfireContextS { uint8_t key[DESFIRE_MAX_KEY_SIZE]; uint8_t masterKey[DESFIRE_MAX_KEY_SIZE]; // source for kdf - LRPContext lrpCtx; - // KDF finction uint8_t kdfAlgo; uint8_t kdfInputLen; @@ -89,6 +87,7 @@ typedef struct DesfireContextS { DesfireCommandSet cmdSet; // native/nativeiso/iso DesfireCommunicationMode commMode; // plain/mac/enc + bool isoChaining; bool appSelected; // for iso auth uint32_t selectedAID; diff --git a/client/src/mifare/desfiresecurechan.c b/client/src/mifare/desfiresecurechan.c index 39640f685..746beaebf 100644 --- a/client/src/mifare/desfiresecurechan.c +++ b/client/src/mifare/desfiresecurechan.c @@ -25,11 +25,16 @@ static const uint8_t CommandsCanUseAnyChannel[] = { MFDES_S_ADDITIONAL_FRAME, MFDES_READ_DATA, + MFDES_READ_DATA2, MFDES_WRITE_DATA, + MFDES_WRITE_DATA2, MFDES_GET_VALUE, MFDES_READ_RECORDS, + MFDES_READ_RECORDS2, MFDES_WRITE_RECORD, + MFDES_WRITE_RECORD2, MFDES_UPDATE_RECORD, + MFDES_UPDATE_RECORD2, }; static bool CommandCanUseAnyChannel(uint8_t cmd) {