X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/8e00825a3491113508085b4ea949b10aa47499b9..146600578c1ab840c33321662ee91ce169bb9086:/client/cmdhf14b.c diff --git a/client/cmdhf14b.c b/client/cmdhf14b.c index fafe92ca..4b69ab4c 100644 --- a/client/cmdhf14b.c +++ b/client/cmdhf14b.c @@ -132,6 +132,7 @@ int CmdHF14BCmdRaw (const char *Cmd) { bool reply = true; bool crc = false; bool power = false; + bool select = false; char buf[5] = ""; uint8_t data[100] = {0x00}; uint8_t datalen = 0; @@ -142,7 +143,8 @@ int CmdHF14BCmdRaw (const char *Cmd) { PrintAndLog(" -r do not read response"); PrintAndLog(" -c calculate and append CRC"); PrintAndLog(" -p leave the field on after receive"); - return 0; + PrintAndLog(" -s active signal field ON with select"); + return 0; } // strip @@ -164,6 +166,10 @@ int CmdHF14BCmdRaw (const char *Cmd) { case 'P': power = true; break; + case 's': + case 'S': + select = true; + break; default: PrintAndLog("Invalid option"); return 0; @@ -194,12 +200,39 @@ int CmdHF14BCmdRaw (const char *Cmd) { return 0; } + if (select){ //auto select 14b tag + uint8_t cmd2[16]; + uint8_t cmdLen = 3; + bool crc2 = true; + cmd2[0] = 0x05; + cmd2[1] = 0x00; + cmd2[2] = 0x08; + + // REQB + if (HF14BCmdRaw(true, &crc2, true, cmd2, &cmdLen, false)==0) return rawClose(); + + if (cmd2[0] != 0x50 || cmdLen != 14 || !crc2) return rawClose(); + + cmd2[0] = 0x1D; + // UID from data[1 - 4] + cmd2[5] = 0x00; + cmd2[6] = 0x08; + cmd2[7] = 0x01; + cmd2[8] = 0x00; + cmdLen = 9; + + // attrib + if (HF14BCmdRaw(true, &crc2, true, cmd2, &cmdLen, false)==0) return rawClose(); + + if (cmdLen != 3 || !crc2) return rawClose(); + } + 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 (" UID: %s", sprint_hex(data+1,4)); PrintAndLog (" App Data: %s", sprint_hex(data+5,4)); PrintAndLog (" Protocol: %s", sprint_hex(data+9,3)); uint8_t BitRate = data[9]; @@ -234,14 +267,15 @@ static void print_atqb_resp(uint8_t *data){ else maxFrame = 257; - PrintAndLog ("Max Frame Size: %d%s",maxFrame, (maxFrame == 257) ? "+ RFU" : ""); + PrintAndLog ("Max Frame Size: %u%s",maxFrame, (maxFrame == 257) ? "+ RFU" : ""); uint8_t protocolT = data[10] & 0xF; PrintAndLog (" Protocol Type: Protocol is %scompliant with ISO/IEC 14443-4",(protocolT) ? "" : "not " ); - PrintAndLog ("Frame Wait Int: %d", data[11]>>4); + PrintAndLog ("Frame Wait Int: %u", data[11]>>4); PrintAndLog (" App Data Code: Application is %s",(data[11]&4) ? "Standard" : "Proprietary"); PrintAndLog (" Frame Options: NAD is %ssupported",(data[11]&2) ? "" : "not "); PrintAndLog (" Frame Options: CID is %ssupported",(data[11]&1) ? "" : "not "); + PrintAndLog ("Max Buf Length: %u (MBLI) %s",data[14]>>4, (data[14] & 0xF0) ? "" : "not supported"); return; } @@ -267,7 +301,7 @@ char *get_ST_Chip_Model(uint8_t data){ int print_ST_Lock_info(uint8_t model){ //assume connection open and tag selected... - uint8_t data[8] = {0x00}; + uint8_t data[16] = {0x00}; uint8_t datalen = 2; bool crc = true; uint8_t resplen; @@ -296,9 +330,9 @@ int print_ST_Lock_info(uint8_t model){ //only need data[3] blk1 = 9; PrintAndLog(" raw: %s",printBits(1,data+3)); - PrintAndLog(" 07/08: %slocked", blk1, (data[3] & 1) ? "not " : "" ); + PrintAndLog(" 07/08:%slocked", (data[3] & 1) ? " not " : " " ); for (uint8_t i = 1; i<8; i++){ - PrintAndLog(" %02u: %slocked", blk1, (data[3] & (1 << i)) ? "not " : "" ); + PrintAndLog(" %02u:%slocked", blk1, (data[3] & (1 << i)) ? " not " : " " ); blk1++; } break; @@ -310,7 +344,7 @@ int print_ST_Lock_info(uint8_t model){ PrintAndLog(" raw: %s",printBits(2,data+2)); for (uint8_t b=2; b<4; b++){ for (uint8_t i=0; i<8; i++){ - PrintAndLog(" %02u: %slocked", blk1, (data[b] & (1 << i)) ? "not " : "" ); + PrintAndLog(" %02u:%slocked", blk1, (data[b] & (1 << i)) ? " not " : " " ); blk1++; } } @@ -320,7 +354,7 @@ int print_ST_Lock_info(uint8_t model){ blk1 = 0; PrintAndLog(" raw: %s",printBits(1,data+2)); for (uint8_t i = 0; i<8; i++){ - PrintAndLog(" %02u/%02u: %slocked", blk1, blk1+1, (data[2] & (1 << i)) ? "" : "not " ); + PrintAndLog(" %02u/%02u:%slocked", blk1, blk1+1, (data[2] & (1 << i)) ? " " : " not " ); blk1+=2; } break; @@ -342,9 +376,9 @@ static void print_st_general_info(uint8_t *data){ // 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) - //02 = ? (resp 02 6a d3) + //1d xx xx xx xx 00 08 01 00 = attrib xx=UID (resp 10 [f9 e0]) + //a3 = ? (resp 03 [e2 c2]) + //02 = ? (resp 02 [6a d3]) // 022b (resp 02 67 00 [29 5b]) // 0200a40400 (resp 02 67 00 [29 5b]) // 0200a4040c07a0000002480300 (resp 02 67 00 [29 5b]) @@ -357,6 +391,7 @@ int HF14BStdReader(uint8_t *data, uint8_t *datalen){ //03 = ? (resp 03 [e3 c2]) //c2 = ? (resp c2 [66 15]) //b2 = ? (resp a3 [e9 67]) + //a2 = ? (resp 02 [6a d3]) bool crc = true; *datalen = 3; //std read cmd @@ -364,13 +399,36 @@ int HF14BStdReader(uint8_t *data, uint8_t *datalen){ data[1] = 0x00; data[2] = 0x08; - if (HF14BCmdRaw(true, &crc, false, data, datalen, false)==0) return 0; + if (HF14BCmdRaw(true, &crc, true, data, datalen, false)==0) return rawClose(); - if (data[0] != 0x50 || *datalen != 14 || !crc) return 0; + if (data[0] != 0x50 || *datalen != 14 || !crc) return rawClose(); PrintAndLog ("\n14443-3b tag found:"); PrintAndLog (" UID: %s", sprint_hex(data+1,4)); + uint8_t cmd2[16]; + uint8_t cmdLen = 3; + bool crc2 = true; + + cmd2[0] = 0x1D; + // UID from data[1 - 4] + cmd2[1] = data[1]; + cmd2[2] = data[2]; + cmd2[3] = data[3]; + cmd2[4] = data[4]; + cmd2[5] = 0x00; + cmd2[6] = 0x08; + cmd2[7] = 0x01; + cmd2[8] = 0x00; + cmdLen = 9; + + // attrib + if (HF14BCmdRaw(true, &crc2, true, cmd2, &cmdLen, false)==0) return rawClose(); + + if (cmdLen != 3 || !crc2) return rawClose(); + // add attrib responce to data + data[14] = cmd2[0]; + rawClose(); return 1; } @@ -381,6 +439,7 @@ int HF14BStdInfo(uint8_t *data, uint8_t *datalen){ //add more info here print_atqb_resp(data); + return 1; } @@ -415,11 +474,12 @@ int HF14B_ST_Reader(uint8_t *data, uint8_t *datalen, bool closeCon){ //leave power on if (HF14BCmdRaw(true, &crc, true, data, datalen, false)==0) return rawClose(); + + if (*datalen != 10 || !crc) return rawClose(); + //power off ? if (closeCon) rawClose(); - if (*datalen != 10 || !crc) return 0; - PrintAndLog("\n14443-3b ST tag found:"); print_st_general_info(data); return 1;