]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhf.c
Merge branch 'master' of https://github.com/Proxmark/proxmark3
[proxmark3-svn] / client / cmdhf.c
index 65cc1c18fe95cc50a448d7ab237a060e5f156c87..614dcdc4460e98bf7ed5b90de015970cfe6c10ea 100644 (file)
@@ -36,7 +36,6 @@ int CmdHFTune(const char *Cmd)
   return 0;
 }
 
-
 void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
 {
        switch(cmd[0])
@@ -77,7 +76,7 @@ void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
                if ( cmdsize > 3)
                        snprintf(exp,size,"AUTH-A(%d)",cmd[1]); 
                else
-                       //      case MIFARE_ULEV1_VERS :  both 0x60.
+                       //      case MIFARE_ULEV1_VERSION :  both 0x60.
                        snprintf(exp,size,"EV1 VERSION");
                break;
        }
@@ -87,16 +86,44 @@ void annotateIso14443a(char *exp, size_t size, uint8_t* cmd, uint8_t cmdsize)
        case MIFARE_MAGICWIPEC:                 snprintf(exp,size,"MAGIC WIPEC"); break;
        case MIFARE_ULC_AUTH_1 :                snprintf(exp,size,"AUTH "); break;
        case MIFARE_ULC_AUTH_2 :                snprintf(exp,size,"AUTH_ANSW"); break;
-       case MIFARE_ULEV1_AUTH :                snprintf(exp,size,"PWD-AUTH"); break;
+       case MIFARE_ULEV1_AUTH :        
+               if ( cmdsize == 7 )
+                       snprintf(exp,size,"PWD-AUTH KEY: 0x%02x%02x%02x%02x", cmd[1], cmd[2], cmd[3], cmd[4] );
+               else
+                       snprintf(exp,size,"PWD-AUTH");
+               break;
 
-       case MIFARE_ULEV1_FASTREAD :    snprintf(exp,size,"READ RANGE (%d-%d)",cmd[1],cmd[2]); break;
-       case MIFARE_ULEV1_WRITE :               snprintf(exp,size,"WRITEBLOCK(%d)",cmd[1]); break;
-       case MIFARE_ULEV1_READ_CNT :    snprintf(exp,size,"READ CNT(%d)",cmd[1]); break;
-       case MIFARE_ULEV1_INCR_CNT :    snprintf(exp,size,"INC(%d)",cmd[1]); break;
+       case MIFARE_ULEV1_FASTREAD : {
+               if ( cmdsize >=3 && cmd[2] <= 0xE6)
+                       snprintf(exp,size,"READ RANGE (%d-%d)",cmd[1],cmd[2]); 
+               else
+                       snprintf(exp,size,"?");
+               break;
+       }
+       case MIFARE_ULC_WRITE : {
+               if ( cmd[1] < 0x21 )
+                       snprintf(exp,size,"WRITEBLOCK(%d)",cmd[1]); 
+               else
+                       snprintf(exp,size,"?");
+               break;
+       }
+       case MIFARE_ULEV1_READ_CNT :{
+               if ( cmd[1] < 5 )
+                       snprintf(exp,size,"READ CNT(%d)",cmd[1]);
+               else
+                       snprintf(exp,size,"?");
+               break;
+       }
+       case MIFARE_ULEV1_INCR_CNT : {
+               if ( cmd[1] < 5 )
+                       snprintf(exp,size,"INCR(%d)",cmd[1]);
+               else
+                       snprintf(exp,size,"?");
+               break;
+       }
        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;
        }
        return;
@@ -258,9 +285,8 @@ uint8_t iso14443B_CRC_check(bool isResponse, uint8_t* data, uint8_t len)
        ComputeCrc14443(CRC_14443_B, data, len-2, &b1, &b2);
        if(b1 != data[len-2] || b2 != data[len-1]) {
          return 0;
-       } else {
-       return 1;
        }
