X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/6a1f2d82bb7d33cd49f9c191f36144ca10d5b629..52bfb95543120853999fdfca451204134b73b543:/client/cmdhf14a.c diff --git a/client/cmdhf14a.c b/client/cmdhf14a.c index 5d1c4853..c9976076 100644 --- a/client/cmdhf14a.c +++ b/client/cmdhf14a.c @@ -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 | End | Src | Data"); - PrintAndLog("-----------|-----------|-----|--------"); + PrintAndLog(" Start | End | Src | Data (! denotes parity error) | CRC "); + PrintAndLog("-----------|-----------|-----|-----------------------------------------------------------------------"); uint16_t tracepos = 0; uint16_t duration; @@ -78,6 +78,10 @@ int CmdHF14AList(const char *Cmd) 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; @@ -102,33 +106,30 @@ int CmdHF14AList(const char *Cmd) 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; - + 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 { - 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]) { - sprintf(crc, (isResponse & (data_len < 6)) ? "" : " !crc"); + sprintf(crc, (isResponse & (data_len < 6)) ? "" : "!crc"); } else { sprintf(crc, ""); } @@ -136,12 +137,21 @@ int CmdHF14AList(const char *Cmd) 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; @@ -181,6 +191,11 @@ int CmdHF14AReader(const char *Cmd) 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; }