mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-01-31 04:20:28 +08:00
add: annotage Mifare Desfire. from 3102c1bae3 (diff-93cfa90a992ea759349344d0de98029e)
Thanks @johannesStoye
This commit is contained in:
parent
2b6ffe75a8
commit
7e08450dcc
2 changed files with 128 additions and 4 deletions
|
@ -38,7 +38,7 @@ int CmdHFTune(const char *Cmd) {
|
|||
}
|
||||
|
||||
|
||||
void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
|
||||
int applyIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
|
||||
{
|
||||
switch(cmd[0])
|
||||
{
|
||||
|
@ -121,9 +121,13 @@ void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
|
|||
case MIFARE_ULEV1_READSIG : snprintf(exp,size,"READ_SIG"); break;
|
||||
case MIFARE_ULEV1_CHECKTEAR : snprintf(exp,size,"CHK_TEARING(%d)",cmd[1]); break;
|
||||
case MIFARE_ULEV1_VCSL : snprintf(exp,size,"VCSL"); break;
|
||||
default: snprintf(exp,size,"?"); break;
|
||||
default: return 0;
|
||||
}
|
||||
return;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize){
|
||||
applyIso14443a(exp, size, cmd, cmdsize);
|
||||
}
|
||||
|
||||
void annotateIclass(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
|
||||
|
@ -253,6 +257,83 @@ void annotateIso7816(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize){
|
|||
}
|
||||
}
|
||||
|
||||
// MIFARE DESFire
|
||||
void annotateMfDesfire(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize){
|
||||
|
||||
// it's basically a ISO14443a tag, so try annotation from there
|
||||
if (!applyIso14443a(exp, size, cmd, cmdsize)){
|
||||
//PrintAndLog("rest");
|
||||
//PrintAndLog("(%d)",cmd[0]);
|
||||
// S-block 11xxx010
|
||||
if ( (cmd[0] & 0xC0) && (cmdsize == 3) ) {
|
||||
switch ( (cmd[0] & 0x30) ) {
|
||||
case 0x30 : snprintf(exp, size, "S-block DESELECT"); break;
|
||||
case 0x00 : snprintf(exp, size, "S-block WTX"); break;
|
||||
default : snprintf(exp, size, "S-block"); break;
|
||||
}
|
||||
}
|
||||
// R-block (ack) 101xx01x
|
||||
else if ( ((cmd[0] & 0xB0) == 0xA0) && ( cmdsize > 2) ) {
|
||||
if ( (cmd[0] & 0x10) == 0 )
|
||||
snprintf(exp, size, "R-block ACK(%d)", (cmd[0] & 0x01));
|
||||
else
|
||||
snprintf(exp, size, "R-block NACK(%d)", (cmd[0] & 0x01));
|
||||
}
|
||||
// I-block 000xCN1x
|
||||
else if ( (cmd[0] & 0xC0) == 0x00){
|
||||
// PCB [CID] [NAD] [INF] CRC CRC
|
||||
int pos = 1;
|
||||
if ( (cmd[0] & 0x08) == 0x08) // cid byte following
|
||||
pos = pos + 1;
|
||||
if ( (cmd[0] & 0x04) == 0x04) // nad byte following
|
||||
pos = pos + 1;
|
||||
//PrintAndLog("[%d]",pos);
|
||||
switch ( cmd[pos] ){
|
||||
case MFDES_CREATE_APPLICATION :snprintf(exp, size, "CREATE APPLICATION");break;
|
||||
case MFDES_DELETE_APPLICATION :snprintf(exp, size, "DELETE APPLICATION");break;
|
||||
case MFDES_GET_APPLICATION_IDS :snprintf(exp, size, "GET APPLICATION IDS");break;
|
||||
case MFDES_SELECT_APPLICATION :snprintf(exp, size, "SELECT APPLICATION");break;
|
||||
case MFDES_FORMAT_PICC :snprintf(exp, size, "FORMAT PICC");break;
|
||||
case MFDES_GET_VERSION :snprintf(exp, size, "GET VERSION");break;
|
||||
case MFDES_READ_DATA :snprintf(exp, size, "READ DATA");break;
|
||||
case MFDES_WRITE_DATA :snprintf(exp, size, "WRITE DATA");break;
|
||||
case MFDES_GET_VALUE :snprintf(exp, size, "GET VALUE");break;
|
||||
case MFDES_CREDIT :snprintf(exp, size, "CREDIT");break;
|
||||
case MFDES_DEBIT :snprintf(exp, size, "DEBIT");break;
|
||||
case MFDES_LIMITED_CREDIT :snprintf(exp, size, "LIMITED CREDIT");break;
|
||||
case MFDES_WRITE_RECORD :snprintf(exp, size, "WRITE RECORD");break;
|
||||
case MFDES_READ_RECORDS :snprintf(exp, size, "READ RECORDS");break;
|
||||
case MFDES_CLEAR_RECORD_FILE :snprintf(exp, size, "CLEAR RECORD FILE");break;
|
||||
case MFDES_COMMIT_TRANSACTION :snprintf(exp, size, "COMMIT TRANSACTION");break;
|
||||
case MFDES_ABORT_TRANSACTION :snprintf(exp, size, "ABORT TRANSACTION");break;
|
||||
case MFDES_GET_FREE_MEMORY :snprintf(exp, size, "GET FREE MEMORY");break;
|
||||
case MFDES_GET_FILE_IDS :snprintf(exp, size, "GET FILE IDS");break;
|
||||
case MFDES_GET_ISOFILE_IDS :snprintf(exp, size, "GET ISOFILE IDS");break;
|
||||
case MFDES_GET_FILE_SETTINGS :snprintf(exp, size, "GET FILE SETTINGS");break;
|
||||
case MFDES_CHANGE_FILE_SETTINGS :snprintf(exp, size, "CHANGE FILE SETTINGS");break;
|
||||
case MFDES_CREATE_STD_DATA_FILE :snprintf(exp, size, "CREATE STD DATA FILE");break;
|
||||
case MFDES_CREATE_BACKUP_DATA_FILE :snprintf(exp, size, "CREATE BACKUP DATA FILE");break;
|
||||
case MFDES_CREATE_VALUE_FILE :snprintf(exp, size, "CREATE VALUE FILE");break;
|
||||
case MFDES_CREATE_LINEAR_RECORD_FILE :snprintf(exp, size, "CREATE LINEAR RECORD FILE");break;
|
||||
case MFDES_CREATE_CYCLIC_RECORD_FILE :snprintf(exp, size, "CREATE CYCLIC RECORD FILE");break;
|
||||
case MFDES_DELETE_FILE :snprintf(exp, size, "DELETE FILE");break;
|
||||
case MFDES_AUTHENTICATE :snprintf(exp, size, "AUTH NATIVE (keyNo %d)", cmd[pos+1]);break; // AUTHENTICATE_NATIVE
|
||||
case MFDES_AUTHENTICATE_ISO :snprintf(exp, size, "AUTH ISO (keyNo %d)", cmd[pos+1]);break; // AUTHENTICATE_STANDARD
|
||||
case MFDES_AUTHENTICATE_AES :snprintf(exp, size, "AUTH AES (keyNo %d)", cmd[pos+1]);break;
|
||||
case MFDES_CHANGE_KEY_SETTINGS :snprintf(exp, size, "CHANGE KEY SETTINGS");break;
|
||||
case MFDES_GET_KEY_SETTINGS :snprintf(exp, size, "GET KEY SETTINGS");break;
|
||||
case MFDES_CHANGE_KEY :snprintf(exp, size, "CHANGE KEY");break;
|
||||
case MFDES_GET_KEY_VERSION :snprintf(exp, size, "GET KEY VERSION");break;
|
||||
case MFDES_AUTHENTICATION_FRAME :snprintf(exp, size, "AUTH FRAME / NEXT FRAME");break;
|
||||
default :break;
|
||||
}
|
||||
}else{
|
||||
// anything else
|
||||
snprintf(exp,size,"?");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
06 00 = INITIATE
|
||||
0E xx = SELECT ID (xx = Chip-ID)
|
||||
|
@ -520,6 +601,7 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
|
|||
crcStatus = iso14443B_CRC_check(isResponse, frame, data_len);
|
||||
break;
|
||||
case ISO_14443A:
|
||||
case MFDES:
|
||||
crcStatus = iso14443A_CRC_check(isResponse, frame, data_len);
|
||||
break;
|
||||
default:
|
||||
|
@ -575,6 +657,7 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
|
|||
switch(protocol) {
|
||||
case ICLASS: annotateIclass(explanation,sizeof(explanation),frame,data_len); break;
|
||||
case ISO_14443A: annotateIso14443a(explanation,sizeof(explanation),frame,data_len); break;
|
||||
case MFDES: annotateMfDesfire(explanation,sizeof(explanation),frame,data_len); break;
|
||||
case ISO_14443B: annotateIso14443b(explanation,sizeof(explanation),frame,data_len); break;
|
||||
case TOPAZ: annotateTopaz(explanation,sizeof(explanation),frame,data_len); break;
|
||||
case ISO_7816_4: annotateIso7816(explanation,sizeof(explanation),frame,data_len); break;
|
||||
|
@ -623,6 +706,7 @@ int usage_hf_list(){
|
|||
PrintAndLog(" raw - just show raw data without annotations");
|
||||
PrintAndLog(" 14a - interpret data as iso14443a communications");
|
||||
PrintAndLog(" 14b - interpret data as iso14443b communications");
|
||||
PrintAndLog(" des - interpret data as DESFire communications");
|
||||
PrintAndLog(" iclass - interpret data as iclass communications");
|
||||
PrintAndLog(" topaz - interpret data as topaz communications");
|
||||
PrintAndLog(" 7816 - interpret data as iso7816-4 communications");
|
||||
|
@ -685,7 +769,8 @@ int CmdHFList(const char *Cmd)
|
|||
else if(strcmp(type, "14a") == 0) protocol = ISO_14443A;
|
||||
else if(strcmp(type, "14b") == 0) protocol = ISO_14443B;
|
||||
else if(strcmp(type, "topaz")== 0) protocol = TOPAZ;
|
||||
else if(strcmp(type, "7816")== 0) protocol = ISO_7816_4;
|
||||
else if(strcmp(type, "7816")== 0) protocol = ISO_7816_4;
|
||||
else if(strcmp(type,"des")== 0) protocol = MFDES;
|
||||
else if(strcmp(type, "raw")== 0) protocol = -1;//No crc, no annotations
|
||||
else errors = true;
|
||||
|
||||
|
|
|
@ -251,6 +251,7 @@ ISO 7816-4 Basic interindustry commands. For command APDU's.
|
|||
#define ISO_14443B 2
|
||||
#define TOPAZ 3
|
||||
#define ISO_7816_4 4
|
||||
#define MFDES 5
|
||||
|
||||
//-- Picopass fuses
|
||||
#define FUSE_FPERS 0x80
|
||||
|
@ -284,6 +285,44 @@ ISO 7816-4 Basic interindustry commands. For command APDU's.
|
|||
#define ISO7816_OK 0x9000
|
||||
// 6x xx = ERROR
|
||||
|
||||
// MIFARE DESFire command set:
|
||||
#define MFDES_CREATE_APPLICATION 0xca
|
||||
#define MFDES_DELETE_APPLICATION 0xda
|
||||
#define MFDES_GET_APPLICATION_IDS 0x6a
|
||||
#define MFDES_SELECT_APPLICATION 0x5a
|
||||
#define MFDES_FORMAT_PICC 0xfc
|
||||
#define MFDES_GET_VERSION 0x60
|
||||
#define MFDES_READ_DATA 0xbd
|
||||
#define MFDES_WRITE_DATA 0x3d
|
||||
#define MFDES_GET_VALUE 0x6c
|
||||
#define MFDES_CREDIT 0x0c
|
||||
#define MFDES_DEBIT 0xdc
|
||||
#define MFDES_LIMITED_CREDIT 0x1c
|
||||
#define MFDES_WRITE_RECORD 0x3b
|
||||
#define MFDES_READ_RECORDS 0xbb
|
||||
#define MFDES_CLEAR_RECORD_FILE 0xeb
|
||||
#define MFDES_COMMIT_TRANSACTION 0xc7
|
||||
#define MFDES_ABORT_TRANSACTION 0xa7
|
||||
#define MFDES_GET_FREE_MEMORY 0x6e
|
||||
#define MFDES_GET_FILE_IDS 0x6f
|
||||
#define MFDES_GET_ISOFILE_IDS 0x61
|
||||
#define MFDES_GET_FILE_SETTINGS 0xf5
|
||||
#define MFDES_CHANGE_FILE_SETTINGS 0x5f
|
||||
#define MFDES_CREATE_STD_DATA_FILE 0xcd
|
||||
#define MFDES_CREATE_BACKUP_DATA_FILE 0xcb
|
||||
#define MFDES_CREATE_VALUE_FILE 0xcc
|
||||
#define MFDES_CREATE_LINEAR_RECORD_FILE 0xc1
|
||||
#define MFDES_CREATE_CYCLIC_RECORD_FILE 0xc0
|
||||
#define MFDES_DELETE_FILE 0xdf
|
||||
#define MFDES_AUTHENTICATE 0x0a // AUTHENTICATE_NATIVE
|
||||
#define MFDES_AUTHENTICATE_ISO 0x1a // AUTHENTICATE_STANDARD
|
||||
#define MFDES_AUTHENTICATE_AES 0xaa
|
||||
#define MFDES_CHANGE_KEY_SETTINGS 0x54
|
||||
#define MFDES_GET_KEY_SETTINGS 0x45
|
||||
#define MFDES_CHANGE_KEY 0xc4
|
||||
#define MFDES_GET_KEY_VERSION 0x64
|
||||
#define MFDES_AUTHENTICATION_FRAME 0xAF
|
||||
|
||||
void printIclassDumpInfo(uint8_t* iclass_dump);
|
||||
void getMemConfig(uint8_t mem_cfg, uint8_t chip_cfg, uint8_t *max_blk, uint8_t *app_areas, uint8_t *kb);
|
||||
|
||||
|
|
Loading…
Reference in a new issue