]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/iclass.c
Merge branch 'master' of https://github.com/Proxmark/proxmark3
[proxmark3-svn] / armsrc / iclass.c
index cb5416a036c52914bad71eb9bcf3c2ac43e4f9d9..ea9af7d4f4fa11c9b84f15d4a8ea0ee6314bd02f 100644 (file)
@@ -433,7 +433,6 @@ static RAMFUNC int ManchesterDecoding(int v)
        else {
                modulation = bit & Demod.syncBit;
                modulation |= ((bit << 1) ^ ((Demod.buffer & 0x08) >> 3)) & Demod.syncBit;
-               //modulation = ((bit << 1) ^ ((Demod.buffer & 0x08) >> 3)) & Demod.syncBit;
 
                Demod.samples += 4;
 
@@ -842,10 +841,7 @@ static int GetIClassCommandFromReader(uint8_t *received, int *len, int maxLen)
         }
         if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
             uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
-                       /*if(OutOfNDecoding((b & 0xf0) >> 4)) {
-                               *len = Uart.byteCnt;
-                               return TRUE;
-                       }*/
+
                        if(OutOfNDecoding(b & 0x0f)) {
                                *len = Uart.byteCnt;
                                return TRUE;
@@ -1001,8 +997,6 @@ void SimulateIClass(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain
  */
 int doIClassSimulation(uint8_t csn[], int breakAfterMacReceived, uint8_t *reader_mac_buf)
 {
-
-
        // CSN followed by two CRC bytes
        uint8_t response2[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
        uint8_t response3[] = { 0,0,0,0,0,0,0,0,0,0};
@@ -1106,6 +1100,7 @@ int doIClassSimulation(uint8_t csn[], int breakAfterMacReceived, uint8_t *reader
                //Signal tracer
                // Can be used to get a trigger for an oscilloscope..
                LED_C_OFF();
+
                if(!GetIClassCommandFromReader(receivedCmd, &len, 100)) {
                        buttonPressed = true;
                        break;
@@ -1368,7 +1363,6 @@ void ReaderTransmitIClass(uint8_t* frame, int len)
        int samples = 0;
 
        // This is tied to other size changes
-       //      uint8_t* frame_addr = ((uint8_t*)BigBuf) + 2024;
        CodeIClassCommand(frame,len);
 
        // Select the card
@@ -1423,10 +1417,7 @@ static int GetIClassAnswer(uint8_t *receivedResponse, int maxLen, int *samples,
                        b = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
                        skip = !skip;
                        if(skip) continue;
-                       /*if(ManchesterDecoding((b>>4) & 0xf)) {
-                               *samples = ((c - 1) << 3) + 4;
-                               return TRUE;
-                       }*/
+               
                        if(ManchesterDecoding(b & 0x0f)) {
                                *samples = c << 3;
                                return  TRUE;
@@ -1594,7 +1585,16 @@ void ReaderIClass(uint8_t arg0) {
 
 void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
 
-       uint8_t card_data[24]={0};
+       uint8_t card_data[USB_CMD_DATA_SIZE]={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 +1618,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 +1637,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;
                }
 
@@ -1658,12 +1658,15 @@ void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
 
                cardsize = memory.k16 ? 255 : 32;
                WDT_HIT();
-
+               //Set card_data to all zeroes, we'll fill it with data
+               memset(card_data,0x0,USB_CMD_DATA_SIZE);
+               uint8_t failedRead =0;
+               uint8_t stored_data_length =0;
                //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;
 
@@ -1674,15 +1677,47 @@ void ReaderIClass_Replay(uint8_t arg0, uint8_t *MAC) {
                                                resp[3], resp[4], resp[5],
                                                resp[6], resp[7]);
 
+                               //Fill up the buffer
+                               memcpy(card_data+stored_data_length,resp,8);
+                               stored_data_length += 8;
+
+                               if(stored_data_length +8 > USB_CMD_DATA_SIZE)
+                               {//Time to send this off and start afresh
+                                       cmd_send(CMD_ACK,
+                                                        stored_data_length,//data length
+                                                        failedRead,//Failed blocks?
+                                                        0,//Not used ATM
+                                                        card_data, stored_data_length);
+                                       //reset
+                                       stored_data_length = 0;
+                                       failedRead = 0;
+                               }
+
                        }else{
+                               failedRead = 1;
+                               stored_data_length +=8;//Otherwise, data becomes misaligned
                                Dbprintf("Failed to dump block %d", block);
-
                        }
                }
+               //Send off any remaining data
+               if(stored_data_length > 0)
+               {
+                       cmd_send(CMD_ACK,
+                                        stored_data_length,//data length
+                                        failedRead,//Failed blocks?
+                                        0,//Not used ATM
+                                        card_data, stored_data_length);
+               }
                //If we got here, let's break
                break;
-               WDT_HIT();
        }
+       //Signal end of transmission
+       cmd_send(CMD_ACK,
+                        0,//data length
+                        0,//Failed blocks?
+                        0,//Not used ATM
+                        card_data, 0);
+
        LED_A_OFF();
 }
 
Impressum, Datenschutz