]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhf14a.c
Merge pull request #34 from marshmellow42/master
[proxmark3-svn] / client / cmdhf14a.c
index 5d1c48535601e50fd98bf3d7125fdc0e0d1220d4..c997607652c9c8b632a6dffcf239efd5c23d31e1 100644 (file)
@@ -56,8 +56,8 @@ int CmdHF14AList(const char *Cmd)
        PrintAndLog("Start = Start of Start Bit, End = End of last modulation. Src = Source of Transfer");
        PrintAndLog("All times are in carrier periods (1/13.56Mhz)");
        PrintAndLog("");
        PrintAndLog("Start = Start of Start Bit, End = End of last modulation. Src = Source of Transfer");
        PrintAndLog("All times are in carrier periods (1/13.56Mhz)");
        PrintAndLog("");
-       PrintAndLog("     Start |       End | Src | Data");
-       PrintAndLog("-----------|-----------|-----|--------");
+       PrintAndLog("     Start |       End | Src | Data (! denotes parity error)                                   | CRC ");
+       PrintAndLog("-----------|-----------|-----|-----------------------------------------------------------------------");
 
        uint16_t tracepos = 0;
        uint16_t duration;
 
        uint16_t tracepos = 0;
        uint16_t duration;
@@ -78,6 +78,10 @@ int CmdHF14AList(const char *Cmd)
                if(tracepos == 0) {
                        first_timestamp = timestamp;
                }
                if(tracepos == 0) {
                        first_timestamp = timestamp;
                }
+
+               // Break and stick with current result if buffer was not completely full
+               if (timestamp == 0x44444444) break; 
+
                tracepos += 4;
                duration = *((uint16_t *)(trace + tracepos));
                tracepos += 2;
                tracepos += 4;
                duration = *((uint16_t *)(trace + tracepos));
                tracepos += 2;
@@ -102,33 +106,30 @@ int CmdHF14AList(const char *Cmd)
                uint8_t *parityBytes = trace + tracepos;
                tracepos += parity_len;
 
                uint8_t *parityBytes = trace + tracepos;
                tracepos += parity_len;
 
-               // Break and stick with current result if buffer was not completely full
-               if (timestamp == 0x44444444) break; 
-
-               char line[1000] = "";
-               int j;
-               for (j = 0; j < data_len; j++) {
+               char line[16][110];
+               for (int j = 0; j < data_len; j++) {
                        int oddparity = 0x01;
                        int k;
                        int oddparity = 0x01;
                        int k;
-
+                       
                        for (k=0;k<8;k++) {
                                oddparity ^= (((frame[j] & 0xFF) >> k) & 0x01);
                        }
 
                        uint8_t parityBits = parityBytes[j>>3];
                        if (isResponse && (oddparity != ((parityBits >> (7-(j&0x0007))) & 0x01))) {
                        for (k=0;k<8;k++) {
                                oddparity ^= (((frame[j] & 0xFF) >> k) & 0x01);
                        }
 
                        uint8_t parityBits = parityBytes[j>>3];
                        if (isResponse && (oddparity != ((parityBits >> (7-(j&0x0007))) & 0x01))) {
-                               sprintf(line+(j*4), "%02x!  ", frame[j]);
+                               sprintf(line[j/16]+((j%16)*4), "%02x! ", frame[j]);
                        } else {
                        } else {
-                               sprintf(line+(j*4), "%02x   ", frame[j]);
+                               sprintf(line[j/16]+((j%16)*4), "%02x  ", frame[j]);
                        }
                        }
+
                }
 
                }
 
-               char crc[6] = ""; 
+               char crc[5] = ""; 
                if (data_len > 2) {
                uint8_t b1, b2;
                        ComputeCrc14443(CRC_14443_A, frame, data_len-2, &b1, &b2);
                        if (b1 != frame[data_len-2] || b2 != frame[data_len-1]) {
                if (data_len > 2) {
                uint8_t b1, b2;
                        ComputeCrc14443(CRC_14443_A, frame, data_len-2, &b1, &b2);
                        if (b1 != frame[data_len-2] || b2 != frame[data_len-1]) {
-                               sprintf(crc, (isResponse & (data_len < 6)) ? "" : " !crc");
+                               sprintf(crc, (isResponse & (data_len < 6)) ? "" : "!crc");
                        } else {
                                sprintf(crc, "");
                        }
                        } else {
                                sprintf(crc, "");
                        }
@@ -136,12 +137,21 @@ int CmdHF14AList(const char *Cmd)
 
                EndOfTransmissionTimestamp = timestamp + duration;
                
 
                EndOfTransmissionTimestamp = timestamp + duration;
                
-               PrintAndLog(" %9d | %9d | %s | %s %s",
-                       (timestamp - first_timestamp),
-                       (EndOfTransmissionTimestamp - first_timestamp),
-                       (isResponse ? "Tag" : "Rdr"),
-                       line, 
-                       crc);
+               int num_lines = (data_len - 1)/16 + 1;
+               for (int j = 0; j < num_lines; j++) {
+                       if (j == 0) {
+                               PrintAndLog(" %9d | %9d | %s | %-64s| %s",
+                                       (timestamp - first_timestamp),
+                                       (EndOfTransmissionTimestamp - first_timestamp),
+                                       (isResponse ? "Tag" : "Rdr"),
+                                       line[j], 
+                                       (j == num_lines-1)?crc:"");
+                       } else {
+                               PrintAndLog("           |           |     | %-64s| %s",
+                                       line[j], 
+                                       (j == num_lines-1)?crc:"");
+                       }
+               }                               
 
                bool next_isResponse = *((uint16_t *)(trace + tracepos + 6)) & 0x8000;
                
 
                bool next_isResponse = *((uint16_t *)(trace + tracepos + 6)) & 0x8000;
                
@@ -181,6 +191,11 @@ int CmdHF14AReader(const char *Cmd)
        
        if(select_status == 0) {
                PrintAndLog("iso14443a card select failed");
        
        if(select_status == 0) {
                PrintAndLog("iso14443a card select failed");
+               // disconnect
+               c.arg[0] = 0;
+               c.arg[1] = 0;
+               c.arg[2] = 0;
+               SendCommand(&c);
                return 0;
        }
 
                return 0;
        }
 
Impressum, Datenschutz