]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmddata.c
Testing animal tags
[proxmark3-svn] / client / cmddata.c
index 76552351846713d433309c0ba9ce2c0de31617dc..089e7d5fcf6eb63998a5bed7ab8be67eb5b1d54d 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;
@@ -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,83 @@ 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, 1, 117);
+       if ( size <= 0 ) {
+               if (g_debugMode) PrintAndLog("Error removeParity:: %d", size);
+               return 0;
+       }
+       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);
+       //add rest of print code here...
+       /*
+       uint8_t ByteStream[16] = {0x00};
+       uint8_t bitCnt = 0;
+       uint8_t ByteCnt = 0;
+       size_t startIdx = preambleIndex + 11; //start after preamble
+       for (size_t idx = 0; idx < size-11; idx++){
+
+               //lsb first
+               ByteStream[ByteCnt] = ByteStream[ByteCnt] | (BitStream[startIdx+idx] << bitCnt);
+               bitCnt++;
+               if (bitCnt % 8 == 0){
+                       if (g_debugMode) PrintAndLog("byte %d: %02x", ByteCnt, ByteStream[ByteCnt]);
+                       bitCnt = 0;
+                       ByteCnt++;
+               }
+       }
+       */
+       return 1;
+}
+
+
 //by marshmellow
 //attempt to psk1 demod graph buffer
 int PSKDemod(const char *Cmd, bool verbose)
Impressum, Datenschutz