]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
Moved iclass crc to be based on a lookup table
authorMartin Holst Swende <martin@swende.se>
Sun, 4 Jan 2015 21:10:25 +0000 (22:10 +0100)
committerMartin Holst Swende <martin@swende.se>
Sun, 4 Jan 2015 21:10:25 +0000 (22:10 +0100)
armsrc/iclass.c
common/iso15693tools.c

index cb5416a036c52914bad71eb9bcf3c2ac43e4f9d9..3844ab143f242d2c4554abb18f0163a14aa6e2b9 100644 (file)
@@ -1595,6 +1595,15 @@ void ReaderIClass(uint8_t arg0) {
 void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
 
        uint8_t card_data[24]={0};
+       uint16_t block_crc_LUT[255] = {0};
+
+       {//Generate a lookup table for block crc
+               for(int block = 0; block < 255; block++){
+                       char bl = block;
+                       block_crc_LUT[block] = iclass_crc16(&bl ,1);
+               }
+       }
+       //Dbprintf("Lookup table: %02x %02x %02x" ,block_crc_LUT[0],block_crc_LUT[1],block_crc_LUT[2]);
 
        uint8_t check[]       = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
        uint8_t read[]        = { 0x0c, 0x00, 0x00, 0x00 };
@@ -1618,12 +1627,13 @@ void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
 
        while(!BUTTON_PRESS()) {
        
+               WDT_HIT();
+
                if(traceLen > TRACE_SIZE) {
                        DbpString("Trace full");
                        break;
                }
                
-
                uint8_t read_status = handshakeIclassTag(card_data);
                if(read_status < 2) continue;
 
@@ -1636,16 +1646,15 @@ void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
                        continue;
                }
 
-               //first get configuration block
+               //first get configuration block (block 1)
+               crc = block_crc_LUT[1];
                read[1]=1;
-               uint8_t *blockno=&read[1];
-               crc = iclass_crc16((char *)blockno,1);
                read[2] = crc >> 8;
                read[3] = crc & 0xff;
 
                if(sendCmdGetResponseWithRetries(read, sizeof(read),resp, 10, 10))
                {
-                       Dbprintf("Dump config block failed");
+                       Dbprintf("Dump config (block 1) failed");
                        continue;
                }
 
@@ -1660,10 +1669,10 @@ void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
                WDT_HIT();
 
                //then loop around remaining blocks
-               for(char block=0; block < cardsize; block++){
+               for(int block=0; block < cardsize; block++){
 
                        read[1]= block;
-                       crc = iclass_crc16(&block ,1);
+                       crc = block_crc_LUT[block];
                        read[2] = crc >> 8;
                        read[3] = crc & 0xff;
 
@@ -1681,7 +1690,6 @@ void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
                }
                //If we got here, let's break
                break;
-               WDT_HIT();
        }
        LED_A_OFF();
 }
index 0f7a250bf94c54651ec048474c3ced3d2b56c0f9..26e636ca7b0c27d90dee14bf3f79d70168fd546c 100644 (file)
@@ -66,11 +66,11 @@ char* Iso15693sprintUID(char *target,uint8_t *uid) {
   return target;
 }
 
-unsigned short iclass_crc16(char *data_p, unsigned short length)
+uint16_t iclass_crc16(char *data_p, unsigned short length)
 {
       unsigned char i;
       unsigned int data;
-      unsigned int crc = 0xffff;
+         uint16_t crc = 0xffff;
 
       if (length == 0)
             return (~crc);
Impressum, Datenschutz