]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdlf.c
Merge pull request #220 from marshmellow42/master
[proxmark3-svn] / client / cmdlf.c
index 22bceda41874d07d960c22083e15934193fcdb59..2e786943e6db6e474cdc263d38ab56032567fafe 100644 (file)
@@ -14,6 +14,7 @@
 #include <limits.h>
 #include "proxmark3.h"
 #include "cmdlf.h"
+#include "lfdemod.h"     // for psk2TOpsk1
 #include "util.h"        // for parsing cli command utils
 #include "ui.h"          // for show graph controls
 #include "graph.h"       // for graph data
 #include "cmdlfpcf7931.h"// for pcf7931 menu
 #include "cmdlfpyramid.h"// for pyramid menu
 #include "cmdlfviking.h" // for viking menu
+#include "cmdlfcotag.h"  // for COTAG menu
 
+bool g_lf_threshold_set = false;
 static int CmdHelp(const char *Cmd);
 
 
 
-int usage_lf_cmdread()
+int usage_lf_cmdread(void)
 {
        PrintAndLog("Usage: lf cmdread d <delay period> z <zero period> o <one period> c <cmdbytes> [H] ");
        PrintAndLog("Options:        ");
@@ -63,7 +66,6 @@ int CmdLFCommandRead(const char *Cmd)
        bool errors = FALSE;
        //uint8_t divisor = 95; //125khz
        uint8_t cmdp = 0;
-       int strLength = 0;
        while(param_getchar(Cmd, cmdp) != 0x00)
        {
                switch(param_getchar(Cmd, cmdp))
@@ -79,7 +81,7 @@ int CmdLFCommandRead(const char *Cmd)
                        cmdp++;
                        break;
                case 'c':
-                       strLength = param_getstr(Cmd, cmdp+1, (char *)&c.d.asBytes);
+                       param_getstr(Cmd, cmdp+1, (char *)&c.d.asBytes);
                        cmdp+=2;
                        break;
                case 'd':
@@ -430,7 +432,7 @@ int CmdIndalaClone(const char *Cmd)
        return 0;
 }
 
-int usage_lf_read()
+int usage_lf_read(void)
 {
        PrintAndLog("Usage: lf read");
        PrintAndLog("Options:        ");
@@ -440,7 +442,7 @@ int usage_lf_read()
        PrintAndLog("Use 'lf config' to set parameters.");
        return 0;
 }
-int usage_lf_snoop()
+int usage_lf_snoop(void)
 {
        PrintAndLog("Usage: lf snoop");
        PrintAndLog("Options:        ");
@@ -450,7 +452,7 @@ int usage_lf_snoop()
        return 0;
 }
 
-int usage_lf_config()
+int usage_lf_config(void)
 {
        PrintAndLog("Usage: lf config [H|<divisor>] [b <bps>] [d <decim>] [a 0|1]");
        PrintAndLog("Options:        ");
@@ -508,7 +510,10 @@ int CmdLFSetConfig(const char *Cmd)
                case 't':
                        errors |= param_getdec(Cmd,cmdp+1,&unsigned_trigg);
                        cmdp+=2;
-                       if(!errors) trigger_threshold = unsigned_trigg;
+                       if(!errors) {
+                               trigger_threshold = unsigned_trigg;
+                               if (trigger_threshold > 0) g_lf_threshold_set = true;
+                       }
                        break;
                case 'b':
                        errors |= param_getdec(Cmd,cmdp+1,&bps);
@@ -555,7 +560,7 @@ int CmdLFSetConfig(const char *Cmd)
 
 int CmdLFRead(const char *Cmd)
 {
-
+       if (offline) return 0;
        uint8_t cmdp = 0;
        bool arg1 = false;
        if (param_getchar(Cmd, cmdp) == 'h')
@@ -567,12 +572,14 @@ int CmdLFRead(const char *Cmd)
        UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {arg1,0,0}};
        clearCommandBuffer();
        SendCommand(&c);
-       //WaitForResponse(CMD_ACK,NULL);        
-       if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {
-               PrintAndLog("command execution time out");
-               return 1;
+       if (g_lf_threshold_set) {
+               WaitForResponse(CMD_ACK,NULL);
+       } else {
+               if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {
+                       PrintAndLog("command execution time out");
+                       return 1;
+               }
        }
-
        return 0;
 }
 
@@ -664,7 +671,7 @@ int usage_lf_simask(void)
        PrintAndLog("       b              sim ask/biphase");
        PrintAndLog("       m              sim ask/manchester - Default");
        PrintAndLog("       r              sim ask/raw");
-       PrintAndLog("       s              TBD- -to enable a gap between playback repetitions - default: no gap");
+       PrintAndLog("       s              add t55xx Sequence Terminator gap - default: no gaps (only manchester)");
        PrintAndLog("       d <hexdata>    Data to sim as hex - omit to sim from DemodBuffer");
        return 0;
 }
@@ -685,7 +692,7 @@ int usage_lf_simpsk(void)
        return 0;
 }
 
-// by marshmellow - sim ask data given clock, fcHigh, fcLow, invert 
+// by marshmellow - sim fsk data given clock, fcHigh, fcLow, invert 
 // - allow pull data from DemodBuffer
 int CmdLFfskSim(const char *Cmd)
 {
@@ -1076,10 +1083,31 @@ int CmdVchDemod(const char *Cmd)
        return 0;
 }
 
