mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-26 16:15:25 -07:00
plain read works
This commit is contained in:
parent
a7b132a620
commit
9d6567edce
5 changed files with 18 additions and 11 deletions
|
@ -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,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue