]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
Indala fixes - set accurate preamble and start of.. (#385)
authormarshmellow42 <marshmellow42@users.noreply.github.com>
Sun, 27 Aug 2017 10:10:28 +0000 (06:10 -0400)
committerpwpiwi <pwpiwi@users.noreply.github.com>
Sun, 27 Aug 2017 10:10:28 +0000 (12:10 +0200)
.. data for both format types (64 bit and 224 bit)
also adjust 224 bit demod and clone to output and input in PSK2 instead
of PSK1 as this appears to be most common for this format.

armsrc/lfops.c
client/cmdlfindala.c
common/lfdemod.c
common/lfdemod.h

index 393d05a96b949621b96fb93727d7e09c5c3594c8..95965f56f54e5800cc4943c07b1757628b6ba102 100644 (file)
@@ -1417,10 +1417,10 @@ void CopyIndala224toT55x7(uint32_t uid1, uint32_t uid2, uint32_t uid3, uint32_t
        //Program the 7 data blocks for supplied 224bit UID
        uint32_t data[] = {0, uid1, uid2, uid3, uid4, uid5, uid6, uid7};
        // and the block 0 for Indala224 format 
        //Program the 7 data blocks for supplied 224bit UID
        uint32_t data[] = {0, uid1, uid2, uid3, uid4, uid5, uid6, uid7};
        // and the block 0 for Indala224 format 
-       //Config for Indala (RF/32;PSK1 with RF/2;Maxblock=7)
-       data[0] = T55x7_BITRATE_RF_32 | T55x7_MODULATION_PSK1 | (7 << T55x7_MAXBLOCK_SHIFT);
+       //Config for Indala (RF/32;PSK2 with RF/2;Maxblock=7)
+       data[0] = T55x7_BITRATE_RF_32 | T55x7_MODULATION_PSK2 | (7 << T55x7_MAXBLOCK_SHIFT);
        //TODO add selection of chip for Q5 or T55x7
        //TODO add selection of chip for Q5 or T55x7
-       // data[0] = (((32-2)>>1)<<T5555_BITRATE_SHIFT) | T5555_MODULATION_PSK1 | 7 << T5555_MAXBLOCK_SHIFT;
+       // data[0] = (((32-2)>>1)<<T5555_BITRATE_SHIFT) | T5555_MODULATION_PSK2 | 7 << T5555_MAXBLOCK_SHIFT;
        WriteT55xx(data, 0, 8);
        //Alternative config for Indala (Extended mode;RF/32;PSK1 with RF/2;Maxblock=7;Inverse data)
        //      T5567WriteBlock(0x603E10E2,0);
        WriteT55xx(data, 0, 8);
        //Alternative config for Indala (Extended mode;RF/32;PSK1 with RF/2;Maxblock=7;Inverse data)
        //      T5567WriteBlock(0x603E10E2,0);
index 8ec04cbb7ef4e4bc1ab88754b70373390a9774fd..0a4f783492b8fd8bdf90a0a8743b7ab3780f454f 100644 (file)
@@ -40,10 +40,16 @@ int CmdIndalaDecode(const char *Cmd) {
        }
        uint8_t invert=0;
        size_t size = DemodBufferLen;
        }
        uint8_t invert=0;
        size_t size = DemodBufferLen;
-       int startIdx = indala26decode(DemodBuffer, &size, &invert);
-       if (startIdx < 0 || size > 224) {
-               if (g_debugMode) PrintAndLog("Error2: %i",startIdx);
-               return -1;
+       int startIdx = indala64decode(DemodBuffer, &size, &invert);
+       if (startIdx < 0 || size != 64) {
+               // try 224 indala
+               invert = 0;
+               size = DemodBufferLen;
+               startIdx = indala224decode(DemodBuffer, &size, &invert);
+               if (startIdx < 0 || size != 224) {
+                       if (g_debugMode) PrintAndLog("Error2: %i",startIdx);
+                       return -1;
+               }
        }
        setDemodBuf(DemodBuffer, size, (size_t)startIdx);
        setClockGrid(g_DemodClock, g_DemodStartIdx + (startIdx*g_DemodClock));
        }
        setDemodBuf(DemodBuffer, size, (size_t)startIdx);
        setClockGrid(g_DemodClock, g_DemodStartIdx + (startIdx*g_DemodClock));
index 880e2c2b04ebfe20cd6d212f82d20837db9e5eb4..f470371a3b399e6292f799eea6e3f90ac628d179 100644 (file)
@@ -1777,22 +1777,53 @@ int IOdemodFSK(uint8_t *dest, size_t size, int *waveStartIdx) {
 } 
 
 // redesigned by marshmellow adjusted from existing decode functions
 } 
 
 // redesigned by marshmellow adjusted from existing decode functions
