X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/fb2d24882e31c4a9915a87e28081c3f7d6f3bea4..efbf81da52dad2507cca6062d44272c397f93e4a:/client/cmdlfem4x.c diff --git a/client/cmdlfem4x.c b/client/cmdlfem4x.c index c167f456..02af547a 100644 --- a/client/cmdlfem4x.c +++ b/client/cmdlfem4x.c @@ -11,16 +11,9 @@ #include #include #include -#include "proxmark3.h" -#include "ui.h" -#include "util.h" -#include "graph.h" -#include "cmdparser.h" -#include "cmddata.h" -#include "cmdlf.h" #include "cmdlfem4x.h" -#include "lfdemod.h" -char *global_em410xId; + +uint64_t g_em410xid = 0; static int CmdHelp(const char *Cmd); @@ -54,10 +47,7 @@ int CmdEM410xRead(const char *Cmd) PrintAndLog ("EM410x XL pattern found"); return 0; } - char id[12] = {0x00}; - sprintf(id, "%010llx",lo); - - global_em410xId = id; + g_em410xid = lo; return 1; } @@ -65,67 +55,66 @@ int CmdEM410xRead(const char *Cmd) int CmdEM410xSim(const char *Cmd) { int i, n, j, binary[4], parity[4]; - - char cmdp = param_getchar(Cmd, 0); uint8_t uid[5] = {0x00}; + char cmdp = param_getchar(Cmd, 0); if (cmdp == 'h' || cmdp == 'H') { - PrintAndLog("Usage: lf em4x em410xsim "); + PrintAndLog("Usage: lf em4x em410xsim "); PrintAndLog(""); PrintAndLog(" sample: lf em4x em410xsim 0F0368568B"); return 0; } + /* clock is 64 in EM410x tags */ + uint8_t clock = 64; if (param_gethex(Cmd, 0, uid, 10)) { PrintAndLog("UID must include 10 HEX symbols"); return 0; } + param_getdec(Cmd, 1, &clock); - PrintAndLog("Starting simulating UID %02X%02X%02X%02X%02X", uid[0],uid[1],uid[2],uid[3],uid[4]); + PrintAndLog("Starting simulating UID %02X%02X%02X%02X%02X clock: %d", uid[0],uid[1],uid[2],uid[3],uid[4],clock); PrintAndLog("Press pm3-button to about simulation"); - /* clock is 64 in EM410x tags */ - int clock = 64; - /* clear our graph */ ClearGraph(0); - /* write 9 start bits */ - for (i = 0; i < 9; i++) - AppendGraph(0, clock, 1); - - /* for each hex char */ - parity[0] = parity[1] = parity[2] = parity[3] = 0; - for (i = 0; i < 10; i++) - { - /* read each hex char */ - sscanf(&Cmd[i], "%1x", &n); - for (j = 3; j >= 0; j--, n/= 2) - binary[j] = n % 2; - - /* append each bit */ - AppendGraph(0, clock, binary[0]); - AppendGraph(0, clock, binary[1]); - AppendGraph(0, clock, binary[2]); - AppendGraph(0, clock, binary[3]); - - /* append parity bit */ - AppendGraph(0, clock, binary[0] ^ binary[1] ^ binary[2] ^ binary[3]); - - /* keep track of column parity */ - parity[0] ^= binary[0]; - parity[1] ^= binary[1]; - parity[2] ^= binary[2]; - parity[3] ^= binary[3]; - } + /* write 9 start bits */ + for (i = 0; i < 9; i++) + AppendGraph(0, clock, 1); - /* parity columns */ - AppendGraph(0, clock, parity[0]); - AppendGraph(0, clock, parity[1]); - AppendGraph(0, clock, parity[2]); - AppendGraph(0, clock, parity[3]); + /* for each hex char */ + parity[0] = parity[1] = parity[2] = parity[3] = 0; + for (i = 0; i < 10; i++) + { + /* read each hex char */ + sscanf(&Cmd[i], "%1x", &n); + for (j = 3; j >= 0; j--, n/= 2) + binary[j] = n % 2; + + /* append each bit */ + AppendGraph(0, clock, binary[0]); + AppendGraph(0, clock, binary[1]); + AppendGraph(0, clock, binary[2]); + AppendGraph(0, clock, binary[3]); + + /* append parity bit */ + AppendGraph(0, clock, binary[0] ^ binary[1] ^ binary[2] ^ binary[3]); + + /* keep track of column parity */ + parity[0] ^= binary[0]; + parity[1] ^= binary[1]; + parity[2] ^= binary[2]; + parity[3] ^= binary[3]; + } - /* stop bit */ + /* parity columns */ + AppendGraph(0, clock, parity[0]); + AppendGraph(0, clock, parity[1]); + AppendGraph(0, clock, parity[2]); + AppendGraph(0, clock, parity[3]); + + /* stop bit */ AppendGraph(1, clock, 0); CmdLFSim("0"); //240 start_gap. @@ -157,10 +146,12 @@ int CmdEM410xWatch(const char *Cmd) } //currently only supports manchester modulations +// todo: helptext int CmdEM410xWatchnSpoof(const char *Cmd) { + // loops if the captured ID was in XL-format. CmdEM410xWatch(Cmd); - PrintAndLog("# Replaying captured ID: %s",global_em410xId); + PrintAndLog("# Replaying captured ID: %llu", g_em410xid); CmdLFaskSim(""); return 0; } @@ -169,7 +160,7 @@ int CmdEM410xWrite(const char *Cmd) { uint64_t id = 0xFFFFFFFFFFFFFFFF; // invalid id value int card = 0xFF; // invalid card value - unsigned int clock = 0; // invalid clock value + uint32_t clock = 0; // invalid clock value sscanf(Cmd, "%" PRIx64 " %d %d", &id, &card, &clock); @@ -194,21 +185,13 @@ int CmdEM410xWrite(const char *Cmd) } // Check Clock - if (card == 1) - { // Default: 64 - if (clock == 0) - clock = 64; + if (clock == 0) + clock = 64; - // Allowed clock rates: 16, 32 and 64 - if ((clock != 16) && (clock != 32) && (clock != 64)) { - PrintAndLog("Error! Clock rate %d not valid. Supported clock rates are 16, 32 and 64.\n", clock); - return 0; - } - } - else if (clock != 0) - { - PrintAndLog("Error! Clock rate is only supported on T55x7 tags.\n"); + // Allowed clock rates: 16, 32, 40 and 64 + if ((clock != 16) && (clock != 32) && (clock != 64) && (clock != 40)) { + PrintAndLog("Error! Clock rate %d not valid. Supported clock rates are 16, 32, 40 and 64.\n", clock); return 0; } @@ -218,18 +201,17 @@ int CmdEM410xWrite(const char *Cmd) // provide for backwards-compatibility for older firmware, and to avoid // having to add another argument to CMD_EM410X_WRITE_TAG, we just store // the clock rate in bits 8-15 of the card value - card = (card & 0xFF) | (((uint64_t)clock << 8) & 0xFF00); - } - else if (card == 0) + card = (card & 0xFF) | ((clock << 8) & 0xFF00); + } else if (card == 0) { PrintAndLog("Writing %s tag with UID 0x%010" PRIx64, "T5555", id, clock); - else { + card = (card & 0xFF) | ((clock << 8) & 0xFF00); + } else { PrintAndLog("Error! Bad card type selected.\n"); return 0; } UsbCommand c = {CMD_EM410X_WRITE_TAG, {card, (uint32_t)(id >> 32), (uint32_t)id}}; SendCommand(&c); - return 0; } @@ -617,14 +599,13 @@ static command_t CommandTable[] = {NULL, NULL, 0, NULL} }; -int CmdLFEM4X(const char *Cmd) -{ +int CmdLFEM4X(const char *Cmd) { + clearCommandBuffer(); CmdsParse(CommandTable, Cmd); return 0; } -int CmdHelp(const char *Cmd) -{ +int CmdHelp(const char *Cmd) { CmdsHelp(CommandTable); return 0; }