]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Further additions to tidemod to differentiate between ro and rw tags and check crc...
authord18c7db <d18c7db@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Wed, 22 Jul 2009 11:39:39 +0000 (11:39 +0000)
committerd18c7db <d18c7db@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Wed, 22 Jul 2009 11:39:39 +0000 (11:39 +0000)
armsrc/appmain.c
common/crc16.c [new file with mode: 0644]
winsrc/command.cpp

index f42b0209992aca2121d268806746078cac0ec639..f35a82fa544ce1d4c7ab13e4d8ec9e494c2251da 100644 (file)
@@ -256,7 +256,7 @@ void AcquireTiType(void)
                        WDT_HIT();
        }
 
                        WDT_HIT();
        }
 
-       // return stolen pin ro SSP
+       // return stolen pin to SSP
        PIO_DISABLE = (1<<GPIO_SSC_DOUT);
        PIO_PERIPHERAL_A_SEL = (1<<GPIO_SSC_DIN) | (1<<GPIO_SSC_DOUT);
 }
        PIO_DISABLE = (1<<GPIO_SSC_DOUT);
        PIO_PERIPHERAL_A_SEL = (1<<GPIO_SSC_DIN) | (1<<GPIO_SSC_DOUT);
 }
diff --git a/common/crc16.c b/common/crc16.c
new file mode 100644 (file)
index 0000000..6cdf3ea
--- /dev/null
@@ -0,0 +1,11 @@
+unsigned short update_crc16( WORD crc, BYTE c ) {\r
+       WORD i, v, tcrc = 0;\r
+\r
+       v = (crc ^ c) & 0xff;\r
+  for (i = 0; i < 8; i++) {\r
+      tcrc = ( (tcrc ^ v) & 1 ) ? ( tcrc >> 1 ) ^ 0x8408 : tcrc >> 1;\r
+      v >>= 1;\r
+  }\r
+\r
+  return (crc >> 8) ^ tcrc;\r
+}\r
index b186d2170c729eabcff0e95c84f6b317bdb5a7cd..4ac807d969e17f5baa5a2d6a3aa76c36c3e51f0d 100644 (file)
@@ -12,6 +12,7 @@
 \r
 #include "prox.h"\r
 #include "../common/iso14443_crc.c"\r
 \r
 #include "prox.h"\r
 #include "../common/iso14443_crc.c"\r
+#include "../common/crc16.c"\r
 \r
 #define arraylen(x) (sizeof(x)/sizeof((x)[0]))\r
 #define BIT(x) GraphBuffer[x * clock]\r
 \r
 #define arraylen(x) (sizeof(x)/sizeof((x)[0]))\r
 #define BIT(x) GraphBuffer[x * clock]\r
@@ -1608,8 +1609,8 @@ h = sign(sin(cumsum(h)));
  };\r
 \r
        int convLen = max(arraylen(HighTone), arraylen(LowTone));\r
  };\r
 \r
        int convLen = max(arraylen(HighTone), arraylen(LowTone));\r
