]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhf14b.c
Merge remote-tracking branch 'upstream/master'
[proxmark3-svn] / client / cmdhf14b.c
index d1d668e9e28fcf1fffa9c40a4c64df5db2796096..acbd0c2c160cb00e108d446453200dc182168cf6 100644 (file)
@@ -197,6 +197,7 @@ int CmdHF14BCmdRaw (const char *Cmd) {
        return HF14BCmdRaw(reply, &crc, power, data, &datalen, true);
 }
 
+// print full atqb info
 static void print_atqb_resp(uint8_t *data){
        PrintAndLog ("           UID: %s", sprint_hex(data+1,4));
        PrintAndLog ("      App Data: %s", sprint_hex(data+5,4));
@@ -245,6 +246,7 @@ static void print_atqb_resp(uint8_t *data){
        return;
 }
 
+// get SRx chip model (from UID) // from ST Microelectronics
 char *get_ST_Chip_Model(uint8_t data){
        static char model[20];
        char *retStr = model;
@@ -263,7 +265,8 @@ char *get_ST_Chip_Model(uint8_t data){
        return retStr;
 }
 
-static void print_st_info(uint8_t *data){
+// print UID info from SRx chips (ST Microelectronics)
+static void print_st_general_info(uint8_t *data){
        //uid = first 8 bytes in data
        PrintAndLog(" UID: %s", sprint_hex(SwapEndian64(data,8,8),8));
        PrintAndLog(" MFG: %02X, %s", data[6], getTagInfo(data[6]));
@@ -271,8 +274,18 @@ static void print_st_info(uint8_t *data){
        return;
 }
 
+// 14b get and print Full Info (as much as we know)
 int HF14BStdInfo(uint8_t *data, uint8_t *datalen){
+       if (!HF14BStdReader(data,datalen)) return 0;
 
+       //add more info here
+       print_atqb_resp(data);
+
+       return 1;
+}
+
+// 14b get and print UID only (general info)
+int HF14BStdReader(uint8_t *data, uint8_t *datalen){
        //05 00 00 = find one tag in field
        //1d xx xx xx xx 20 00 08 01 00 = attrib xx=crc
        //a3 = ?  (resp 03 e2 c2)
@@ -294,19 +307,30 @@ int HF14BStdInfo(uint8_t *data, uint8_t *datalen){
        //std read cmd
        data[0] = 0x05;
        data[1] = 0x00;
-       data[2] = 0x00;
+       data[2] = 0x08;
 
        if (HF14BCmdRaw(true, &crc, false, data, datalen, false)==0) return 0;
 
        if (data[0] != 0x50  || *datalen != 14 || !crc) return 0;
 
        PrintAndLog ("\n14443-3b tag found:");
-       print_atqb_resp(data);
+       PrintAndLog ("           UID: %s", sprint_hex(data+1,4));
 
        return 1;
 }
 
+// SRx get and print full info (needs more info...)
 int HF14B_ST_Info(uint8_t *data, uint8_t *datalen){
+       if (!HF14B_ST_Reader(data, datalen)) return 0;
+       
+       //add locking bit information here.
+
+
+       return 1;
+}
+
+// SRx get and print general info about SRx chip from UID
+int HF14B_ST_Reader(uint8_t *data, uint8_t *datalen){
        bool crc = true;
        *datalen = 2;
        //wake cmd
@@ -342,12 +366,12 @@ int HF14B_ST_Info(uint8_t *data, uint8_t *datalen){
        if (*datalen != 10 || !crc) return 0;
 
        PrintAndLog("\n14443-3b ST tag found:");
-       print_st_info(data);
+       print_st_general_info(data);
        return 1;
 }
 
 // test for other 14b type tags (mimic another reader - don't have tags to identify)
-int HF14B_Other_Info(uint8_t *data, uint8_t *datalen){
+int HF14B_Other_Reader(uint8_t *data, uint8_t *datalen){
        bool crc = true;
        *datalen = 4;
        //std read cmd
@@ -356,7 +380,7 @@ int HF14B_Other_Info(uint8_t *data, uint8_t *datalen){
        data[2] = 0x3f;
        data[3] = 0x80;
 
-       if (HF14BCmdRaw(true, &crc, false, data, datalen, false)!=0) {
+       if (HF14BCmdRaw(true, &crc, true, data, datalen, false)!=0) {
                if (*datalen > 2 || !crc) {
                        PrintAndLog ("\n14443-3b tag found:");
                        PrintAndLog ("Unknown tag type answered to a 0x000b3f80 command ans:");
@@ -369,7 +393,7 @@ int HF14B_Other_Info(uint8_t *data, uint8_t *datalen){
        *datalen = 1;
        data[0] = 0x0a;
 
-       if (HF14BCmdRaw(true, &crc, false, data, datalen, false)!=0) {
+       if (HF14BCmdRaw(true, &crc, true, data, datalen, false)!=0) {
                if (*datalen > 0) {
                        PrintAndLog ("\n14443-3b tag found:");
                        PrintAndLog ("Unknown tag type answered to a 0x0A command ans:");
@@ -382,7 +406,7 @@ int HF14B_Other_Info(uint8_t *data, uint8_t *datalen){
        *datalen = 1;
        data[0] = 0x0c;
 
-       if (HF14BCmdRaw(true, &crc, false, data, datalen, false)!=0) {
+       if (HF14BCmdRaw(true, &crc, true, data, datalen, false)!=0) {
                if (*datalen > 0) {
                        PrintAndLog ("\n14443-3b tag found:");
                        PrintAndLog ("Unknown tag type answered to a 0x0C command ans:");
@@ -390,11 +414,11 @@ int HF14B_Other_Info(uint8_t *data, uint8_t *datalen){
                        return 1;
                }
        }
-
+       rawClose();
        return 0;
-
 }
 
+// get and print all info known about any known 14b tag
 int HF14BInfo(bool verbose){
        uint8_t data[100];
        uint8_t datalen = 5;
@@ -407,16 +431,41 @@ int HF14BInfo(bool verbose){
 
        // try unknown 14b read commands (to be identified later)
        //   could be read of calypso, CEPAS, moneo, or pico pass.
-       if (HF14B_Other_Info(data, &datalen)) return 1;
+       if (HF14B_Other_Reader(data, &datalen)) return 1;
 
        if (verbose) PrintAndLog("no 14443B tag found");
        return 0;
 }
 
+// menu command to get and print all info known about any known 14b tag
 int CmdHF14Binfo(const char *Cmd){
        return HF14BInfo(true);
 }
 
+// get and print general info about all known 14b chips
+int HF14BReader(bool verbose){
+       uint8_t data[100];
+       uint8_t datalen = 5;
+       
+       // try std 14b (atqb)
+       if (HF14BStdReader(data, &datalen)) return 1;
+
+       // try st 14b
+       if (HF14B_ST_Reader(data, &datalen)) return 1;
+
+       // try unknown 14b read commands (to be identified later)
+       //   could be read of calypso, CEPAS, moneo, or pico pass.
+       if (HF14B_Other_Reader(data, &datalen)) return 1;
+
+       if (verbose) PrintAndLog("no 14443B tag found");
+       return 0;
+}
+
+// menu command to get and print general info about all known 14b chips
+int CmdHF14BReader(const char *Cmd){
+       return HF14BReader(true);
+}
+
 int CmdSriWrite( const char *Cmd){
 /*
  * For SRIX4K  blocks 00 - 7F
@@ -487,8 +536,9 @@ int CmdSriWrite( const char *Cmd){
 static command_t CommandTable[] = 
 {
   {"help",        CmdHelp,        1, "This help"},
-       {"info",        CmdHF14Binfo,   0, "Find and print info about a 14b type tag (HF ISO 14443b)"},
-  {"list",        CmdHF14BList,   0, "[Deprecated] List ISO 14443b history"},
+  {"info",        CmdHF14Binfo,   0, "Find and print details about a 14443B tag"},
+  {"list",        CmdHF14BList,   0, "[Deprecated] List ISO 14443B history"},
+  {"reader",      CmdHF14BReader, 0, "Act as a 14443B reader to identify a tag"},
   {"sim",         CmdHF14BSim,    0, "Fake ISO 14443B tag"},
   {"snoop",       CmdHF14BSnoop,  0, "Eavesdrop ISO 14443B"},
   {"sri512read",  CmdSri512Read,  0, "Read contents of a SRI512 tag"},
Impressum, Datenschutz