+//-----------------------------------------------------------------------------
+// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>
+//
+// This code is licensed to you under the terms of the GNU GPL, version 2 or,
+// at your option, any later version. See the LICENSE.txt file for the text of
+// the license.
+//-----------------------------------------------------------------------------
+// Low frequency EM4x commands
+//-----------------------------------------------------------------------------
+
#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
#include "proxusb.h"
#include "ui.h"
#include "graph.h"
int parity[4];
char id[11];
int retested = 0;
- int BitStream[MAX_GRAPH_TRACE_LEN];
+ uint8_t BitStream[MAX_GRAPH_TRACE_LEN];
high = low = 0;
/* Detect high and lows and clock */
* looped until an EM410x tag is detected */
int CmdEM410xWatch(const char *Cmd)
{
- char *zero = "";
- char *twok = "2000";
-
- int stop = 0;
do
{
- CmdLFRead(zero);
- CmdLFSamples(twok);
- stop = CmdEM410xRead(zero);
- } while (!stop);
+ CmdLFRead("");
+ CmdSamples("2000");
+ } while ( ! CmdEM410xRead(""));
return 0;
}
*/
int CmdEM4x50Read(const char *Cmd)
{
- int i, j, startblock, clock, skip, block, start, end, low, high;
+ int i, j, startblock, skip, block, start, end, low, high;
bool complete= false;
int tmpbuff[MAX_GRAPH_TRACE_LEN / 64];
char tmp[6];
high= low= 0;
- clock= 64;
+ memset(tmpbuff, 0, MAX_GRAPH_TRACE_LEN / 64);
/* first get high and low values */
for (i = 0; i < GraphTraceLen; i++)
return 0;
}
-static command_t CommandTable[] =
+int CmdEM410xWrite(const char *Cmd)
+{
+ uint64_t id = 0;
+ unsigned int card;
+
+ sscanf(Cmd, "%" PRIx64 " %d", &id, &card);
+
+ if (id >= 0x10000000000) {
+ PrintAndLog("Error! Given EM410x ID is longer than 40 bits.\n");
+ return 0;
+ }
+
+ if (card > 1) {
+ PrintAndLog("Error! Bad card type selected.\n");
+ return 0;
+ }
+
+ PrintAndLog("Writing %s tag with UID 0x%010" PRIx64, card ? "T55x7":"T5555", id);
+ UsbCommand c = {CMD_EM410X_WRITE_TAG, {card, (uint32_t)(id >> 32), (uint32_t)id}};
+ SendCommand(&c);
+
+ return 0;
+}
+
+static command_t CommandTable[] =
{
{"help", CmdHelp, 1, "This help"},
{"em410xread", CmdEM410xRead, 1, "[clock rate] -- Extract ID from EM410x tag"},
{"em410xsim", CmdEM410xSim, 0, "<UID> -- Simulate EM410x tag"},
{"em410xwatch", CmdEM410xWatch, 0, "Watches for EM410x tags"},
+ {"em410xwrite", CmdEM410xWrite, 1, "<UID> <'0' T5555> <'1' T55x7> -- Write EM410x UID to T5555(Q5) or T55x7 tag"},
{"em4x50read", CmdEM4x50Read, 1, "Extract data from EM4x50 tag"},
{NULL, NULL, 0, NULL}
};