-\r
-       int i;\r
+       WORD crc;\r
+       int i, TagType;\r
        for(i = 0; i < GraphTraceLen - convLen; i++) {\r
                int j;\r
                int lowSum = 0, highSum = 0;;\r
        for(i = 0; i < GraphTraceLen - convLen; i++) {\r
                int j;\r
                int lowSum = 0, highSum = 0;;\r
@@ -1644,17 +1645,29 @@ h = sign(sin(cumsum(h)));
 \r
        RepaintGraphWindow();\r
 \r
 \r
        RepaintGraphWindow();\r
 \r
-       // Okay, so now we have unsliced soft decisions; find bit-sync, and then\r
-       // get some bits.\r
+       // TI tag data format is 16 prebits, 8 start bits, 64 data bits,\r
+       // 16 crc CCITT bits, 8 stop bits, 15 end bits\r
+\r
+       // the 16 prebits are always low\r
+       // the 8 start and stop bits of a tag must match\r
+       // the start/stop prebits of a ro tag are 01111110\r
+       // the start/stop prebits of a rw tag are 11111110\r
+  // the 15 end bits of a ro tag are all low\r
+  // the 15 end bits of a rw tag match bits 15-1 of the data bits\r
 \r
 \r
+       // Okay, so now we have unsliced soft decisions;\r
+       // find bit-sync, and then get some bits.\r
+       // look for 17 low bits followed by 6 highs (common pattern for ro and rw tags)\r
        int max = 0, maxPos = 0;\r
        for(i = 0; i < 6000; i++) {\r
                int j;\r
                int dec = 0;\r
        int max = 0, maxPos = 0;\r
        for(i = 0; i < 6000; i++) {\r
                int j;\r
                int dec = 0;\r
-               for(j = 0; j < 8*arraylen(LowTone); j++) {\r
+               // searching 17 consecutive lows\r
+               for(j = 0; j < 17*arraylen(LowTone); j++) {\r
                        dec -= GraphBuffer[i+j];\r
                }\r
                        dec -= GraphBuffer[i+j];\r
                }\r
-               for(; j < 8*arraylen(LowTone) + 8*arraylen(HighTone); j++) {\r
+               // searching 7 consecutive highs\r
+               for(; j < 17*arraylen(LowTone) + 6*arraylen(HighTone); j++) {\r
                        dec += GraphBuffer[i+j];\r
                }\r
                if(dec > max) {\r
                        dec += GraphBuffer[i+j];\r
                }\r
                if(dec > max) {\r
@@ -1662,14 +1675,18 @@ h = sign(sin(cumsum(h)));
                        maxPos = i;\r
                }\r
        }\r
                        maxPos = i;\r
                }\r
        }\r
-       GraphBuffer[maxPos] = 800;\r
-       GraphBuffer[maxPos+1] = -800;\r
 \r
 \r
-       maxPos += 8*arraylen(LowTone);\r
+       // place a marker in the buffer to visually aid location\r
+       // of the start of sync\r
        GraphBuffer[maxPos] = 800;\r
        GraphBuffer[maxPos+1] = -800;\r
        GraphBuffer[maxPos] = 800;\r
        GraphBuffer[maxPos+1] = -800;\r
-       maxPos += 8*arraylen(HighTone);\r
 \r
 \r
+       // advance pointer to start of actual data stream (after 16 pre and 8 start bits)\r
+       maxPos += 17*arraylen(LowTone);\r
+       maxPos += 6*arraylen(HighTone);\r
+\r
+       // place a marker in the buffer to visually aid location\r
+       // of the end of sync\r
        GraphBuffer[maxPos] = 800;\r
        GraphBuffer[maxPos+1] = -800;\r
 \r
        GraphBuffer[maxPos] = 800;\r
        GraphBuffer[maxPos+1] = -800;\r
 \r
@@ -1677,10 +1694,12 @@ h = sign(sin(cumsum(h)));
 \r
        PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone));\r
 \r
 \r
        PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone));\r
 \r
-       BYTE bits[64+16+8+1];\r
+       BYTE bits[1+64+16+8+16];\r
        bits[sizeof(bits)-1] = '\0';\r
 \r
        bits[sizeof(bits)-1] = '\0';\r
 \r
