ADD: ISO7816-4 annotation in "hf list".

Only basic 7816 command apdu supported. USAGE::"hf list 7816"
This commit is contained in:
iceman1001 2015-07-17 21:56:00 +02:00
parent d8af608f8e
commit c5f8c67ab4
2 changed files with 97 additions and 20 deletions

View file

@ -189,7 +189,6 @@ void annotateIso15693(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
} }
} }
void annotateTopaz(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize) void annotateTopaz(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
{ {
switch(cmd[0]) { switch(cmd[0]) {
@ -204,10 +203,34 @@ void annotateTopaz(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
case TOPAZ_READ8 :snprintf(exp, size, "READ8");break; case TOPAZ_READ8 :snprintf(exp, size, "READ8");break;
case TOPAZ_WRITE_E8 :snprintf(exp, size, "WRITE-E8");break; case TOPAZ_WRITE_E8 :snprintf(exp, size, "WRITE-E8");break;
case TOPAZ_WRITE_NE8 :snprintf(exp, size, "WRITE-NE8");break; case TOPAZ_WRITE_NE8 :snprintf(exp, size, "WRITE-NE8");break;
default: snprintf(exp,size,"?"); break; default :snprintf(exp,size,"?"); break;
} }
} }
void annotateIso7816(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize){
int pos = (cmd[0] == 2 || cmd[0] == 3) ? 1 : 2;
switch ( cmd[pos] ){
case ISO7816_READ_BINARY :snprintf(exp, size, "READ BIN");break;
case ISO7816_WRITE_BINARY :snprintf(exp, size, "WRITE BIN");break;
case ISO7816_UPDATE_BINARY :snprintf(exp, size, "UPDATE BIN");break;
case ISO7816_ERASE_BINARY :snprintf(exp, size, "ERASE BIN");break;
case ISO7816_READ_RECORDS :snprintf(exp, size, "READ RECORDS");break;
case ISO7816_WRITE_RECORDS :snprintf(exp, size, "WRITE RECORDS");break;
case ISO7816_APPEND_RECORD :snprintf(exp, size, "APPEND RECORD");break;
case ISO7816_UPDATE_RECORD :snprintf(exp, size, "UPDATE RECORD");break;
case ISO7816_GET_DATA :snprintf(exp, size, "GET DATA");break;
case ISO7816_PUT_DATA :snprintf(exp, size, "PUT DATA");break;
case ISO7816_SELECT_FILE :snprintf(exp, size, "SELECT FILE");break;
case ISO7816_VERIFY :snprintf(exp, size, "VERIFY");break;
case ISO7816_INTERNAL_AUTHENTICATION :snprintf(exp, size, "INTERNAL AUTH");break;
case ISO7816_EXTERNAL_AUTHENTICATION :snprintf(exp, size, "EXTERNAL AUTH");break;
case ISO7816_GET_CHALLENGE :snprintf(exp, size, "GET CHALLENGE");break;
case ISO7816_MANAGE_CHANNEL :snprintf(exp, size, "MANAGE CHANNEL");break;
default :snprintf(exp,size,"?"); break;
}
}
/** /**
06 00 = INITIATE 06 00 = INITIATE
@ -223,20 +246,21 @@ void annotateTopaz(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
void annotateIso14443b(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize) void annotateIso14443b(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
{ {
switch(cmd[0]){ switch(cmd[0]){
case ISO14443B_REQB : snprintf(exp,size,"REQB");break; case ISO14443B_REQB : snprintf(exp,size,"REQB");break;
case ISO14443B_ATTRIB : snprintf(exp,size,"ATTRIB");break; case ISO14443B_ATTRIB : snprintf(exp,size,"ATTRIB");break;
case ISO14443B_HALT : snprintf(exp,size,"HALT");break; case ISO14443B_HALT : snprintf(exp,size,"HALT");break;
case ISO14443B_INITIATE : snprintf(exp,size,"INITIATE");break; case ISO14443B_INITIATE : snprintf(exp,size,"INITIATE");break;
case ISO14443B_SELECT : snprintf(exp,size,"SELECT(%d)",cmd[1]);break; case ISO14443B_SELECT : snprintf(exp,size,"SELECT(%d)",cmd[1]);break;
case ISO14443B_GET_UID : snprintf(exp,size,"GET UID");break; case ISO14443B_GET_UID : snprintf(exp,size,"GET UID");break;
case ISO14443B_READ_BLK : snprintf(exp,size,"READ_BLK(%d)", cmd[1]);break; case ISO14443B_READ_BLK : snprintf(exp,size,"READ_BLK(%d)", cmd[1]);break;
case ISO14443B_WRITE_BLK : snprintf(exp,size,"WRITE_BLK(%d)",cmd[1]);break; case ISO14443B_WRITE_BLK : snprintf(exp,size,"WRITE_BLK(%d)",cmd[1]);break;
case ISO14443B_RESET : snprintf(exp,size,"RESET");break; case ISO14443B_RESET : snprintf(exp,size,"RESET");break;
case ISO14443B_COMPLETION : snprintf(exp,size,"COMPLETION");break; case ISO14443B_COMPLETION : snprintf(exp,size,"COMPLETION");break;
case ISO14443B_AUTHENTICATE : snprintf(exp,size,"AUTHENTICATE");break; case ISO14443B_AUTHENTICATE : snprintf(exp,size,"AUTHENTICATE");break;
default : snprintf(exp,size ,"?");break; case ISO14443B_PING : snprintf(exp,size,"PING");break;
case ISO14443B_PONG : snprintf(exp,size,"PONG");break;
default : snprintf(exp,size ,"?");break;
} }
} }
/** /**
@ -517,6 +541,7 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
case ISO_14443A: annotateIso14443a(explanation,sizeof(explanation),frame,data_len); break; case ISO_14443A: annotateIso14443a(explanation,sizeof(explanation),frame,data_len); break;
case ISO_14443B: annotateIso14443b(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 TOPAZ: annotateTopaz(explanation,sizeof(explanation),frame,data_len); break;
case ISO_7816_4: annotateIso7816(explanation,sizeof(explanation),frame,data_len); break;
default: break; default: break;
} }
} }
@ -585,6 +610,8 @@ int CmdHFList(const char *Cmd)
protocol = ISO_14443B; protocol = ISO_14443B;
} else if(strcmp(type,"topaz")== 0) { } else if(strcmp(type,"topaz")== 0) {
protocol = TOPAZ; protocol = TOPAZ;
} else if(strcmp(type,"7816")== 0) {
protocol = ISO_7816_4;
} else if(strcmp(type,"raw")== 0) { } else if(strcmp(type,"raw")== 0) {
protocol = -1;//No crc, no annotations protocol = -1;//No crc, no annotations
}else{ }else{
@ -603,6 +630,7 @@ int CmdHFList(const char *Cmd)
PrintAndLog(" 14b - interpret data as iso14443b communications"); PrintAndLog(" 14b - interpret data as iso14443b communications");
PrintAndLog(" iclass - interpret data as iclass communications"); PrintAndLog(" iclass - interpret data as iclass communications");
PrintAndLog(" topaz - interpret data as topaz communications"); PrintAndLog(" topaz - interpret data as topaz communications");
PrintAndLog(" 7816 - interpret data as iso7816-4 communications");
PrintAndLog(""); PrintAndLog("");
PrintAndLog("example: hf list 14a f"); PrintAndLog("example: hf list 14a f");
PrintAndLog("example: hf list iclass"); PrintAndLog("example: hf list iclass");

View file

@ -31,6 +31,9 @@ ISO14443B
05 = REQB 05 = REQB
1D = ATTRIB 1D = ATTRIB
50 = HALT 50 = HALT
BA = PING (reader -> tag)
AB = PONG (tag -> reader)
SRIX4K (tag does not respond to 05) SRIX4K (tag does not respond to 05)
06 00 = INITIATE 06 00 = INITIATE
0E xx = SELECT ID (xx = Chip-ID) 0E xx = SELECT ID (xx = Chip-ID)
@ -88,7 +91,29 @@ NXP/Philips CUSTOM COMMANDS
BA = Enable Privacy BA = Enable Privacy
BB = 64bit Password Protection BB = 64bit Password Protection
40 = Long Range CMD (Standard ISO/TR7003:1990) 40 = Long Range CMD (Standard ISO/TR7003:1990)
*/
ISO 7816-4 Basic interindustry commands. For command APDU's.
B0 = READ BINARY
D0 = WRITE BINARY
D6 = UPDATE BINARY
0E = ERASE BINARY
B2 = READ RECORDS
D2 = WRITE RECORDS
E2 = APPEND RECORD
DC = UPDATE RECORD
CA = GET DATA
DA = PUT DATA
A4 = SELECT FILE
20 = VERIFY
88 = INTERNAL AUTHENTICATION
82 = EXTERNAL AUTHENTICATION
B4 = GET CHALLENGE
70 = MANAGE CHANNEL
For response APDU's
90 00 = OK
6x xx = ERROR
*/
#define ICLASS_CMD_ACTALL 0x0A #define ICLASS_CMD_ACTALL 0x0A
#define ICLASS_CMD_READ_OR_IDENTIFY 0x0C #define ICLASS_CMD_READ_OR_IDENTIFY 0x0C
@ -159,6 +184,8 @@ NXP/Philips CUSTOM COMMANDS
#define ISO14443B_RESET 0x0C #define ISO14443B_RESET 0x0C
#define ISO14443B_COMPLETION 0x0F #define ISO14443B_COMPLETION 0x0F
#define ISO14443B_AUTHENTICATE 0x0A #define ISO14443B_AUTHENTICATE 0x0A
#define ISO14443B_PING 0xBA
#define ISO14443B_PONG 0xAB
//First byte is 26 //First byte is 26
#define ISO15693_INVENTORY 0x01 #define ISO15693_INVENTORY 0x01
@ -193,10 +220,11 @@ NXP/Philips CUSTOM COMMANDS
#define TOPAZ_WRITE_NE8 0x1B // Write-no-erase (eight bytes) #define TOPAZ_WRITE_NE8 0x1B // Write-no-erase (eight bytes)
#define ISO_14443A 0 #define ISO_14443A 0
#define ICLASS 1 #define ICLASS 1
#define ISO_14443B 2 #define ISO_14443B 2
#define TOPAZ 3 #define TOPAZ 3
#define ISO_7816_4 4
//-- Picopass fuses //-- Picopass fuses
#define FUSE_FPERS 0x80 #define FUSE_FPERS 0x80
@ -208,6 +236,27 @@ NXP/Philips CUSTOM COMMANDS
#define FUSE_FPROD0 0x02 #define FUSE_FPROD0 0x02
#define FUSE_RA 0x01 #define FUSE_RA 0x01
// ISO 7816-4 Basic interindustry commands. For command APDU's.
#define ISO7816_READ_BINARY 0xB0
#define ISO7816_WRITE_BINARY 0xD0
#define ISO7816_UPDATE_BINARY 0xD6
#define ISO7816_ERASE_BINARY 0x0E
#define ISO7816_READ_RECORDS 0xB2
#define ISO7816_WRITE_RECORDS 0xD2
#define ISO7816_APPEND_RECORD 0xE2
#define ISO7816_UPDATE_RECORD 0xDC
#define ISO7816_GET_DATA 0xCA
#define ISO7816_PUT_DATA 0xDA
#define ISO7816_SELECT_FILE 0xA4
#define ISO7816_VERIFY 0x20
#define ISO7816_INTERNAL_AUTHENTICATION 0x88
#define ISO7816_EXTERNAL_AUTHENTICATION 0x82
#define ISO7816_GET_CHALLENGE 0xB4
#define ISO7816_MANAGE_CHANNEL 0x70
// ISO7816-4 For response APDU's
#define ISO7816_OK 0x9000
// 6x xx = ERROR
void printIclassDumpInfo(uint8_t* iclass_dump); void printIclassDumpInfo(uint8_t* iclass_dump);