plain read works

This commit is contained in:
merlokk 2021-08-20 17:36:43 +03:00
commit 9d6567edce
5 changed files with 18 additions and 11 deletions

View file

@ -4461,6 +4461,9 @@ static int DesfileReadFileAndPrint(DesfireContext *dctx, uint8_t fnum, int filet
int res = 0; int res = 0;
// length of record for record file // length of record for record file
size_t reclen = 0; size_t reclen = 0;
// iso chaining works in the lrp mode
dctx->isoChaining = (dctx->secureChannel == DACLRP);
// get file settings // get file settings
if (filetype == RFTAuto) { if (filetype == RFTAuto) {
@ -4502,7 +4505,7 @@ static int DesfileReadFileAndPrint(DesfireContext *dctx, uint8_t fnum, int filet
if (fsettings.fileCommMode != 0 && noauth) if (fsettings.fileCommMode != 0 && noauth)
PrintAndLogEx(WARNING, "File needs communication mode `%s` but there is no authentication", CLIGetOptionListStr(DesfireCommunicationModeOpts, fsettings.commMode)); 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); 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) 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 --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 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 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[] = { void *argtable[] = {
arg_param_begin, arg_param_begin,

View file

@ -2083,7 +2083,7 @@ int DesfireReadFile(DesfireContext *dctx, uint8_t fnum, uint32_t offset, uint32_
Uint3byteToMemLe(&data[1], offset); Uint3byteToMemLe(&data[1], offset);
Uint3byteToMemLe(&data[4], len); 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) { 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); Uint3byteToMemLe(&xdata[4], len);
memcpy(&xdata[7], data, 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) { 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[1], recnum);
Uint3byteToMemLe(&data[4], reccount); 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) { 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); Uint3byteToMemLe(&xdata[4], len);
memcpy(&xdata[7], data, 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) { 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); Uint3byteToMemLe(&xdata[7], len);
memcpy(&xdata[10], data, 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) { static void PrintKeySettingsPICC(uint8_t keysettings, uint8_t numkeys, bool print2ndbyte) {

View file

@ -37,12 +37,11 @@ void DesfireClearContext(DesfireContext *ctx) {
ctx->keyType = T_DES; ctx->keyType = T_DES;
memset(ctx->key, 0, sizeof(ctx->key)); memset(ctx->key, 0, sizeof(ctx->key));
LRPClearContext(&ctx->lrpCtx);
ctx->secureChannel = DACNone; ctx->secureChannel = DACNone;
ctx->cmdSet = DCCNative; ctx->cmdSet = DCCNative;
ctx->commMode = DCMNone; ctx->commMode = DCMNone;
ctx->isoChaining = false;
ctx->appSelected = false; ctx->appSelected = false;
ctx->selectedAID = 0; ctx->selectedAID = 0;

View file

@ -78,8 +78,6 @@ typedef struct DesfireContextS {
uint8_t key[DESFIRE_MAX_KEY_SIZE]; uint8_t key[DESFIRE_MAX_KEY_SIZE];
uint8_t masterKey[DESFIRE_MAX_KEY_SIZE]; // source for kdf uint8_t masterKey[DESFIRE_MAX_KEY_SIZE]; // source for kdf
LRPContext lrpCtx;
// KDF finction // KDF finction
uint8_t kdfAlgo; uint8_t kdfAlgo;
uint8_t kdfInputLen; uint8_t kdfInputLen;
@ -89,6 +87,7 @@ typedef struct DesfireContextS {
DesfireCommandSet cmdSet; // native/nativeiso/iso DesfireCommandSet cmdSet; // native/nativeiso/iso
DesfireCommunicationMode commMode; // plain/mac/enc DesfireCommunicationMode commMode; // plain/mac/enc
bool isoChaining;
bool appSelected; // for iso auth bool appSelected; // for iso auth
uint32_t selectedAID; uint32_t selectedAID;

View file

@ -25,11 +25,16 @@
static const uint8_t CommandsCanUseAnyChannel[] = { static const uint8_t CommandsCanUseAnyChannel[] = {
MFDES_S_ADDITIONAL_FRAME, MFDES_S_ADDITIONAL_FRAME,
MFDES_READ_DATA, MFDES_READ_DATA,
MFDES_READ_DATA2,
MFDES_WRITE_DATA, MFDES_WRITE_DATA,
MFDES_WRITE_DATA2,
MFDES_GET_VALUE, MFDES_GET_VALUE,
MFDES_READ_RECORDS, MFDES_READ_RECORDS,
MFDES_READ_RECORDS2,
MFDES_WRITE_RECORD, MFDES_WRITE_RECORD,
MFDES_WRITE_RECORD2,
MFDES_UPDATE_RECORD, MFDES_UPDATE_RECORD,
MFDES_UPDATE_RECORD2,
}; };
static bool CommandCanUseAnyChannel(uint8_t cmd) { static bool CommandCanUseAnyChannel(uint8_t cmd) {