+       return 1;
 }
 
 /**
@@ -428,11 +454,11 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
        if (data_len > 2) {
                switch (protocol) {
                        case ICLASS:
-                       crcStatus = iclass_CRC_check(isResponse, frame, data_len);
+                               crcStatus = iclass_CRC_check(isResponse, frame, data_len);
                                break;
                        case ISO_14443B:
                        case TOPAZ:
-                       crcStatus = iso14443B_CRC_check(isResponse, frame, data_len);
+                               crcStatus = iso14443B_CRC_check(isResponse, frame, data_len);
                                break;
                        case ISO_14443A:
                                crcStatus = iso14443A_CRC_check(isResponse, frame, data_len);
@@ -446,7 +472,6 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
        //2 Not crc-command
 
        //--- Draw the data column
-       //char line[16][110];
        char line[16][110];
 
        for (int j = 0; j < data_len && j/16 < 16; j++) {
@@ -463,27 +488,22 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
                } else {
                        snprintf(line[j/16]+(( j % 16) * 4),110, "%02x  ", frame[j]);
                }
-
        }
 
        if (markCRCBytes) {
-               if(crcStatus == 0 || crcStatus == 1)
-       {//CRC-command
+               //CRC-command
+               if(crcStatus == 0 || crcStatus == 1) {
                        char *pos1 = line[(data_len-2)/16]+(((data_len-2) % 16) * 4);
-               (*pos1) = '[';
+                       (*pos1) = '[';
                        char *pos2 = line[(data_len)/16]+(((data_len) % 16) * 4);
                        sprintf(pos2, "%c", ']');
                }
        }
 
-       if(data_len == 0)
-       {
-               if(data_len == 0){
-                       sprintf(line[0],"<empty trace - possible error>");
-               }
+       if(data_len == 0){
+               sprintf(line[0],"<empty trace - possible error>");
        }
        //--- Draw the CRC column
-
        char *crc = (crcStatus == 0 ? "!crc" : (crcStatus == 1 ? " ok " : "    "));
 
        EndOfTransmissionTimestamp = timestamp + duration;
@@ -510,9 +530,9 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
                                (j == num_lines-1) ? crc : "    ",
                                (j == num_lines-1) ? explanation : "");
                } else {
-                       PrintAndLog("           |           |     | %-64s| %s| %s",
+                       PrintAndLog("            |            |     |%-64s | %s| %s",
                                line[j],
-                               (j == num_lines-1)?crc:"    ",
+                               (j == num_lines-1) ? crc : "    ",
                                (j == num_lines-1) ? explanation : "");
                }
        }
@@ -521,7 +541,7 @@ uint16_t printTraceLine(uint16_t tracepos, uint16_t traceLen, uint8_t *trace, ui
        
        if (showWaitCycles && !isResponse && next_record_is_response(tracepos, trace)) {
                uint32_t next_timestamp = *((uint32_t *)(trace + tracepos));
-                       PrintAndLog(" %9d | %9d | %s | fdt (Frame Delay Time): %d",
+                       PrintAndLog(" %10d | %10d | %s |fdt (Frame Delay Time): %d",
                                (EndOfTransmissionTimestamp - first_timestamp),
                                (next_timestamp - first_timestamp),
                                "   ",
@@ -635,6 +655,32 @@ int CmdHFList(const char *Cmd)
        return 0;
 }
 
+int CmdHFSearch(const char *Cmd){
+       int ans = 0;
+       PrintAndLog("");
+       ans = CmdHF14AReader("s");
+       if (ans > 0) {
+               PrintAndLog("\nValid ISO14443A Tag Found - Quiting Search\n");
+               return ans;
+       } 
+       ans = HFiClassReader("", false, false);
+       if (ans) {
+               PrintAndLog("\nValid iClass Tag (or PicoPass Tag) Found - Quiting Search\n");
+               return ans;
+       }
+       ans = HF15Reader("", false);
+       if (ans) {
+               PrintAndLog("\nValid ISO15693 Tag Found - Quiting Search\n");
+               return ans;
+       }
+
+
+       //14b has issues currently...
+       //ans = CmdHF14BRead(Cmd);
+       //if (ans > 0) return ans;
+
+       return 0;
+}
 
 static command_t CommandTable[] = 
 {
@@ -646,11 +692,12 @@ static command_t CommandTable[] =
   {"legic",       CmdHFLegic,       0, "{ LEGIC RFIDs... }"},
   {"iclass",      CmdHFiClass,      1, "{ ICLASS RFIDs... }"},
   {"mf",               CmdHFMF,                1, "{ MIFARE RFIDs... }"},
-  {"mfu",                      CmdHFMFUltra,   1, "{ MIFARE Ultralight RFIDs... }"},
+  {"mfu",         CmdHFMFUltra,     1, "{ MIFARE Ultralight RFIDs... }"},
   {"mfdes",                    CmdHFMFDes,             1, "{ MIFARE Desfire RFIDs... }"},
   {"topaz",                    CmdHFTopaz,             1, "{ TOPAZ (NFC Type 1) RFIDs... }"},
   {"tune",                     CmdHFTune,      0, "Continuously measure HF antenna tuning"},
-  {"list",                     CmdHFList,      1, "List protocol data in trace buffer"},
+  {"list",        CmdHFList,        1, "List protocol data in trace buffer"},
+  {"search",      CmdHFSearch,      1, "Search for known HF tags [preliminary]"},
        {NULL, NULL, 0, NULL}
 };
 
Impressum, Datenschutz