]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/iclass.c
debug in progress
[proxmark3-svn] / armsrc / iclass.c
index 42fed888f8bab52be31877141cd365eec961aae8..7474598b6168a7fd78203c3c3c2265e8ea7f4ba9 100644 (file)
 
 static int timeout = 4096;
 
-// CARD TO READER
-// Sequence D: 11110000 modulation with subcarrier during first half
-// Sequence E: 00001111 modulation with subcarrier during second half
-// Sequence F: 00000000 no modulation with subcarrier
-// READER TO CARD
-// Sequence X: 00001100 drop after half a period
-// Sequence Y: 00000000 no drop
-// Sequence Z: 11000000 drop at start
-#define        SEC_X 0x0c
-#define        SEC_Y 0x00
-#define        SEC_Z 0xc0
 
 static int SendIClassAnswer(uint8_t *resp, int respLen, int delay);
 
@@ -697,8 +686,6 @@ void RAMFUNC SnoopIClass(void)
     int samples = 0;
     rsamples = 0;
 
-    memset(trace, 0x44, RECV_CMD_OFFSET);
-
     // Set up the demodulator for tag -> reader responses.
        Demod.output = tagToReaderResponse;
     Demod.len = 0;
@@ -722,6 +709,9 @@ void RAMFUNC SnoopIClass(void)
     FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_SNIFFER);
     SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
 
+       uint32_t time_0 = GetCountSspClk();
+
+
     int div = 0;
     //int div2 = 0;
     int decbyte = 0;
@@ -773,8 +763,14 @@ void RAMFUNC SnoopIClass(void)
                    rsamples = samples - Uart.samples;
                    LED_C_ON();
 
-                       if(!LogTrace(readerToTagCmd,Uart.byteCnt, rsamples, Uart.parityBits,TRUE)) break;
+                       //if(!LogTrace(Uart.output,Uart.byteCnt, rsamples, Uart.parityBits,TRUE)) break;
                        //if(!LogTrace(NULL, 0, Uart.endTime*16 - DELAY_READER_AIR2ARM_AS_SNIFFER, 0, TRUE)) break;
+                       if(tracing)
+                       {
+                               LogTrace(Uart.output,Uart.byteCnt, (GetCountSspClk()-time_0) << 4, Uart.parityBits,TRUE);
+                               LogTrace(NULL, 0, (GetCountSspClk()-time_0) << 4, 0, TRUE);
+                       }
+
 
                        /* And ready to receive another command. */
                    Uart.state = STATE_UNSYNCD;
@@ -793,8 +789,11 @@ void RAMFUNC SnoopIClass(void)
                    rsamples = samples - Demod.samples;
                    LED_B_ON();
 
-                       if(!LogTrace(tagToReaderResponse,Demod.len, rsamples, Demod.parityBits,FALSE)) break;
-                       //if (!LogTrace(NULL, 0, Demod.endTime*16 - DELAY_TAG_AIR2ARM_AS_SNIFFER, 0, FALSE)) break;
+                       if(tracing)
+                       {
+                               LogTrace(Demod.output,Demod.len, (GetCountSspClk()-time_0) << 4 , Demod.parityBits,FALSE);
+                               LogTrace(NULL, 0, (GetCountSspClk()-time_0) << 4, 0, FALSE);
+                       }
 
 
                    // And ready to receive another response.