-// indala id decoding - only tested on 26 bit tags, but attempted to make it work for more
-int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert) {
-       //26 bit 40134 format  (don't know other formats)
-       uint8_t preamble[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
-       uint8_t preamble_i[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0};
-       size_t startidx = 0; 
-       if (!preambleSearch(bitStream, preamble, sizeof(preamble), size, &startidx)){
-               // if didn't find preamble try again inverting
-               if (!preambleSearch(bitStream, preamble_i, sizeof(preamble_i), size, &startidx)) return -1;
+// indala id decoding
+int indala64decode(uint8_t *bitStream, size_t *size, uint8_t *invert) {
+       //standard 64 bit indala formats including 26 bit 40134 format
+       uint8_t preamble64[] = {1,0,1,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 1};
+       uint8_t preamble64_i[] = {0,1,0,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 0};
+       size_t startidx = 0;
+       size_t found_size = *size;
+       bool found = preambleSearch(bitStream, preamble64, sizeof(preamble64), &found_size, &startidx);
+       if (!found) {
+               found = preambleSearch(bitStream, preamble64_i, sizeof(preamble64_i), &found_size, &startidx);
+               if (!found) return -1;
                *invert ^= 1;
                *invert ^= 1;
-       } 
-       if (*size != 64 && *size != 224) return -2;
+       }
+       if (found_size != 64) return -2;
        if (*invert==1)
        if (*invert==1)
-               for (size_t i = startidx; i < *size + startidx; i++) 
+               for (size_t i = startidx; i < found_size + startidx; i++) 
+                       bitStream[i] ^= 1;
+
+       // note: don't change *size until we are sure we got it... 
+       *size = found_size;
+       return (int) startidx;
+}
+
+int indala224decode(uint8_t *bitStream, size_t *size, uint8_t *invert) {
+       //large 224 bit indala formats (different preamble too...)
+       uint8_t preamble224[] = {1,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1};
+       uint8_t preamble224_i[] = {0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,0};
+       size_t startidx = 0;
+       size_t found_size = *size;
+       bool found = preambleSearch(bitStream, preamble224, sizeof(preamble224), &found_size, &startidx);
+       if (!found) {
+               found = preambleSearch(bitStream, preamble224_i, sizeof(preamble224_i), &found_size, &startidx);
+               if (!found) return -1;
+               *invert ^= 1;
+       }
+       if (found_size != 224) return -2;
+       if (*invert==1 && startidx > 0)
+               for (size_t i = startidx-1; i < found_size + startidx + 2; i++) 
                        bitStream[i] ^= 1;
 
                        bitStream[i] ^= 1;
 
+       // 224 formats are typically PSK2 (afaik 2017 Marshmellow)
+       // note loses 1 bit at beginning of transformation...
+       // don't need to verify array is big enough as to get here there has to be a full preamble after all of our data
+       psk1TOpsk2(bitStream + (startidx-1), found_size+2);
+       startidx++;
+
+       *size = found_size;
        return (int) startidx;
 }
 
        return (int) startidx;
 }
 
index c926a8a468177785ae486fc064451b6b8eb49bfb..f18c278462e43cffa69deafb0dda916e37e15ab5 100644 (file)
@@ -54,7 +54,8 @@ extern int FDXBdemodBI(uint8_t *dest, size_t *size);
 extern int gProxII_Demod(uint8_t BitStream[], size_t *size);
 extern int HIDdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo, int *waveStartIdx);
 extern int IOdemodFSK(uint8_t *dest, size_t size, int *waveStartIdx);
 extern int gProxII_Demod(uint8_t BitStream[], size_t *size);
 extern int HIDdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo, int *waveStartIdx);
 extern int IOdemodFSK(uint8_t *dest, size_t size, int *waveStartIdx);
-extern int indala26decode(uint8_t *bitStream, size_t *size, uint8_t *invert);
+extern int indala64decode(uint8_t *bitStream, size_t *size, uint8_t *invert);
+extern int indala224decode(uint8_t *bitStream, size_t *size, uint8_t *invert);
 extern int ParadoxdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo, int *waveStartIdx);
 extern int PrescoDemod(uint8_t *dest, size_t *size);
 extern int PyramiddemodFSK(uint8_t *dest, size_t *size, int *waveStartIdx);
 extern int ParadoxdemodFSK(uint8_t *dest, size_t *size, uint32_t *hi2, uint32_t *hi, uint32_t *lo, int *waveStartIdx);
 extern int PrescoDemod(uint8_t *dest, size_t *size);
 extern int PyramiddemodFSK(uint8_t *dest, size_t *size, int *waveStartIdx);
Impressum, Datenschutz