-       for(i = 0; i < arraylen(bits); i++) {\r
+       DWORD shift3 = 0x7e000000, shift2 = 0, shift1 = 0, shift0 = 0;\r
+\r
+       for(i = 0; i < arraylen(bits)-1; i++) {\r
                int high = 0;\r
                int low = 0;\r
                int j;\r
                int high = 0;\r
                int low = 0;\r
                int j;\r
@@ -1690,30 +1709,75 @@ h = sign(sin(cumsum(h)));
                for(j = 0; j < arraylen(HighTone); j++) {\r
                        high += GraphBuffer[maxPos+j];\r
                }\r
                for(j = 0; j < arraylen(HighTone); j++) {\r
                        high += GraphBuffer[maxPos+j];\r
                }\r
+\r
                if(high > low) {\r
                        bits[i] = '1';\r
                        maxPos += arraylen(HighTone);\r
                if(high > low) {\r
                        bits[i] = '1';\r
                        maxPos += arraylen(HighTone);\r
+                       // bitstream arrives lsb first so shift right\r
+                       shift3 |= (1<<31);\r
                } else {\r
                        bits[i] = '.';\r
                        maxPos += arraylen(LowTone);\r
                }\r
                } else {\r
                        bits[i] = '.';\r
                        maxPos += arraylen(LowTone);\r
                }\r
+\r
+               // 128 bit right shift register\r
+         shift0 = (shift0>>1) | (shift1 << 31);\r
+         shift1 = (shift1>>1) | (shift2 << 31);\r
+         shift2 = (shift2>>1) | (shift3 << 31);\r
+         shift3 >>= 1;\r
+\r
+               // place a marker in the buffer between bits to visually aid location\r
                GraphBuffer[maxPos] = 800;\r
                GraphBuffer[maxPos+1] = -800;\r
        }\r
                GraphBuffer[maxPos] = 800;\r
                GraphBuffer[maxPos+1] = -800;\r
        }\r
-       PrintToScrollback("bits: '%s'", bits);\r
+       PrintToScrollback("Info: raw tag bits = %s", bits);\r
 \r
 \r
-       DWORD h = 0, l = 0;\r
-       for(i = 0; i < 32; i++) {\r
-               if(bits[i] == '1') {\r
-                       l |= (1<<i);\r
-               }\r
+       TagType = (shift3>>8)&0xff;\r
+       if ( TagType != ((shift0>>16)&0xff) ) {\r
+               PrintToScrollback("Error: start and stop bits do not match!");\r
+               return;\r
+       }\r
+       else if (TagType == 0x7e) {\r
+               PrintToScrollback("Info: Readonly TI tag detected.");\r
+               return;\r
        }\r
        }\r
-       for(i = 32; i < 64; i++) {\r
-               if(bits[i] == '1') {\r
-                       h |= (1<<(i-32));\r
+       else if (TagType == 0xfe) {\r
+               PrintToScrollback("Info: Rewriteable TI tag detected.");\r
+\r
+         // put 64 bit data into shift1 and shift0\r
+         shift0 = (shift0>>24) | (shift1 << 8);\r
+         shift1 = (shift1>>24) | (shift2 << 8);\r
+\r
+               // align 16 bit crc into lower half of shift2\r
+         shift2 = ((shift2>>24) | (shift3 << 8)) & 0x0ffff;\r
+\r
+               // align 16 bit "end bits" or "ident" into lower half of shift3\r
+         shift3 >>= 16;\r
+\r
+               if ( (shift3^shift0)&0xffff ) {\r
+                       PrintToScrollback("Error: Ident mismatch!");\r
+               }\r
+               // calculate CRC\r
+               crc=0;\r
+               crc = update_crc16(crc, (shift0)&0xff);\r
+               crc = update_crc16(crc, (shift0>>8)&0xff);\r
+               crc = update_crc16(crc, (shift0>>16)&0xff);\r
+               crc = update_crc16(crc, (shift0>>24)&0xff);\r
+               crc = update_crc16(crc, (shift1)&0xff);\r
+               crc = update_crc16(crc, (shift1>>8)&0xff);\r
+               crc = update_crc16(crc, (shift1>>16)&0xff);\r
+               crc = update_crc16(crc, (shift1>>24)&0xff);\r
+               PrintToScrollback("Info: Tag data = %08X%08X", shift1, shift0);\r
+               if (crc != (shift2&0xffff)) {\r
+                       PrintToScrollback("Error: CRC mismatch, calculated %04X, got ^04X", crc, shift2&0xffff);\r
+               } else {\r
+                       PrintToScrollback("Info: CRC %04X is good", crc);\r
                }\r
        }\r
                }\r
        }\r
-       PrintToScrollback("hex: %08x %08x", h, l);\r
+       else {\r
+               PrintToScrollback("Unknown tag type.");\r
+               return;\r
+       }\r
 }\r
 \r
 static void CmdNorm(char *str)\r
 }\r
 \r
 static void CmdNorm(char *str)\r
Impressum, Datenschutz