]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmddata.c
addition animal tags demod info
[proxmark3-svn] / client / cmddata.c
index e23b6d5979b1759aa7608e73684440f73a8032ec..fd08b6dd10a21e6517d3d6e12f2763d65b2d79b0 100644 (file)
@@ -40,7 +40,7 @@ void setDemodBuf(uint8_t *buff, size_t size, size_t startIdx)
                size = MAX_DEMOD_BUF_LEN;
 
        size_t i = 0;
-       for (; i < size; i++){
+for (; i < size; i++){
                DemodBuffer[i]=buff[startIdx++];
        }
        DemodBufferLen=size;
@@ -118,7 +118,7 @@ int CmdPrintDemodBuff(const char *Cmd)
        int numBits = (DemodBufferLen-offset) & 0x7FC; //make sure we don't exceed our string
 
        if (hexMode){
-               char *buf = DemodBuffer + offset;
+               char *buf = (char *) (DemodBuffer + offset);
                numBits = binarraytohex(hex, buf, numBits);
                if (numBits==0) return 0;
                PrintAndLog("DemodBuffer: %s",hex);             
@@ -500,7 +500,7 @@ int ASKbiphaseDemod(const char *Cmd, bool verbose)
        int offset=0, clk=0, invert=0, maxErr=0, ans=0;
        ans = sscanf(Cmd, "%i %i %i %i", &offset, &clk, &invert, &maxErr);
        if (ans>0)
-               ans = ASKDemod(Cmd+1, FALSE, FALSE, 0);
+               ans = ASKDemod(Cmd+2, FALSE, FALSE, 0);
        else
                ans = ASKDemod(Cmd, FALSE, FALSE, 0);
        if (!ans) {
@@ -1457,6 +1457,75 @@ int CmdFSKdemodPyramid(const char *Cmd)
        return 1;
 }
 
+// ISO11784/85 demod  (aka animal tag)  BIPHASE, inverted, rf/32,  with preamble of 00000000001 (128bits)
+// 8 databits + 1 parity (1)
+// CIITT 16 chksum
+// NATIONAL CODE, ICAR database
+// COUNTRY CODE (ISO3166) 
+// FLAG (animal/non-animal)
+int CmdIso11784demodBI(const char *Cmd){
+
+       int invert = 1;
+       int clk = 32;           
+       int errCnt = 0;
+       int maxErr = 0;
+       uint8_t BitStream[MAX_DEMOD_BUF_LEN];   
+       size_t size = getFromGraphBuf(BitStream);       
+       
+       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: 32", errCnt);
+               return 0;
+       }
+
+       errCnt = BiphaseRawDecode(BitStream, &size, maxErr, 1);
+       if (errCnt < 0 || errCnt > maxErr ) {
+               if (g_debugMode) PrintAndLog("Error BiphaseRawDecode: %d", errCnt);
+               return 0;
+       } 
+
+       int preambleIndex = ISO11784demodBI(BitStream, &size);
+       if (preambleIndex < 0){
+               if (g_debugMode) PrintAndLog("Error ISO11784Demod , no startmarker found :: %d",preambleIndex);
+               return 0;
+       }
+
+       setDemodBuf(BitStream, 128, preambleIndex);
+       //printDemodBuff();
+
+       size = removeParity(BitStream, preambleIndex + 11, 9, 2, 117);
+       if ( size <= 103 ) {
+               if (g_debugMode) PrintAndLog("Error removeParity:: %d", size);
+               return 0;
+       }
+       //char *bin = sprint_bin_break(BitStream,size,16);
+       //PrintAndLog("DEBUG BinStream:\n%s",bin);
+
+       PrintAndLog("startmarker %d;   Size %d", preambleIndex, size);
+
+       //return 1;
+       //got a good demod
+       uint32_t NationalCodeA = bytebits_to_byteLSBF(BitStream,32);
+       uint32_t NationalCodeB = bytebits_to_byteLSBF(BitStream+32,6);
+       uint32_t countryCode = bytebits_to_byteLSBF(BitStream+38,10);
+       uint8_t dataBlockBit = BitStream[48];
+       uint32_t reservedCode = bytebits_to_byteLSBF(BitStream+49,14);
+       uint8_t animalBit = BitStream[63];
+       uint32_t crc16 = bytebits_to_byteLSBF(BitStream+64,16);
+       uint32_t extended = bytebits_to_byteLSBF(BitStream+80,24);
+
+       PrintAndLog("NationalCode: %X%08X",NationalCodeB,NationalCodeA);
+       PrintAndLog("CountryCode:  %d",countryCode);
+       PrintAndLog("dataBlockBit: %d",dataBlockBit);
+       PrintAndLog("reservedCode: %X",reservedCode);
+       PrintAndLog("animalBit:    %d", animalBit);
+       PrintAndLog("CRC:          %02X", crc16);
+       PrintAndLog("Extended:     %x", extended);
+       
+       return 1;
+}
+
+
 //by marshmellow
 //attempt to psk1 demod graph buffer
 int PSKDemod(const char *Cmd, bool verbose)
@@ -2212,6 +2281,7 @@ static command_t CommandTable[] =
        {"hexsamples",      CmdHexsamples,      0, "<bytes> [<offset>] -- Dump big buffer as hex bytes"},
        {"hide",            CmdHide,            1, "Hide graph window"},
        {"hpf",             CmdHpf,             1, "Remove DC offset from trace"},
+       {"iso11784demod",   CmdIso11784demodBI, 1, "Demodulate a ISO11784/85 Biphase tag from GraphBuffer"},
        {"load",            CmdLoad,            1, "<filename> -- Load trace (to graph window"},
        {"ltrim",           CmdLtrim,           1, "<samples> -- Trim samples from left of trace"},
        {"rtrim",           CmdRtrim,           1, "<location to end trace> -- Trim samples from right of trace"},
Impressum, Datenschutz