+
+//by marshmellow
+int CheckChipType(char cmdp) {
+       uint32_t wordData = 0;
+
+       //check for em4x05/em4x69 chips first
+       save_restoreGB(1);
+       if ((!offline && (cmdp != '1')) && EM4x05Block0Test(&wordData)) {
+               PrintAndLog("\nValid EM4x05/EM4x69 Chip Found\nTry lf em 4x05... commands\n");
+               save_restoreGB(0);
+               return 1;
+       }
+
+       //TODO check for t55xx chip...
+
+       save_restoreGB(0);
+       return 1;
+}
+
 //by marshmellow
 int CmdLFfind(const char *Cmd)
 {
+       uint32_t wordData = 0;
        int ans=0;
+       size_t minLength = 1000;
        char cmdp = param_getchar(Cmd, 0);
        char testRaw = param_getchar(Cmd, 1);
        if (strlen(Cmd) > 3 || cmdp == 'h' || cmdp == 'H') {
@@ -1098,7 +1126,7 @@ int CmdLFfind(const char *Cmd)
        if (!offline && (cmdp != '1')){
                CmdLFRead("s");
                getSamples("30000",false);
-       } else if (GraphTraceLen < 1000) {
+       } else if (GraphTraceLen < minLength) {
                PrintAndLog("Data in Graphbuffer was too small.");
                return 0;
        }
@@ -1108,52 +1136,75 @@ int CmdLFfind(const char *Cmd)
        PrintAndLog("False Positives ARE possible\n");  
        PrintAndLog("\nChecking for known tags:\n");
 
+       size_t testLen = minLength;
+       // only run if graphbuffer is just noise as it should be for hitag/cotag
+       if (graphJustNoise(GraphBuffer, testLen)) {
+               // only run these tests if we are in online mode 
+               if (!offline && (cmdp != '1')) {
+                       // test for em4x05 in reader talk first mode.
+                       if (EM4x05Block0Test(&wordData)) {
+                               PrintAndLog("\nValid EM4x05/EM4x69 Chip Found\nUse lf em 4x05readword/dump commands to read\n");
+                               return 1;
+                       }
+                       ans=CmdLFHitagReader("26");
+                       if (ans==0) {
+                               return 1;
+                       }
+                       ans=CmdCOTAGRead("");
+                       if (ans>0){
+                               PrintAndLog("\nValid COTAG ID Found!");
+                               return 1;
+                       }
+               }
+               return 0;
+       }
+
        ans=CmdFSKdemodIO("");
        if (ans>0) {
                PrintAndLog("\nValid IO Prox ID Found!");
-               return 1;
+               return CheckChipType(cmdp);
        }
 
        ans=CmdFSKdemodPyramid("");
        if (ans>0) {
                PrintAndLog("\nValid Pyramid ID Found!");
-               return 1;
+               return CheckChipType(cmdp);
        }
 
        ans=CmdFSKdemodParadox("");
        if (ans>0) {
                PrintAndLog("\nValid Paradox ID Found!");
-               return 1;
+               return CheckChipType(cmdp);
        }
 
        ans=CmdFSKdemodAWID("");
        if (ans>0) {
                PrintAndLog("\nValid AWID ID Found!");
-               return 1;
+               return CheckChipType(cmdp);
        }
 
        ans=CmdFSKdemodHID("");
        if (ans>0) {
                PrintAndLog("\nValid HID Prox ID Found!");
-               return 1;
+               return CheckChipType(cmdp);
        }
 
        ans=CmdAskEM410xDemod("");
        if (ans>0) {
                PrintAndLog("\nValid EM410x ID Found!");
-               return 1;
+               return CheckChipType(cmdp);
        }
 
        ans=CmdG_Prox_II_Demod("");
        if (ans>0) {
                PrintAndLog("\nValid G Prox II ID Found!");
-               return 1;
+               return CheckChipType(cmdp);
        }
 
        ans=CmdFDXBdemodBI("");
        if (ans>0) {
                PrintAndLog("\nValid FDX-B ID Found!");
-               return 1;
+               return CheckChipType(cmdp);
        }
 
        ans=EM4x50Read("", false);
@@ -1165,24 +1216,25 @@ int CmdLFfind(const char *Cmd)
        ans=CmdVikingDemod("");
        if (ans>0) {
                PrintAndLog("\nValid Viking ID Found!");
-               return 1;
+               return CheckChipType(cmdp);
        }       
 
        ans=CmdIndalaDecode("");
        if (ans>0) {
                PrintAndLog("\nValid Indala ID Found!");
-               return 1;
+               return CheckChipType(cmdp);
        }
 
        ans=CmdPSKNexWatch("");
        if (ans>0) {
                PrintAndLog("\nValid NexWatch ID Found!");
-               return 1;
+               return CheckChipType(cmdp);
        }
 
        PrintAndLog("\nNo Known Tags Found!\n");
        if (testRaw=='u' || testRaw=='U'){
-               //test unknown tag formats (raw mode)
+               ans=CheckChipType(cmdp);
+               //test unknown tag formats (raw mode)0
                PrintAndLog("\nChecking for Unknown tags:\n");
                ans=AutoCorrelate(4000, FALSE, FALSE);
                if (ans > 0) PrintAndLog("Possible Auto Correlation of %d repeating samples",ans);
@@ -1217,7 +1269,8 @@ static command_t CommandTable[] =
 {
        {"help",        CmdHelp,            1, "This help"},
        {"awid",        CmdLFAWID,          1, "{ AWID RFIDs...    }"},
-       {"em4x",        CmdLFEM4X,          1, "{ EM4X RFIDs...    }"},
+       {"cotag",       CmdLFCOTAG,         1, "{ COTAG RFIDs...   }"},
+       {"em",          CmdLFEM4X,          1, "{ EM4X RFIDs...    }"},
        {"hid",         CmdLFHID,           1, "{ HID RFIDs...     }"},
        {"hitag",       CmdLFHitag,         1, "{ Hitag tags and transponders... }"},
        {"io",          CmdLFIO,            1, "{ ioProx tags...   }"},
Impressum, Datenschutz