]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmddata.c
Merge pull request #12 from k02a/patch-1
[proxmark3-svn] / client / cmddata.c
index 967fa28f2655e02aeb19b9994b81f730062cf42f..6570b24370d2796ef71f63ff05791adc81a8c371 100644 (file)
@@ -8,23 +8,22 @@
 // Data and Graph commands
 //-----------------------------------------------------------------------------
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include "proxmark3.h"
-#include "data.h"
-#include "ui.h"
-#include "graph.h"
-#include "cmdparser.h"
+#include <stdio.h>    // also included in util.h
+#include <string.h>   // also included in util.h
+#include <limits.h>   // for CmdNorm INT_MIN && INT_MAX
+#include "data.h"     // also included in util.h
+#include "cmddata.h"
 #include "util.h"
 #include "cmdmain.h"
-#include "cmddata.h"
-#include "lfdemod.h"
-#include "usb_cmd.h"
-#include "crc.h"
-#include "crc16.h"
-#include "loclass/cipherutils.h"
+#include "proxmark3.h"
+#include "ui.h"       // for show graph controls
+#include "graph.h"    // for graph data
+#include "cmdparser.h"// already included in cmdmain.h
+#include "usb_cmd.h"  // already included in cmdmain.h and proxmark3.h
+#include "lfdemod.h"  // for demod code
+#include "crc.h"      // for pyramid checksum maxim
+#include "crc16.h"    // for FDXB demod checksum
+#include "loclass/cipherutils.h" // for decimating samples in getsamples
 
 uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
 uint8_t g_debugMode=0;
@@ -77,7 +76,7 @@ void printDemodBuff(void)
        }
        if (bitLen>512) bitLen=512; //max output to 512 bits if we have more - should be plenty
 
-       char *bin = sprint_bin_break(DemodBuffer,bitLen,16);
+       char *bin = sprint_bin_break(DemodBuffer, bitLen,16);
        PrintAndLog("%s",bin);
 
        return;
@@ -661,7 +660,7 @@ int CmdVikingDemod(const char *Cmd)
        //call lfdemod.c demod for Viking
        int ans = VikingDemod_AM(DemodBuffer, &size);
        if (ans < 0) {
-               if (g_debugMode) PrintAndLog("Error Viking_Demod %d", ans);
+               if (g_debugMode) PrintAndLog("Error Viking_Demod %d %s", ans, (ans == -5)?"[chksum error]":"");
                return 0;
        }
        //got a good demod
