X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/186ad6037cd4bd576ce38f002d219d9b0b82a7dd..8085377413257aa75a43540f40697ed9273d06a1:/client/cmdhf14b.c diff --git a/client/cmdhf14b.c b/client/cmdhf14b.c index f6692bac..a328d039 100644 --- a/client/cmdhf14b.c +++ b/client/cmdhf14b.c @@ -18,40 +18,55 @@ static int CmdHelp(const char *Cmd); int usage_hf_14b_info(void){ - PrintAndLog("Usage: hf 14b info [-h] [-s]"); - PrintAndLog(" -h this help"); - PrintAndLog(" -s silently"); + PrintAndLog("Usage: hf 14b info [h] [s]"); + PrintAndLog("Options:"); + PrintAndLog(" h this help"); + PrintAndLog(" s silently"); + PrintAndLog("sample:"); + PrintAndLog(" hf 14b info"); return 0; } int usage_hf_14b_reader(void){ - PrintAndLog("Usage: hf 14b reader [-h] [-s]"); - PrintAndLog(" -h this help"); - PrintAndLog(" -s silently"); + PrintAndLog("Usage: hf 14b reader [h] [s]"); + PrintAndLog("Options:"); + PrintAndLog(" h this help"); + PrintAndLog(" s silently"); + PrintAndLog("sample:"); + PrintAndLog(" hf 14b reader"); return 0; } int usage_hf_14b_raw(void){ PrintAndLog("Usage: hf 14b raw [-h] [-r] [-c] [-p] [-s || -ss] <0A 0B 0C ... hex>"); + PrintAndLog("Options:"); PrintAndLog(" -h this help"); PrintAndLog(" -r do not read response"); PrintAndLog(" -c calculate and append CRC"); PrintAndLog(" -p leave the field on after receive"); PrintAndLog(" -s active signal field ON with select"); PrintAndLog(" -ss active signal field ON with select for SRx ST Microelectronics tags"); + PrintAndLog("sample:"); + PrintAndLog(" hf 14b raw -s -c -p 0200a40400"); return 0; } int usage_hf_14b_snoop(void){ PrintAndLog("It get data from the field and saves it into command buffer."); PrintAndLog("Buffer accessible from command 'hf list 14b'"); - PrintAndLog("Usage: hf 14b snoop [-h]"); - PrintAndLog(" -h this help"); - PrintAndLog("sample: hf 14b snoop"); + PrintAndLog("Usage: hf 14b snoop [h]"); + PrintAndLog("Options:"); + PrintAndLog(" h this help"); + PrintAndLog("sample:"); + PrintAndLog(" hf 14b snoop"); return 0; } int usage_hf_14b_sim(void){ - PrintAndLog("Emulating ISO/IEC 14443 type B tag with 4 UID"); - PrintAndLog("Usage: hf 14b sim [-h]"); - PrintAndLog(" -h this help"); - PrintAndLog("sample: hf 14b sim"); + PrintAndLog("Emulating ISO/IEC 14443 type B tag with 4 UID / PUPI"); + PrintAndLog("Usage: hf 14b sim [h] u "); + PrintAndLog("Options:"); + PrintAndLog(" h this help"); + PrintAndLog(" u 4byte UID/PUPI"); + PrintAndLog("sample:"); + PrintAndLog(" hf 14b sim"); + PrintAndLog(" hf 14b sim u 11223344"); return 0; } int usage_hf_14b_read_srx(void){ @@ -59,29 +74,37 @@ int usage_hf_14b_read_srx(void){ PrintAndLog("Options:"); PrintAndLog(" h this help"); PrintAndLog(" <1|2> 1 = SRIX4K , 2 = SRI512"); - PrintAndLog("sample: hf 14b read 1"); - PrintAndLog(" : hf 14b read 2"); + PrintAndLog("sample:"); + PrintAndLog(" hf 14b read 1"); + PrintAndLog(" hf 14b read 2"); return 0; } int usage_hf_14b_write_srx(void){ - PrintAndLog("Usage: hf 14b write <1|2> "); + PrintAndLog("Usage: hf 14b [h] write <1|2> "); PrintAndLog("Options:"); PrintAndLog(" h this help"); PrintAndLog(" <1|2> 1 = SRIX4K , 2 = SRI512"); PrintAndLog(" BLOCK number depends on tag, special block == FF"); PrintAndLog(" hex bytes of data to be written"); - PrintAndLog("sample : hf 14b write 1 7F 11223344"); - PrintAndLog(" : hf 14b write 1 FF 11223344"); - PrintAndLog(" : hf 14b write 2 15 11223344"); - PrintAndLog(" : hf 14b write 2 FF 11223344"); + PrintAndLog("sample:"); + PrintAndLog(" hf 14b write 1 7F 11223344"); + PrintAndLog(" hf 14b write 1 FF 11223344"); + PrintAndLog(" hf 14b write 2 15 11223344"); + PrintAndLog(" hf 14b write 2 FF 11223344"); return 0; } -static int rawClose(){ +static void switch_on_field_14b(void) { + UsbCommand c = {CMD_ISO_14443B_COMMAND, {ISO14B_CONNECT, 0, 0}}; + clearCommandBuffer(); + SendCommand(&c); +} + +static int switch_off_field_14b(void) { UsbCommand c = {CMD_ISO_14443B_COMMAND, {ISO14B_DISCONNECT, 0, 0}}; clearCommandBuffer(); SendCommand(&c); - return 1; + return 0; } int CmdHF14BList(const char *Cmd) { @@ -90,10 +113,15 @@ int CmdHF14BList(const char *Cmd) { } int CmdHF14BSim(const char *Cmd) { - char cmdp = param_getchar(Cmd, 0); + char cmdp = param_getchar(Cmd, 0); if (cmdp == 'h' || cmdp == 'H') return usage_hf_14b_sim(); - UsbCommand c = {CMD_SIMULATE_TAG_ISO_14443B, {0, 0, 0}}; + uint32_t pupi = 0; + if (cmdp == 'u' || cmdp == 'U') { + pupi = param_get32ex(Cmd, 1, 0, 16); + } + + UsbCommand c = {CMD_SIMULATE_TAG_ISO_14443B, {pupi, 0, 0}}; clearCommandBuffer(); SendCommand(&c); return 0; @@ -119,7 +147,7 @@ int CmdHF14BCmdRaw (const char *Cmd) { int i = 0; uint8_t data[USB_CMD_DATA_SIZE] = {0x00}; uint16_t datalen = 0; - uint32_t flags = 0; + uint32_t flags = ISO14B_CONNECT; uint32_t temp = 0; if (strlen(Cmd)<3) return usage_hf_14b_raw(); @@ -148,7 +176,6 @@ int CmdHF14BCmdRaw (const char *Cmd) { break; case 's': case 'S': - flags |= ISO14B_CONNECT; select = TRUE; if (Cmd[i+2]=='s' || Cmd[i+2]=='S') { flags |= ISO14B_SELECT_SR; @@ -236,8 +263,6 @@ static void print_atqb_resp(uint8_t *data, uint8_t cid){ else if (maxFrame == 7) maxFrame = 128; else if (maxFrame == 8) maxFrame = 256; else maxFrame = 257; - - PrintAndLog("Max Frame Size: %u%s bytes",maxFrame, (maxFrame == 257) ? "+ RFU" : ""); @@ -248,7 +273,7 @@ static void print_atqb_resp(uint8_t *data, uint8_t cid){ if ( fwt < 16 ){ uint32_t etus = (32 << fwt); uint32_t fwt_time = (302 << fwt); - PrintAndLog("Frame Wait Integer: %u - %u ETUs | %u µS", fwt, etus, fwt_time); + PrintAndLog("Frame Wait Integer: %u - %u ETUs | %u us", fwt, etus, fwt_time); } else { PrintAndLog("Frame Wait Integer: %u - RFU", fwt); } @@ -377,10 +402,7 @@ bool HF14B_ST_Info(bool verbose){ memcpy(&card, (iso14b_card_select_t *)resp.d.asBytes, sizeof(iso14b_card_select_t)); uint64_t status = resp.arg[0]; - if ( status > 0 ) { - rawClose(); - return FALSE; - } + if ( status > 0 ) return switch_off_field_14b(); //add locking bit information here. uint8_t data[16] = {0x00}; // uint8_t datalen = 2; @@ -403,7 +425,7 @@ bool HF14B_ST_Info(bool verbose){ // if (datalen != resplen || !crc) return rawClose(); //print_ST_Lock_info(data[5]>>2); - rawClose(); + switch_off_field_14b(); return TRUE; } @@ -436,17 +458,17 @@ bool HF14B_ST_Reader(bool verbose){ bool isSuccess = FALSE; + switch_on_field_14b(); + // SRx get and print general info about SRx chip from UID - UsbCommand c = {CMD_ISO_14443B_COMMAND, {ISO14B_CONNECT | ISO14B_SELECT_SR | ISO14B_DISCONNECT, 0, 0}}; + UsbCommand c = {CMD_ISO_14443B_COMMAND, {ISO14B_SELECT_SR, 0, 0}}; clearCommandBuffer(); SendCommand(&c); UsbCommand resp; - if (!WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) { if (verbose) PrintAndLog("timeout while waiting for reply."); return FALSE; } - iso14b_card_select_t card; memcpy(&card, (iso14b_card_select_t *)resp.d.asBytes, sizeof(iso14b_card_select_t)); @@ -472,7 +494,7 @@ bool HF14B_ST_Reader(bool verbose){ break; } - rawClose(); + switch_off_field_14b(); return isSuccess; } @@ -515,7 +537,7 @@ bool HF14B_Std_Reader(bool verbose){ break; } - rawClose(); + switch_off_field_14b(); return isSuccess; } @@ -833,24 +855,28 @@ bool waitCmd(bool verbose) { if (WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) { - status = (resp.arg[0] & 0xFFFF); + status = (resp.arg[0] & 0xFF); if ( status > 0 ) return FALSE; - + len = (resp.arg[1] & 0xFFFF); + memcpy(data, resp.d.asBytes, len); if (verbose) { - - ComputeCrc14443(CRC_14443_B, data, len-2, &b1, &b2); - crc = ( data[len-2] == b1 && data[len-1] == b2); - - PrintAndLog("[LEN %u] %s[%02X %02X] %s", - len, - sprint_hex(data, len-2), - data[len-2], - data[len-1], - (crc) ? "OK" : "FAIL" - ); + if ( len >= 3 ) { + ComputeCrc14443(CRC_14443_B, data, len-2, &b1, &b2); + crc = ( data[len-2] == b1 && data[len-1] == b2); + + PrintAndLog("[LEN %u] %s[%02X %02X] %s", + len, + sprint_hex(data, len-2), + data[len-2], + data[len-1], + (crc) ? "OK" : "FAIL" + ); + } else { + PrintAndLog("[LEN %u] %s", len, sprint_hex(data, len) ); + } } return TRUE; } else {