From: Martin Holst Swende Date: Sun, 4 Jan 2015 21:10:25 +0000 (+0100) Subject: Moved iclass crc to be based on a lookup table X-Git-Tag: v2.0.0-rc1~65 X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/39d3ce5dd66a1e3e135331db444f38b2ed32691a Moved iclass crc to be based on a lookup table --- diff --git a/armsrc/iclass.c b/armsrc/iclass.c index cb5416a0..3844ab14 100644 --- a/armsrc/iclass.c +++ b/armsrc/iclass.c @@ -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(); } diff --git a/common/iso15693tools.c b/common/iso15693tools.c index 0f7a250b..26e636ca 100644 --- a/common/iso15693tools.c +++ b/common/iso15693tools.c @@ -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);