@@ -757,8 +756,7 @@ int usage_data_autocorr(void)
 int CmdAutoCorr(const char *Cmd)
 {
        char cmdp = param_getchar(Cmd, 0);
-       if (cmdp == 'h' || cmdp == 'H') 
-               return usage_data_autocorr();
+       if (cmdp == 'h' || cmdp == 'H') return usage_data_autocorr();
        int window = 4000; //set default
        char grph=0;
        bool updateGrph = FALSE;
@@ -879,13 +877,16 @@ int CmdGraphShiftZero(const char *Cmd)
 int CmdAskEdgeDetect(const char *Cmd)
 {
        int thresLen = 25;
+       int last = 0;
        sscanf(Cmd, "%i", &thresLen); 
 
-       for(int i = 1; i<GraphTraceLen; i++){
-               if (GraphBuffer[i]-GraphBuffer[i-1]>=thresLen) //large jump up
-                       GraphBuffer[i-1] = 127;
-               else if(GraphBuffer[i]-GraphBuffer[i-1]<=-1*thresLen) //large jump down
-                       GraphBuffer[i-1] = -127;
+       for(int i = 1; i < GraphTraceLen; ++i){
+               if (GraphBuffer[i] - GraphBuffer[i-1] >= thresLen) //large jump up
+                       last = 127;
+               else if(GraphBuffer[i] - GraphBuffer[i-1] <= -1 * thresLen) //large jump down
+                       last = -127;
+                       
+               GraphBuffer[i-1] = last;
        }
        RepaintGraphWindow();
        return 0;
@@ -1265,7 +1266,7 @@ int CmdFSKdemodAWID(const char *Cmd)
        //get binary from fsk wave
        int idx = AWIDdemodFSK(BitStream, &size);
        if (idx<=0){
-               if (g_debugMode==1){
+               if (g_debugMode){
                        if (idx == -1)
                                PrintAndLog("DEBUG: Error - not enough samples");
                        else if (idx == -2)
@@ -1303,7 +1304,7 @@ int CmdFSKdemodAWID(const char *Cmd)
 
        size = removeParity(BitStream, idx+8, 4, 1, 88);
        if (size != 66){
-               if (g_debugMode==1) PrintAndLog("DEBUG: Error - at parity check-tag size does not match AWID format");
+               if (g_debugMode) PrintAndLog("DEBUG: Error - at parity check-tag size does not match AWID format");
                return 0;
        }
        // ok valid card found!
@@ -1316,37 +1317,51 @@ int CmdFSKdemodAWID(const char *Cmd)
        // 00011010 1 01110101 0000000010001110 1 000000000000000000000000000000000
        // bbbbbbbb w ffffffff cccccccccccccccc w xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        // |26 bit|   |-117--| |-----142------|
+    //
+       // 00110010 0 0000111110100000 00000000000100010010100010000111 1 000000000 
+       // bbbbbbbb w ffffffffffffffff cccccccccccccccccccccccccccccccc w xxxxxxxxx
+       // |50 bit|   |----4000------| |-----------2248975------------| 
        // b = format bit len, o = odd parity of last 3 bits
        // f = facility code, c = card number
        // w = wiegand parity
-       // (26 bit format shown)
 
        uint32_t fc = 0;
        uint32_t cardnum = 0;
        uint32_t code1 = 0;
        uint32_t code2 = 0;
-       uint8_t fmtLen = bytebits_to_byte(BitStream,8);
-       if (fmtLen==26){
-               fc = bytebits_to_byte(BitStream+9, 8);
-               cardnum = bytebits_to_byte(BitStream+17, 16);
-               code1 = bytebits_to_byte(BitStream+8,fmtLen);
-               PrintAndLog("AWID Found - BitLength: %d, FC: %d, Card: %d - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, fc, cardnum, code1, rawHi2, rawHi, rawLo);
-       } else {
-               cardnum = bytebits_to_byte(BitStream+8+(fmtLen-17), 16);
-               if (fmtLen>32){
-                       code1 = bytebits_to_byte(BitStream+8,fmtLen-32);
-                       code2 = bytebits_to_byte(BitStream+8+(fmtLen-32),32);
-                       PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x%08x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, code2, rawHi2, rawHi, rawLo);
-               } else{
-                       code1 = bytebits_to_byte(BitStream+8,fmtLen);
-                       PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, rawHi2, rawHi, rawLo);
-               }
+       uint8_t fmtLen = bytebits_to_byte(BitStream, 8);
+       switch(fmtLen) {
+               case 26: 
+                       fc = bytebits_to_byte(BitStream + 9, 8);
+                       cardnum = bytebits_to_byte(BitStream + 17, 16);
+                       code1 = bytebits_to_byte(BitStream + 8,fmtLen);
+                       PrintAndLog("AWID Found - BitLength: %d, FC: %d, Card: %u - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, fc, cardnum, code1, rawHi2, rawHi, rawLo);
+                       break;
+               case 50:
+                       fc = bytebits_to_byte(BitStream + 9, 16);
+                       cardnum = bytebits_to_byte(BitStream + 25, 32);
+                       code1 = bytebits_to_byte(BitStream + 8, (fmtLen-32) );
+                       code2 = bytebits_to_byte(BitStream + 8 + (fmtLen-32), 32);
+                       PrintAndLog("AWID Found - BitLength: %d, FC: %d, Card: %u - Wiegand: %x%08x, Raw: %08x%08x%08x", fmtLen, fc, cardnum, code1, code2, rawHi2, rawHi, rawLo);
+                       break;
+               default:
+                       if (fmtLen > 32 ) {
+                               cardnum = bytebits_to_byte(BitStream+8+(fmtLen-17), 16);
+                               code1 = bytebits_to_byte(BitStream+8,fmtLen-32);
+                               code2 = bytebits_to_byte(BitStream+8+(fmtLen-32),32);
+                               PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%u) - Wiegand: %x%08x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, code2, rawHi2, rawHi, rawLo);
+                       } else {
+                               cardnum = bytebits_to_byte(BitStream+8+(fmtLen-17), 16);
+                               code1 = bytebits_to_byte(BitStream+8,fmtLen);
+                               PrintAndLog("AWID Found - BitLength: %d -unknown BitLength- (%u) - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, rawHi2, rawHi, rawLo);
+                       }
+                       break;          
        }
+
        if (g_debugMode){
                PrintAndLog("DEBUG: idx: %d, Len: %d Printing Demod Buffer:", idx, 96);
                printDemodBuff();
        }
-       //todo - convert hi2, hi, lo to demodbuffer for future sim/clone commands
        return 1;
 }
 
@@ -1363,7 +1378,7 @@ int CmdFSKdemodPyramid(const char *Cmd)
        //get binary from fsk wave
        int idx = PyramiddemodFSK(BitStream, &size);
        if (idx < 0){
-               if (g_debugMode==1){
+               if (g_debugMode){
                        if (idx == -5)
                                PrintAndLog("DEBUG: Error - not enough samples");
                        else if (idx == -1)
@@ -1419,7 +1434,7 @@ int CmdFSKdemodPyramid(const char *Cmd)
 
        size = removeParity(BitStream, idx+8, 8, 1, 120);
        if (size != 105){
-               if (g_debugMode==1
+               if (g_debugMode) 
                        PrintAndLog("DEBUG: Error at parity check - tag size does not match Pyramid format, SIZE: %d, IDX: %d, hi3: %x",size, idx, rawHi3);
                return 0;
        }
@@ -1637,21 +1652,21 @@ int CmdIndalaDecode(const char *Cmd)
        }
 
        if (!ans){
-               if (g_debugMode==1
+               if (g_debugMode) 
                        PrintAndLog("Error1: %d",ans);
                return 0;
        }
        uint8_t invert=0;
        size_t size = DemodBufferLen;
-       size_t startIdx = indala26decode(DemodBuffer, &size, &invert);
-       if (startIdx < 1 || size > 224) {
-               if (g_debugMode==1)
+       int startIdx = indala26decode(DemodBuffer, &size, &invert);
+       if (startIdx < 0 || size > 224) {
+               if (g_debugMode)
                        PrintAndLog("Error2: %d",ans);
                return -1;
        }
-       setDemodBuf(DemodBuffer, size, startIdx);
+       setDemodBuf(DemodBuffer, size, (size_t)startIdx);
        if (invert)
-               if (g_debugMode==1)
+               if (g_debugMode)
                        PrintAndLog("Had to invert bits");
 
        PrintAndLog("BitLen: %d",DemodBufferLen);
@@ -2364,6 +2379,12 @@ int Cmdhex2bin(const char *Cmd)
        return 0;
 }
 
+int CmdDataIIR(const char *Cmd){
+       iceIIR_Butterworth(GraphBuffer, GraphTraceLen);
+       RepaintGraphWindow();
+       return 0;
+}
+
 static command_t CommandTable[] =
 {
        {"help",            CmdHelp,            1, "This help"},
@@ -2410,6 +2431,7 @@ static command_t CommandTable[] =
        {"tune",            CmdTuneSamples,     0, "Get hw tune samples for graph window"},
        {"undec",           CmdUndec,           1, "Un-decimate samples by 2"},
        {"zerocrossings",   CmdZerocrossings,   1, "Count time between zero-crossings"},
+       {"iir",                         CmdDataIIR,                     0, "apply IIR buttersworth filter on plotdata"},
        {NULL, NULL, 0, NULL}
 };
 
Impressum, Datenschutz