@@ -883,6 +882,8 @@ static int GetIClassCommandFromReader(uint8_t *received, int *len, int maxLen)
 //-----------------------------------------------------------------------------
 static void CodeIClassTagAnswer(const uint8_t *cmd, int len)
 {
+       //So far a dummy implementation, not used
+       //int lastProxToAirDuration =0;
        int i;
 
        ToSendReset();
@@ -891,7 +892,7 @@ static void CodeIClassTagAnswer(const uint8_t *cmd, int len)
        ToSend[++ToSendMax] = 0x00;
        ToSend[++ToSendMax] = 0x00;
        ToSend[++ToSendMax] = 0x00;
-       ToSend[++ToSendMax] = 0xff;
+       ToSend[++ToSendMax] = 0xff;//Proxtoair duration starts here
        ToSend[++ToSendMax] = 0xff;
        ToSend[++ToSendMax] = 0xff;
        ToSend[++ToSendMax] = 0x00;
@@ -919,11 +920,13 @@ static void CodeIClassTagAnswer(const uint8_t *cmd, int len)
        ToSend[++ToSendMax] = 0x00;
        ToSend[++ToSendMax] = 0xff;
        ToSend[++ToSendMax] = 0xff;
-       ToSend[++ToSendMax] = 0xff;
+       ToSend[++ToSendMax] = 0xff;     
        ToSend[++ToSendMax] = 0x00;
        ToSend[++ToSendMax] = 0x00;
        ToSend[++ToSendMax] = 0x00;
 
+       //lastProxToAirDuration  = 8*ToSendMax - 3*8 - 3*8;//Not counting zeroes in the beginning or end
+
        // Convert from last byte pos to length
        ToSendMax++;
 }
