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;
// 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,

View file

@ -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) {

View file

@ -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;

View file

@ -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;

View file

@ -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) {