]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmddata.c
@marshmellows last LF changes.
[proxmark3-svn] / client / cmddata.c
index 4eca030db416480829f45852e30df8ebccfbfd74..b141b6f8539133fe0fa10791ec4b9019321cd39d 100644 (file)
 #include "usb_cmd.h"
 #include "crc.h"
 #include "crc16.h"
+#include "loclass/cipherutils.h"
 
 uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
-uint8_t g_debugMode;
-size_t DemodBufferLen;
+uint8_t g_debugMode=0;
+size_t DemodBufferLen=0;
 static int CmdHelp(const char *Cmd);
 
 //set the demod buffer with given array of binary (one bit per byte)
@@ -57,12 +58,12 @@ int CmdSetDebugMode(const char *Cmd)
 }
 
 int usage_data_printdemodbuf(){
-               PrintAndLog("Usage: data printdemodbuffer x o <offset>");
-               PrintAndLog("Options:        ");
-               PrintAndLog("       h          This help");
-               PrintAndLog("       x          output in hex (omit for binary output)");
-               PrintAndLog("       o <offset> enter offset in # of bits");
-               return 0;       
+       PrintAndLog("Usage: data printdemodbuffer x o <offset>");
+       PrintAndLog("Options:");
+       PrintAndLog("       h          This help");
+       PrintAndLog("       x          output in hex (omit for binary output)");
+       PrintAndLog("       o <offset> enter offset in # of bits");
+       return 0;       
 }
 
 //by marshmellow
@@ -503,6 +504,7 @@ int ASKbiphaseDemod(const char *Cmd, bool verbose)
        
        uint8_t BitStream[MAX_DEMOD_BUF_LEN];
        size_t size = getFromGraphBuf(BitStream);         