@@ -931,8 +934,10 @@ static void CodeIClassTagAnswer(const uint8_t *cmd, int len)
 // Only SOF 
 static void CodeIClassTagSOF()
 {
-       ToSendReset();
+       //So far a dummy implementation, not used
+       //int lastProxToAirDuration =0;
 
+       ToSendReset();
        // Send SOF
        ToSend[++ToSendMax] = 0x00;
        ToSend[++ToSendMax] = 0x00;
@@ -942,6 +947,9 @@ static void CodeIClassTagSOF()
        ToSend[++ToSendMax] = 0xff;
        ToSend[++ToSendMax] = 0x00;
        ToSend[++ToSendMax] = 0xff;
+
+//     lastProxToAirDuration  = 8*ToSendMax - 3*8;//Not counting zeroes in the beginning
+
        
        // Convert from last byte pos to length
        ToSendMax++;
@@ -989,9 +997,13 @@ void SimulateIClass(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain
                        // The usb data is 512 bytes, fitting 65 8-byte CSNs in there.
 
                        memcpy(csn_crc, datain+(i*8), 8);
-                       doIClassSimulation(csn_crc,1);
+                       if(doIClassSimulation(csn_crc,1))
+                       {
+                               return; // Button pressed
+                       }
                }
-       }else{
+       }
+       else{
                // We may want a mode here where we hardcode the csns to use (from proxclone).
                // That will speed things up a little, but not required just yet.
                Dbprintf("The mode is not implemented, reserved for future use");
@@ -1003,13 +1015,14 @@ void SimulateIClass(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain
  * @param csn - csn to use
  * @param breakAfterMacReceived if true, returns after reader MAC has been received.
  */
-void doIClassSimulation(uint8_t csn[], int breakAfterMacReceived)
+int doIClassSimulation(uint8_t csn[], int breakAfterMacReceived)
 {
+
        // 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};
        memcpy(response3,csn,sizeof(response3));
-
+       Dbprintf("Simulating CSN %02x%02x%02x%02x%02x%02x%02x%02x",csn[0],csn[1],csn[2],csn[3],csn[4],csn[5],csn[6],csn[7]);
        // e-Purse
        uint8_t response4[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
 
@@ -1083,28 +1096,36 @@ void doIClassSimulation(uint8_t csn[], int breakAfterMacReceived)
 
        // To control where we are in the protocol
        int cmdsRecvd = 0;
+       uint32_t time_0 = GetCountSspClk();
+       uint32_t t2r_time =0;
+       uint32_t r2t_time =0;
 
        LED_A_ON();
+       bool displayDebug = true;
+       bool buttonPressed = false;
        while(!exitLoop) {
+               displayDebug = true;
+
                LED_B_OFF();
                if(!GetIClassCommandFromReader(receivedCmd, &len, 100)) {
-                       DbpString("button press");
+                       buttonPressed = true;
                        break;
                }
+               r2t_time = GetCountSspClk();
 
                // Okay, look at the command now.
-               if(receivedCmd[0] == 0x0a || receivedCmd[0] == 0x26) {
+               if(receivedCmd[0] == 0x0a ) {
                        // Reader in anticollission phase
                        resp = resp1; respLen = resp1Len; //order = 1;
                        respdata = &sof;
                        respsize = sizeof(sof);
-                       //resp = resp2; respLen = resp2Len; order = 2;
-                       Dbprintf("Hello request from reader, %02x, tracing=%d", receivedCmd[0], tracing);
+                       displayDebug = false;
                } else if(receivedCmd[0] == 0x0c) {
                        // Reader asks for anticollission CSN
                        resp = resp2; respLen = resp2Len; //order = 2;
                        respdata = response2;
                        respsize = sizeof(response2);
+                       //displayDebug = false;
                        //DbpString("Reader requests anticollission CSN:");
                } else if(receivedCmd[0] == 0x81) {
                        // Reader selects anticollission CSN.
@@ -1155,8 +1176,8 @@ void doIClassSimulation(uint8_t csn[], int breakAfterMacReceived)
                        respsize = 0;
                }
 
-               if(cmdsRecvd > 999) {
-                       DbpString("1000 commands later...");
+               if(cmdsRecvd >  100) {
+                       //DbpString("100 commands later...");
                        break;
                }
                else {
@@ -1165,24 +1186,40 @@ void doIClassSimulation(uint8_t csn[], int breakAfterMacReceived)
 
                if(respLen > 0) {
                        SendIClassAnswer(resp, respLen, 21);
+                       t2r_time = GetCountSspClk();
+
+//                     }
+                       if(displayDebug) Dbprintf("R2T:(len=%d): %x %x %x %x %x %x %x %x %x\nT2R: (total/data =%d/%d): %x %x %x %x %x %x %x %x %x",
+                       len,
+                       receivedCmd[0], receivedCmd[1], receivedCmd[2],
+                       receivedCmd[3], receivedCmd[4], receivedCmd[5],
+                       receivedCmd[6], receivedCmd[7], receivedCmd[8],
+                       respLen,respsize,
+                       resp[0], resp[1], resp[2],
+                       resp[3], resp[4], resp[5],
+                       resp[6], resp[7], resp[8]);
+
                }
-               
+
                if (tracing) {
                        //LogTrace(receivedCmd,len, rsamples, Uart.parityBits, TRUE);
-                       if(!LogTrace(receivedCmd,len, rsamples, Uart.parityBits,TRUE))
-                       {
-                               DbpString("Trace full");
-                               break;
-                       }
+
+                       LogTrace(receivedCmd,len, (r2t_time-time_0)<< 4, Uart.parityBits,TRUE);
+                       LogTrace(NULL,0, (r2t_time-time_0) << 4, 0,TRUE);
 
                        if (respdata != NULL) {
                                //LogTrace(respdata,respsize, rsamples, SwapBits(GetParity(respdata,respsize),respsize), FALSE);
-                               if(!LogTrace(respdata,respsize, rsamples,SwapBits(GetParity(respdata,respsize),respsize),FALSE))
-                               {
-                                       DbpString("Trace full");
-                                       break;
-                               }
+                               //if(!LogTrace(resp,respLen, rsamples,SwapBits(GetParity(respdata,respsize),respsize),FALSE))
+                               LogTrace(respdata,respsize, (t2r_time-time_0) << 4,SwapBits(GetParity(respdata,respsize),respsize),FALSE);
+                               LogTrace(NULL,0, (t2r_time-time_0) << 4,0,FALSE);
+
+
                        }
+                       if(!tracing) {
+                               DbpString("Trace full");
+                               //break;
+                       }
+
                }
                memset(receivedCmd, 0x44, RECV_CMD_SIZE);
        }
@@ -1190,6 +1227,11 @@ void doIClassSimulation(uint8_t csn[], int breakAfterMacReceived)
        Dbprintf("%x", cmdsRecvd);
        LED_A_OFF();
        LED_B_OFF();
+       if(buttonPressed)
+       {
+               DbpString("Button pressed");
+       }
+       return buttonPressed;
 }
 
 static int SendIClassAnswer(uint8_t *resp, int respLen, int delay)
Impressum, Datenschutz