X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/18b90cce48df64bf528fe358308383bf8b5fba15..49065576ad662e62bce39172ead3f8e392c87fef:/client/cmdhf14b.c diff --git a/client/cmdhf14b.c b/client/cmdhf14b.c index cb93b1fc..471ac0f3 100644 --- a/client/cmdhf14b.c +++ b/client/cmdhf14b.c @@ -8,10 +8,6 @@ // High frequency ISO14443B commands //----------------------------------------------------------------------------- -#include -#include -#include -#include #include "cmdhf14b.h" #define TIMEOUT 2000 @@ -59,12 +55,14 @@ int usage_hf_14b_snoop(void){ 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("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){ @@ -111,10 +109,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; @@ -132,18 +135,15 @@ int CmdHF14BSnoop(const char *Cmd) { } int CmdHF14BCmdRaw (const char *Cmd) { - bool reply = TRUE; - bool power = FALSE; - bool select = FALSE; - char buf[5]=""; - + bool reply = TRUE, power = FALSE, select = FALSE; + char buf[5] = ""; int i = 0; uint8_t data[USB_CMD_DATA_SIZE] = {0x00}; uint16_t datalen = 0; uint32_t flags = ISO14B_CONNECT; uint32_t temp = 0; - if (strlen(Cmd)<3) return usage_hf_14b_raw(); + if ( strlen(Cmd) < 3 ) return usage_hf_14b_raw(); // strip while (*Cmd==' ' || *Cmd=='\t') ++Cmd; @@ -152,8 +152,8 @@ int CmdHF14BCmdRaw (const char *Cmd) { if (Cmd[i]==' ' || Cmd[i]=='\t') { ++i; continue; } if (Cmd[i]=='-') { switch (Cmd[i+1]) { - case 'H': case 'h': + case 'H': return usage_hf_14b_raw(); case 'r': case 'R': @@ -202,10 +202,10 @@ int CmdHF14BCmdRaw (const char *Cmd) { return 0; } - if(!power) + if (!power) flags |= ISO14B_DISCONNECT; - if(datalen>0) + if (datalen>0) flags |= ISO14B_RAW; // Max buffer is USB_CMD_DATA_SIZE @@ -220,11 +220,11 @@ int CmdHF14BCmdRaw (const char *Cmd) { bool success = TRUE; // get back iso14b_card_select_t, don't print it. - if(select) + if (select) success = waitCmd(FALSE); // get back response from the raw bytes you sent. - if(success && datalen>0) waitCmd(TRUE); + if (success && datalen>0) waitCmd(TRUE); return 1; } @@ -249,7 +249,7 @@ static void print_atqb_resp(uint8_t *data, uint8_t cid){ if (BitRate & 0x04) PrintAndLog(" Bit Rate: 847 kbit/s PICC <- PCD supported"); if (BitRate & 0x80) PrintAndLog(" Same bit rate <-> required"); - uint16_t maxFrame = data[5]>>4; + uint16_t maxFrame = data[5] >> 4; if (maxFrame < 5) maxFrame = 8 * maxFrame + 16; else if (maxFrame == 5) maxFrame = 64; else if (maxFrame == 6) maxFrame = 96; @@ -257,7 +257,7 @@ static void print_atqb_resp(uint8_t *data, uint8_t cid){ else if (maxFrame == 8) maxFrame = 256; else maxFrame = 257; - PrintAndLog("Max Frame Size: %u%s bytes",maxFrame, (maxFrame == 257) ? "+ RFU" : ""); + PrintAndLog("Max Frame Size: %u%s bytes", maxFrame, (maxFrame == 257) ? "+ RFU" : ""); uint8_t protocolT = data[5] & 0xF; PrintAndLog(" Protocol Type: Protocol is %scompliant with ISO/IEC 14443-4",(protocolT) ? "" : "not " ); @@ -697,7 +697,7 @@ int CmdHF14BWriteSri(const char *Cmd){ ); } - sprintf(str, "-ss -c %02x %02x %02x%02x%02x%02x", ISO14443B_WRITE_BLK, blockno, data[0], data[1], data[2], data[3]); + sprintf(str, "-ss -c %02x %02x %02x %02x %02x %02x", ISO14443B_WRITE_BLK, blockno, data[0], data[1], data[2], data[3]); CmdHF14BCmdRaw(str); return 0; } @@ -802,41 +802,6 @@ int srix4kValid(const char *Cmd){ return 0; } -int CmdteaSelfTest(const char *Cmd){ - - uint8_t v[8], v_le[8]; - memset(v, 0x00, sizeof(v)); - memset(v_le, 0x00, sizeof(v_le)); - uint8_t* v_ptr = v_le; - - uint8_t cmdlen = strlen(Cmd); - cmdlen = ( sizeof(v)<<2 < cmdlen ) ? sizeof(v)<<2 : cmdlen; - - if ( param_gethex(Cmd, 0, v, cmdlen) > 0 ){ - PrintAndLog("can't read hex chars, uneven? :: %u", cmdlen); - return 1; - } - - SwapEndian64ex(v , 8, 4, v_ptr); - - // ENCRYPTION KEY: - uint8_t key[16] = {0x55,0xFE,0xF6,0x30,0x62,0xBF,0x0B,0xC1,0xC9,0xB3,0x7C,0x34,0x97,0x3E,0x29,0xFB }; - uint8_t keyle[16]; - uint8_t* key_ptr = keyle; - SwapEndian64ex(key , sizeof(key), 4, key_ptr); - - PrintAndLog("TEST LE enc| %s", sprint_hex(v_ptr, 8)); - - tea_decrypt(v_ptr, key_ptr); - PrintAndLog("TEST LE dec | %s", sprint_hex_ascii(v_ptr, 8)); - - tea_encrypt(v_ptr, key_ptr); - tea_encrypt(v_ptr, key_ptr); - PrintAndLog("TEST enc2 | %s", sprint_hex_ascii(v_ptr, 8)); - - return 0; -} - bool waitCmd(bool verbose) { bool crc = FALSE; @@ -848,24 +813,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 { @@ -885,7 +854,6 @@ static command_t CommandTable[] = { {"sriread", CmdHF14BReadSri, 0, "Read contents of a SRI512 | SRIX4K tag"}, {"sriwrite", CmdHF14BWriteSri, 0, "Write data to a SRI512 | SRIX4K tag"}, //{"valid", srix4kValid, 1, "srix4k checksum test"}, - //{"valid", CmdteaSelfTest, 1, "tea test"}, {NULL, NULL, 0, NULL} };