+       //invert here inverts the ask raw demoded bits which has no effect on the demod, but we need the pointer
        int errCnt = askdemod(BitStream, &size, &clk, &invert, maxErr, 0, 0);  
        if ( errCnt < 0 || errCnt > maxErr ) {   
                if (g_debugMode) PrintAndLog("DEBUG: no data or error found %d, clock: %d", errCnt, clk);  
@@ -1218,10 +1220,6 @@ int CmdFSKdemodIO(const char *Cmd)
 //print full AWID Prox ID and some bit format details if found
 int CmdFSKdemodAWID(const char *Cmd)
 {
-
-       //int verbose=1;
-       //sscanf(Cmd, "%i", &verbose);
-
        //raw fsk demod no manchester decoding no start bit finding just get binary from wave
        uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0};
        size_t size = getFromGraphBuf(BitStream);
@@ -1421,7 +1419,6 @@ int CmdFSKdemodPyramid(const char *Cmd)
        uint32_t fc = 0;
        uint32_t cardnum = 0;
        uint32_t code1 = 0;
-       //uint32_t code2 = 0;
        if (fmtLen==26){
                fc = bytebits_to_byte(BitStream+73, 8);
                cardnum = bytebits_to_byte(BitStream+81, 16);
@@ -1498,12 +1495,16 @@ int CmdFDXBdemodBI(const char *Cmd){
                if (g_debugMode) PrintAndLog("Error FDXBDemod , no startmarker found :: %d",preambleIndex);
                return 0;
        }
+       if (size != 128) {
+               if (g_debugMode) PrintAndLog("Error incorrect data length found");
+               return 0;
+       }
        
        setDemodBuf(BitStream, 128, preambleIndex);
 
-       // remove but don't verify parity. (pType = 2)
+       // remove marker bits (1's every 9th digit after preamble) (pType = 2)
        size = removeParity(BitStream, preambleIndex + 11, 9, 2, 117);
-       if ( size <= 103 ) {
+       if ( size != 104 ) {
                if (g_debugMode) PrintAndLog("Error removeParity:: %d", size);
                return 0;
        }
@@ -1567,6 +1568,9 @@ int PSKDemod(const char *Cmd, bool verbose)
                //invalid carrier
                return 0;
        }
+       if (g_debugMode){
+               PrintAndLog("Carrier: rf/%d",carrier);
+       }
        int errCnt=0;
        errCnt = pskRawDemod(BitStream, &BitLen, &clk, &invert);
        if (errCnt > maxErr){
@@ -1606,61 +1610,33 @@ int CmdIndalaDecode(const char *Cmd)
                return 0;
        }
        uint8_t invert=0;
-       ans = indala26decode(DemodBuffer, &DemodBufferLen, &invert);
-       if (ans < 1) {
+       size_t size = DemodBufferLen;
+       size_t startIdx = indala26decode(DemodBuffer, &size, &invert);
+       if (startIdx < 1 || size > 224) {
                if (g_debugMode==1)
                        PrintAndLog("Error2: %d",ans);
                return -1;
        }
-       char showbits[251]={0x00};
+       setDemodBuf(DemodBuffer, size, startIdx);
        if (invert)
                if (g_debugMode==1)
                        PrintAndLog("Had to invert bits");
 
+       PrintAndLog("BitLen: %d",DemodBufferLen);
        //convert UID to HEX
        uint32_t uid1, uid2, uid3, uid4, uid5, uid6, uid7;
-       int idx;
-       uid1=0;
-       uid2=0;
-       PrintAndLog("BitLen: %d",DemodBufferLen);
+       uid1=bytebits_to_byte(DemodBuffer,32);
+       uid2=bytebits_to_byte(DemodBuffer+32,32);
        if (DemodBufferLen==64){
-               for( idx=0; idx<64; idx++) {
-                       uid1=(uid1<<1)|(uid2>>31);
-                       if (DemodBuffer[idx] == 0) {
-                               uid2=(uid2<<1)|0;
-                               showbits[idx]='0';
-                       } else {
-                               uid2=(uid2<<1)|1;
-                               showbits[idx]='1';
-                       }
-               }
-               showbits[idx]='\0';
-               PrintAndLog("Indala UID=%s (%x%08x)", showbits, uid1, uid2);
-       }
-       else {
-               uid3=0;
-               uid4=0;
-               uid5=0;
-               uid6=0;
-               uid7=0;
-               for( idx=0; idx<DemodBufferLen; idx++) {
-                       uid1=(uid1<<1)|(uid2>>31);
-                       uid2=(uid2<<1)|(uid3>>31);
-                       uid3=(uid3<<1)|(uid4>>31);
-                       uid4=(uid4<<1)|(uid5>>31);
-                       uid5=(uid5<<1)|(uid6>>31);
-                       uid6=(uid6<<1)|(uid7>>31);
-                       if (DemodBuffer[idx] == 0) {
-                               uid7=(uid7<<1)|0;
-                               showbits[idx]='0';
-                       }
-                       else {
-                               uid7=(uid7<<1)|1;
-                               showbits[idx]='1';
-                       }
-               }
-               showbits[idx]='\0';
-               PrintAndLog("Indala UID=%s (%x%08x%08x%08x%08x%08x%08x)", showbits, uid1, uid2, uid3, uid4, uid5, uid6, uid7);
+               PrintAndLog("Indala UID=%s (%x%08x)", sprint_bin(DemodBuffer,DemodBufferLen), uid1, uid2);
+       } else {
+               uid3=bytebits_to_byte(DemodBuffer+64,32);
+               uid4=bytebits_to_byte(DemodBuffer+96,32);
+               uid5=bytebits_to_byte(DemodBuffer+128,32);
+               uid6=bytebits_to_byte(DemodBuffer+160,32);
+               uid7=bytebits_to_byte(DemodBuffer+192,32);
+               PrintAndLog("Indala UID=%s (%x%08x%08x%08x%08x%08x%08x)", 
+                   sprint_bin(DemodBuffer,DemodBufferLen), uid1, uid2, uid3, uid4, uid5, uid6, uid7);
        }
        if (g_debugMode){
                PrintAndLog("DEBUG: printing demodbuffer:");
@@ -1730,7 +1706,7 @@ int NRZrawDemod(const char *Cmd, bool verbose)
        size_t BitLen = getFromGraphBuf(BitStream);
        if (BitLen==0) return 0;
        int errCnt=0;
-       errCnt = nrzRawDemod(BitStream, &BitLen, &clk, &invert, maxErr);
+       errCnt = nrzRawDemod(BitStream, &BitLen, &clk, &invert);
        if (errCnt > maxErr){
                if (g_debugMode) PrintAndLog("Too many errors found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
                return 0;
@@ -1953,11 +1929,6 @@ int CmdHpf(const char *Cmd)
        RepaintGraphWindow();
        return 0;
 }
-typedef struct {
-       uint8_t * buffer;
-       uint32_t numbits;
-       uint32_t position;
-} BitstreamOut;
 
 bool _headBit( BitstreamOut *stream)
 {
@@ -2275,14 +2246,109 @@ int CmdZerocrossings(const char *Cmd)
        return 0;
 }
 
+int usage_data_bin2hex(){
+               PrintAndLog("Usage: data bin2hex <binary_digits>");
+               PrintAndLog("       This function will ignore all characters not 1 or 0 (but stop reading on whitespace)");
+               return 0;
+}
+
+/**
+ * @brief Utility for conversion via cmdline.
+ * @param Cmd
+ * @return
+ */
+int Cmdbin2hex(const char *Cmd)
+{
+       int bg =0, en =0;
+       if(param_getptr(Cmd, &bg, &en, 0))
+       {
+               return usage_data_bin2hex();
+       }
+       //Number of digits supplied as argument
+       size_t length = en  - bg +1;
+       size_t bytelen = (length+7) / 8;
+       uint8_t* arr = (uint8_t *) malloc(bytelen);
+       memset(arr, 0, bytelen);
+       BitstreamOut bout = { arr, 0, 0 };
+
+       for(; bg <= en ;bg++)
+       {
+               char c = Cmd[bg];
+               if( c == '1')   pushBit(&bout, 1);
+               else if( c == '0')      pushBit(&bout, 0);
+               else PrintAndLog("Ignoring '%c'", c);
+       }
+
+       if(bout.numbits % 8 != 0)
+       {
+               printf("[padded with %d zeroes]\n", 8-(bout.numbits % 8));
+       }
+
+       //Uses printf instead of PrintAndLog since the latter
+       // adds linebreaks to each printout - this way was more convenient since we don't have to
+       // allocate a string and write to that first...
+       for(size_t x = 0; x  < bytelen ; x++)
+       {
+               printf("%02X", arr[x]);
+       }
+       printf("\n");
+       free(arr);
+       return 0;
+}
+
+int usage_data_hex2bin(){
+
+       PrintAndLog("Usage: data bin2hex <binary_digits>");
+       PrintAndLog("       This function will ignore all non-hexadecimal characters (but stop reading on whitespace)");
+       return 0;
+
+}
+
+int Cmdhex2bin(const char *Cmd)
+{
+       int bg =0, en =0;
+       if(param_getptr(Cmd, &bg, &en, 0))
+       {
+               return usage_data_hex2bin();
+       }
+
+
+       while(bg <= en )
+       {
+               char x = Cmd[bg++];
+               // capitalize
+               if (x >= 'a' && x <= 'f')
+                       x -= 32;
+               // convert to numeric value
+               if (x >= '0' && x <= '9')
+                       x -= '0';
+               else if (x >= 'A' && x <= 'F')
+                       x -= 'A' - 10;
+               else
+                       continue;
+
+               //Uses printf instead of PrintAndLog since the latter
+               // adds linebreaks to each printout - this way was more convenient since we don't have to
+               // allocate a string and write to that first...
+
+               for(int i= 0 ; i < 4 ; ++i)
+                       printf("%d",(x >> (3 - i)) & 1);
+       }
+       printf("\n");
+
+       return 0;
+}
+
 static command_t CommandTable[] =
 {
        {"help",            CmdHelp,            1, "This help"},
        {"askedgedetect",   CmdAskEdgeDetect,   1, "[threshold] Adjust Graph for manual ask demod using the length of sample differences to detect the edge of a wave (use 20-45, def:25)"},
        {"askem410xdemod",  CmdAskEM410xDemod,  1, "[clock] [invert<0|1>] [maxErr] -- Demodulate an EM410x tag from GraphBuffer (args optional)"},
        {"askgproxiidemod", CmdG_Prox_II_Demod, 1, "Demodulate a G Prox II tag from GraphBuffer"},
+       {"askvikingdemod",  CmdVikingDemod,     1, "Demodulate a Viking AM tag from GraphBuffer"},
        {"autocorr",        CmdAutoCorr,        1, "[window length] [g] -- Autocorrelation over window - g to save back to GraphBuffer (overwrite)"},
        {"biphaserawdecode",CmdBiphaseDecodeRaw,1, "[offset] [invert<0|1>] [maxErr] -- Biphase decode bin stream in DemodBuffer (offset = 0|1 bits to shift the decode start)"},
+       {"bin2hex",         Cmdbin2hex,         1, "bin2hex <digits>     -- Converts binary to hexadecimal"},
        {"bitsamples",      CmdBitsamples,      0, "Get raw samples as bitstring"},
        {"buffclear",       CmdBuffClear,       1, "Clear sample buffer and graph window"},
        {"dec",             CmdDec,             1, "Decimate samples"},
@@ -2297,6 +2363,7 @@ static command_t CommandTable[] =
        {"getbitstream",    CmdGetBitStream,    1, "Convert GraphBuffer's >=1 values to 1 and <1 to 0"},
        {"grid",            CmdGrid,            1, "<x> <y> -- overlay grid on graph window, use zero value to turn off either"},
        {"hexsamples",      CmdHexsamples,      0, "<bytes> [<offset>] -- Dump big buffer as hex bytes"},
+       {"hex2bin",         Cmdhex2bin,         1, "hex2bin <hexadecimal> -- Converts hexadecimal to binary"},
        {"hide",            CmdHide,            1, "Hide graph window"},
        {"hpf",             CmdHpf,             1, "Remove DC offset from trace"},
        {"load",            CmdLoad,            1, "<filename> -- Load trace (to graph window"},
Impressum, Datenschutz