]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Testing animal tags
authormarshmellow42 <marshmellowrf@gmail.com>
Wed, 3 Jun 2015 20:52:20 +0000 (16:52 -0400)
committermarshmellow42 <marshmellowrf@gmail.com>
Wed, 3 Jun 2015 20:52:20 +0000 (16:52 -0400)
client/cmddata.c
common/lfdemod.c
common/lfdemod.h

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)
index 7d40d22e5aa44551835ae4ada1f69947f132e488..c0f2bb71265ee4ffcce67f5da4be77527eb71321 100644 (file)
@@ -537,6 +537,18 @@ uint32_t bytebits_to_byte(uint8_t* src, size_t numbits)
        return num;
 }
 
+//least significant bit first
+uint32_t bytebits_to_byteLSBF(uint8_t* src, size_t numbits)
+{
+       uint32_t num = 0;
+       for(int i = 0 ; i < numbits ; i++)
+       {
+               num = (num << 1) | (*src);
+               src++;
+       }
+       return num;
+}
+
 int IOdemodFSK(uint8_t *dest, size_t size)
 {
        if (justNoise(dest, size)) return -1;
@@ -590,6 +602,21 @@ size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t p
        return bitCnt;
 }
 
+// Ask/Biphase Demod then try to locate an ISO 11784/85 ID
+// BitStream must contain previously askrawdemod and biphasedemoded data
+int ISO11784demodBI(uint8_t *dest, size_t *size)
+{
+       //make sure buffer has enough data
+       if (*size < 128) return -1;
+
+       size_t startIdx = 0;
+       uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,0,1};
+
+       uint8_t errChk = preambleSearch(dest, preamble, sizeof(preamble), size, &startIdx);
+       if (errChk == 0) return -2; //preamble not found
+       return (int)startIdx;
+}
+
 // by marshmellow
 // FSK Demod then try to locate an AWID ID
 int AWIDdemodFSK(uint8_t *dest, size_t *size)
index ab81c34c459ef327cbe3ea595af3f1ecf1d5a72b..81157d1927103accdecccbbe9402c416994cd76c 100644 (file)
@@ -19,6 +19,7 @@
 int      askdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr, uint8_t amp, uint8_t askType);
 int      BiphaseRawDecode(uint8_t * BitStream, size_t *size, int offset, int invert);
 uint32_t bytebits_to_byte(uint8_t* src, size_t numbits);
+uint32_t bytebits_to_byteLSBF(uint8_t* src, size_t numbits);
 uint16_t countFC(uint8_t *BitStream, size_t size, uint8_t fskAdj);
 int      DetectASKClock(uint8_t dest[], size_t size, int *clock, int maxErr);
 uint8_t  DetectCleanAskWave(uint8_t dest[], size_t size, uint8_t high, uint8_t low);
Impressum, Datenschutz