#include "cmdlfem4x.h"
#include "util.h"
#include "data.h"
+#define LF_TRACE_BUFF_SIZE 12000
char *global_em410xId;
return 0;
}
-/* Function is equivalent of loread + losamples + em410xread
- * looped until an EM410x tag is detected */
+/* Function is equivalent of lf read + data samples + em410xread
+ * looped until an EM410x tag is detected
+ *
+ * Why is CmdSamples("16000")?
+ * TBD: Auto-grow sample size based on detected sample rate. IE: If the
+ * rate gets lower, then grow the number of samples
+ * Changed by martin, 4000 x 4 = 16000,
+ * see http://www.proxmark.org/forum/viewtopic.php?pid=7235#p7235
+
+*/
int CmdEM410xWatch(const char *Cmd)
{
- int read_h = (*Cmd == 'h');
- //char k;
- do
- {
- CmdLFRead(read_h ? "h" : "");
- // 2000 samples is OK for clock=64, but not clock=32. Probably want
- // 8000 for clock=16. Don't want to go too high since old HID driver
- // is very slow
- // TBD: Auto-grow sample size based on detected sample rate. IE: If the
- // rate gets lower, then grow the number of samples
-
- // Changed by martin, 4000 x 4 = 16000,
- // see http://www.proxmark.org/forum/viewtopic.php?pid=7235#p7235
- CmdSamples("16000");
- } while (
+ int read_h = (*Cmd == 'h');
+ do
+ {
+ CmdLFRead(read_h ? "h" : "");
+ CmdSamples("16000");
+ } while (
!CmdEM410xRead("")
);
- return 0;
+ return 0;
}
int CmdEM410xWatchnSpoof(const char *Cmd)
{
- int read_h = (*Cmd == 'h');
- do
- {
- CmdLFRead(read_h ? "h" : "");
- CmdSamples("16000");
- } while ( ! CmdEM410xRead(""));
+ CmdEM410xWatch(Cmd);
PrintAndLog("# Replaying : %s",global_em410xId);
CmdEM410xSim(global_em410xId);
return 0;
int CmdReadWord(const char *Cmd)
{
int Word = -1; //default to invalid word
- UsbCommand c;
+ UsbCommand c;
- sscanf(Cmd, "%d", &Word);
+ sscanf(Cmd, "%d", &Word);
if ( (Word > 15) | (Word < 0) ) {
- PrintAndLog("Word must be between 0 and 15");
- return 1;
- }
+ PrintAndLog("Word must be between 0 and 15");
+ return 1;
+ }
- PrintAndLog("Reading word %d", Word);
+ PrintAndLog("Reading word %d", Word);
- c.cmd = CMD_EM4X_READ_WORD;
- c.d.asBytes[0] = 0x0; //Normal mode
- c.arg[0] = 0;
- c.arg[1] = Word;
- c.arg[2] = 0;
- SendCommand(&c);
+ c.cmd = CMD_EM4X_READ_WORD;
+ c.d.asBytes[0] = 0x0; //Normal mode
+ c.arg[0] = 0;
+ c.arg[1] = Word;
+ c.arg[2] = 0;
+ SendCommand(&c);
WaitForResponse(CMD_ACK, NULL);
- size_t bytelength = 4096;
- uint8_t data[bytelength];
- memset(data, 0x00, bytelength);
+ uint8_t data[LF_TRACE_BUFF_SIZE] = {0x00};
- GetFromBigBuf(data,bytelength,3560); //3560 -- should be offset..
+ GetFromBigBuf(data,LF_TRACE_BUFF_SIZE,3560); //3560 -- should be offset..
WaitForResponseTimeout(CMD_ACK,NULL, 1500);
- for (int j = 0; j < bytelength; j++) {
- GraphBuffer[j] = ((int)data[j]) - 128;
+ for (int j = 0; j < LF_TRACE_BUFF_SIZE; j++) {
+ GraphBuffer[j] = ((int)data[j]);
}
- GraphTraceLen = bytelength;
- RepaintGraphWindow();
-
- manchester_decode(data, bytelength);
-
- free(data);
+ GraphTraceLen = LF_TRACE_BUFF_SIZE;
+ uint8_t bits[1000] = {0x00};
+ uint8_t * bitstream = bits;
+ manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
+ RepaintGraphWindow();
return 0;
}
int CmdReadWordPWD(const char *Cmd)
{
int Word = -1; //default to invalid word
- int Password = 0xFFFFFFFF; //default to blank password
- UsbCommand c;
-
- sscanf(Cmd, "%d %x", &Word, &Password);
-
+ int Password = 0xFFFFFFFF; //default to blank password
+ UsbCommand c;
+
+ sscanf(Cmd, "%d %x", &Word, &Password);
+
if ( (Word > 15) | (Word < 0) ) {
- PrintAndLog("Word must be between 0 and 15");
- return 1;
- }
-
- PrintAndLog("Reading word %d with password %08X", Word, Password);
+ PrintAndLog("Word must be between 0 and 15");
+ return 1;
+ }
- c.cmd = CMD_EM4X_READ_WORD;
- c.d.asBytes[0] = 0x1; //Password mode
- c.arg[0] = 0;
- c.arg[1] = Word;
- c.arg[2] = Password;
- SendCommand(&c);
+ PrintAndLog("Reading word %d with password %08X", Word, Password);
+
+ c.cmd = CMD_EM4X_READ_WORD;
+ c.d.asBytes[0] = 0x1; //Password mode
+ c.arg[0] = 0;
+ c.arg[1] = Word;
+ c.arg[2] = Password;
+ SendCommand(&c);
WaitForResponse(CMD_ACK, NULL);
+
+ uint8_t data[LF_TRACE_BUFF_SIZE] = {0x00};
- size_t bytelength = 4096;
- uint8_t data[bytelength];
- memset(data, 0x00, bytelength);
-
- GetFromBigBuf(data,bytelength,3560); //3560 -- should be offset..
+ GetFromBigBuf(data,LF_TRACE_BUFF_SIZE,3560); //3560 -- should be offset..
WaitForResponseTimeout(CMD_ACK,NULL, 1500);
- for (int j = 0; j < bytelength; j++) {
- GraphBuffer[j] = ((int)data[j]) - 128;
+ for (int j = 0; j < LF_TRACE_BUFF_SIZE; j++) {
+ GraphBuffer[j] = ((int)data[j]);
}
- GraphTraceLen = bytelength;
+ GraphTraceLen = LF_TRACE_BUFF_SIZE;
+
+ uint8_t bits[1000] = {0x00};
+ uint8_t * bitstream = bits;
+
+ manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
RepaintGraphWindow();
-
- manchester_decode(data, bytelength);
-
- free(data);
return 0;
}
return 0;
}
-
-
static command_t CommandTable[] =
{
{"help", CmdHelp, 1, "This help"},
- {"410read", CmdEM410xRead, 1, "[clock rate] -- Extract ID from EM410x tag"},
- {"410sim", CmdEM410xSim, 0, "<UID> -- Simulate EM410x tag"},
- {"410watch", CmdEM410xWatch, 0, "['h'] -- Watches for EM410x 125/134 kHz tags (option 'h' for 134)"},
- {"410spoof", CmdEM410xWatchnSpoof, 0, "['h'] --- Watches for EM410x 125/134 kHz tags, and replays them. (option 'h' for 134)" },
- {"410write", CmdEM410xWrite, 1, "<UID> <'0' T5555> <'1' T55x7> [clock rate] -- Write EM410x UID to T5555(Q5) or T55x7 tag, optionally setting clock rate"},
- {"4xread", CmdEM4x50Read, 1, "Extract data from EM4x50 tag"},
+ {"410xread", CmdEM410xRead, 1, "[clock rate] -- Extract ID from EM410x tag"},
+ {"410xsim", CmdEM410xSim, 0, "<UID> -- Simulate EM410x tag"},
+ {"410xwatch", CmdEM410xWatch, 0, "['h'] -- Watches for EM410x 125/134 kHz tags (option 'h' for 134)"},
+ {"410xspoof", CmdEM410xWatchnSpoof, 0, "['h'] --- Watches for EM410x 125/134 kHz tags, and replays them. (option 'h' for 134)" },
+ {"410xwrite", CmdEM410xWrite, 1, "<UID> <'0' T5555> <'1' T55x7> [clock rate] -- Write EM410x UID to T5555(Q5) or T55x7 tag, optionally setting clock rate"},
+ {"4x50read", CmdEM4x50Read, 1, "Extract data from EM4x50 tag"},
{"rd", CmdReadWord, 1, "<Word 1-15> -- Read EM4xxx word data"},
{"rdpwd", CmdReadWordPWD, 1, "<Word 1-15> <Password> -- Read EM4xxx word data in password mode "},
{"wr", CmdWriteWord, 1, "<Data> <Word 1-15> -- Write EM4xxx word data"},