]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdlfem4x.c
-Fixed a bug in iso14_apdu
[proxmark3-svn] / client / cmdlfem4x.c
index 52d407ab49271ae85221019e801e5fb4c596361b..537712f441dac5aeec4b068ca4ec85b51f5a67a5 100644 (file)
@@ -1,4 +1,16 @@
+//-----------------------------------------------------------------------------
+// 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"
@@ -23,7 +35,7 @@ int CmdEM410xRead(const char *Cmd)
   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 */
@@ -235,16 +247,11 @@ int CmdEM410xSim(const char *Cmd)
  * 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;
 }
 
@@ -269,13 +276,13 @@ int CmdEM410xWatch(const char *Cmd)
  */
 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++)
@@ -392,12 +399,37 @@ int CmdEM4x50Read(const char *Cmd)
   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}
 };
Impressum, Datenschutz