Paradox clone functionality implemented (#747)
[proxmark3-svn] / client / cmdlfparadox.c
index 5225820b4b4590f53c95670fa2bd82f450f7d7f1..d6710219ced94356a054b96d644df8ffc119b361 100644 (file)
@@ -5,6 +5,7 @@
 // the license.
 //-----------------------------------------------------------------------------
 // Low frequency Paradox tag commands
+// FSK2a, rf/50, 96 bits (completely known)
 //-----------------------------------------------------------------------------
 #include <stdio.h>
 #include <string.h>
 #include "cmddata.h"
 #include "cmdlf.h"
 #include "lfdemod.h"
+#include "comms.h"
+// This card type is similar to HID, so we include the utils from there
+#include "cmdlfhid.h"
+#include "hidcardformats.h"
+#include "hidcardformatutils.h"
+
 static int CmdHelp(const char *Cmd);
+void ParadoxWrite(hidproxmessage_t *packed);
 
 //by marshmellow
 //Paradox Prox demod - FSK RF/50 with preamble of 00001111 (then manchester encoded)
@@ -31,8 +39,9 @@ int CmdFSKdemodParadox(const char *Cmd)
        uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
        size_t BitLen = getFromGraphBuf(BitStream);
        if (BitLen==0) return 0;
+       int waveIdx=0;
        //get binary from fsk wave
-       int idx = ParadoxdemodFSK(BitStream,&BitLen,&hi2,&hi,&lo);
+       int idx = ParadoxdemodFSK(BitStream,&BitLen,&hi2,&hi,&lo,&waveIdx);
        if (idx<0){
                if (g_debugMode){
                        if (idx==-1){
@@ -53,15 +62,26 @@ int CmdFSKdemodParadox(const char *Cmd)
                if (g_debugMode) PrintAndLog("DEBUG: Error - no value found");
                return 0;
        }
+
        uint32_t fc = ((hi & 0x3)<<6) | (lo>>26);
        uint32_t cardnum = (lo>>10)&0xFFFF;
        uint32_t rawLo = bytebits_to_byte(BitStream+idx+64,32);
        uint32_t rawHi = bytebits_to_byte(BitStream+idx+32,32);
        uint32_t rawHi2 = bytebits_to_byte(BitStream+idx,32);
 
-       PrintAndLog("Paradox TAG ID: %x%08x - FC: %d - Card: %d - Checksum: %02x - RAW: %08x%08x%08x",
-               hi>>10, (hi & 0x3)<<26 | (lo>>10), fc, cardnum, (lo>>2) & 0xFF, rawHi2, rawHi, rawLo);
+       // Steal the HID parsing to output a "full" ID we can send to the HID cloning function
+       hidproxmessage_t packed = initialize_proxmessage_object(hi2, hi, lo);
+
+       if (packed.top != 0) {
+               PrintAndLog("Paradox TAG ID: %x%08x (Full ID: %x%08x%08x) - FC: %d - Card: %d - Checksum: %02x - RAW: %08x%08x%08x",
+                       hi>>10, (hi & 0x3)<<26 | (lo>>10), (uint32_t)packed.top, (uint32_t)packed.mid, (uint32_t)packed.bot, fc, cardnum, (lo>>2) & 0xFF, rawHi2, rawHi, rawLo);
+       } else {
+               PrintAndLog("Paradox TAG ID: %x%08x (Full ID: %x%08x) - FC: %d - Card: %d - Checksum: %02x - RAW: %08x%08x%08x",
+                       hi>>10, (hi & 0x3)<<26 | (lo>>10), (uint32_t)packed.mid, (uint32_t)packed.bot, fc, cardnum, (lo>>2) & 0xFF, rawHi2, rawHi, rawLo);
+
+       }
        setDemodBuf(BitStream,BitLen,idx);
+       setClockGrid(50, waveIdx + (idx*50));
        if (g_debugMode){ 
                PrintAndLog("DEBUG: idx: %d, len: %d, Printing Demod Buffer:", idx, BitLen);
                printDemodBuff();
@@ -72,17 +92,36 @@ int CmdFSKdemodParadox(const char *Cmd)
 //see ASKDemod for what args are accepted
 int CmdParadoxRead(const char *Cmd) {
        // read lf silently
-       CmdLFRead("s");
-       // get samples silently
-       getSamples("10000",false);
+       lf_read(true, 10000);
        // demod and output viking ID   
        return CmdFSKdemodParadox(Cmd);
 }
 
+int CmdParadoxClone(const char *Cmd)
+{
+       unsigned int top = 0, mid = 0, bot = 0;
+       hid_hexstring_to_int96(&top, &mid, &bot, Cmd);
+       hidproxmessage_t packed = initialize_proxmessage_object(top, mid, bot);
+       ParadoxWrite(&packed);
+       return 0;
+}
+
+void ParadoxWrite(hidproxmessage_t *packed){
+       UsbCommand c;
+       c.d.asBytes[0] = (packed->top != 0 && ((packed->mid & 0xFFFFFFC0) != 0))
+       ? 1 : 0; // Writing long format?
+       c.cmd = CMD_PARADOX_CLONE_TAG;
+       c.arg[0] = (packed->top & 0x000FFFFF);
+       c.arg[1] = packed->mid;
+       c.arg[2] = packed->bot;
+       SendCommand(&c);
+}
+
 static command_t CommandTable[] = {
        {"help",  CmdHelp,            1, "This help"},
        {"demod", CmdFSKdemodParadox, 1, "Demodulate a Paradox FSK tag from the GraphBuffer"},
        {"read",  CmdParadoxRead,     0, "Attempt to read and Extract tag data from the antenna"},
+       {"clone", CmdParadoxClone,    0, "<ID> -- Clone Paradox to T55x7 (tag must be in antenna)"},
        {NULL, NULL, 0, NULL}
 };
 
Impressum, Datenschutz