mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-03-21 04:29:53 +08:00
Moved iclass crc to be based on a lookup table
This commit is contained in:
parent
337818f7ab
commit
39d3ce5dd6
2 changed files with 18 additions and 10 deletions
|
@ -1595,6 +1595,15 @@ void ReaderIClass(uint8_t arg0) {
|
||||||
void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
|
void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
|
||||||
|
|
||||||
uint8_t card_data[24]={0};
|
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 check[] = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
uint8_t read[] = { 0x0c, 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()) {
|
while(!BUTTON_PRESS()) {
|
||||||
|
|
||||||
|
WDT_HIT();
|
||||||
|
|
||||||
if(traceLen > TRACE_SIZE) {
|
if(traceLen > TRACE_SIZE) {
|
||||||
DbpString("Trace full");
|
DbpString("Trace full");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t read_status = handshakeIclassTag(card_data);
|
uint8_t read_status = handshakeIclassTag(card_data);
|
||||||
if(read_status < 2) continue;
|
if(read_status < 2) continue;
|
||||||
|
|
||||||
|
@ -1636,16 +1646,15 @@ void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//first get configuration block
|
//first get configuration block (block 1)
|
||||||
|
crc = block_crc_LUT[1];
|
||||||
read[1]=1;
|
read[1]=1;
|
||||||
uint8_t *blockno=&read[1];
|
|
||||||
crc = iclass_crc16((char *)blockno,1);
|
|
||||||
read[2] = crc >> 8;
|
read[2] = crc >> 8;
|
||||||
read[3] = crc & 0xff;
|
read[3] = crc & 0xff;
|
||||||
|
|
||||||
if(sendCmdGetResponseWithRetries(read, sizeof(read),resp, 10, 10))
|
if(sendCmdGetResponseWithRetries(read, sizeof(read),resp, 10, 10))
|
||||||
{
|
{
|
||||||
Dbprintf("Dump config block failed");
|
Dbprintf("Dump config (block 1) failed");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1660,10 +1669,10 @@ void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
|
||||||
WDT_HIT();
|
WDT_HIT();
|
||||||
|
|
||||||
//then loop around remaining blocks
|
//then loop around remaining blocks
|
||||||
for(char block=0; block < cardsize; block++){
|
for(int block=0; block < cardsize; block++){
|
||||||
|
|
||||||
read[1]= block;
|
read[1]= block;
|
||||||
crc = iclass_crc16(&block ,1);
|
crc = block_crc_LUT[block];
|
||||||
read[2] = crc >> 8;
|
read[2] = crc >> 8;
|
||||||
read[3] = crc & 0xff;
|
read[3] = crc & 0xff;
|
||||||
|
|
||||||
|
@ -1681,7 +1690,6 @@ void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
|
||||||
}
|
}
|
||||||
//If we got here, let's break
|
//If we got here, let's break
|
||||||
break;
|
break;
|
||||||
WDT_HIT();
|
|
||||||
}
|
}
|
||||||
LED_A_OFF();
|
LED_A_OFF();
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,11 +66,11 @@ char* Iso15693sprintUID(char *target,uint8_t *uid) {
|
||||||
return target;
|
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 char i;
|
||||||
unsigned int data;
|
unsigned int data;
|
||||||
unsigned int crc = 0xffff;
|
uint16_t crc = 0xffff;
|
||||||
|
|
||||||
if (length == 0)
|
if (length == 0)
|
||||||
return (~crc);
|
return (~crc);
|
||||||
|
|
Loading…
Add table
Reference in a new issue