]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/iso14443a.c
fix ATR length (#790)
[proxmark3-svn] / armsrc / iso14443a.c
index 7bf8f5af7d110e4f440b933ebed4f5c1f8138052..2fffe8373cfee3f02112b022438f3edc31d7f371 100644 (file)
@@ -25,6 +25,7 @@
 #include "BigBuf.h"
 #include "protocols.h"
 #include "parity.h"
+#include "fpgaloader.h"
 
 typedef struct {
        enum {
@@ -1220,7 +1221,7 @@ void SimulateIso14443aTag(int tagType, int uid_1st, int uid_2nd, byte_t* data)
                        EmSendPrecompiledCmd(p_response);
                }
                
-               if (!tracing) {
+               if (!get_tracing()) {
                        Dbprintf("Trace Full. Simulation stopped.");
                        break;
                }
@@ -1619,9 +1620,7 @@ void ReaderTransmitBitsPar(uint8_t* frame, uint16_t bits, uint8_t *par, uint32_t
                LED_A_ON();
   
        // Log reader command in trace buffer
-       if (tracing) {
-               LogTrace(frame, nbytes(bits), LastTimeProxToAirStart*16 + DELAY_ARM2AIR_AS_READER, (LastTimeProxToAirStart + LastProxToAirDuration)*16 + DELAY_ARM2AIR_AS_READER, par, true);
-       }
+       LogTrace(frame, nbytes(bits), LastTimeProxToAirStart*16 + DELAY_ARM2AIR_AS_READER, (LastTimeProxToAirStart + LastProxToAirDuration)*16 + DELAY_ARM2AIR_AS_READER, par, true);
 }
 
 
@@ -1652,9 +1651,7 @@ void ReaderTransmit(uint8_t* frame, uint16_t len, uint32_t *timing)
 static int ReaderReceiveOffset(uint8_t* receivedAnswer, uint16_t offset, uint8_t *parity)
 {
        if (!GetIso14443aAnswerFromTag(receivedAnswer, parity, offset)) return false;
-       if (tracing) {
-               LogTrace(receivedAnswer, Demod.len, Demod.startTime*16 - DELAY_AIR2ARM_AS_READER, Demod.endTime*16 - DELAY_AIR2ARM_AS_READER, parity, false);
-       }
+       LogTrace(receivedAnswer, Demod.len, Demod.startTime*16 - DELAY_AIR2ARM_AS_READER, Demod.endTime*16 - DELAY_AIR2ARM_AS_READER, parity, false);
        return Demod.len;
 }
 
@@ -1662,9 +1659,7 @@ static int ReaderReceiveOffset(uint8_t* receivedAnswer, uint16_t offset, uint8_t
 int ReaderReceive(uint8_t *receivedAnswer, uint8_t *parity)
 {
        if (!GetIso14443aAnswerFromTag(receivedAnswer, parity, 0)) return false;
-       if (tracing) {
-               LogTrace(receivedAnswer, Demod.len, Demod.startTime*16 - DELAY_AIR2ARM_AS_READER, Demod.endTime*16 - DELAY_AIR2ARM_AS_READER, parity, false);
-       }
+       LogTrace(receivedAnswer, Demod.len, Demod.startTime*16 - DELAY_AIR2ARM_AS_READER, Demod.endTime*16 - DELAY_AIR2ARM_AS_READER, parity, false);
        return Demod.len;
 }
 
@@ -1777,7 +1772,9 @@ int iso14443a_select_card(byte_t *uid_ptr, iso14a_card_select_t *p_hi14a_card, u
                if (anticollision) {
                        // SELECT_ALL
                        ReaderTransmit(sel_all, sizeof(sel_all), NULL);
-                       if (!ReaderReceive(resp, resp_par)) return 0;
+                       if (!ReaderReceive(resp, resp_par)) {
+                               return 0;
+                       }
 
                        if (Demod.collisionPos) {                       // we had a collision and need to construct the UID bit by bit
                                memset(uid_resp, 0, 4);
@@ -1799,7 +1796,9 @@ int iso14443a_select_card(byte_t *uid_ptr, iso14a_card_select_t *p_hi14a_card, u
                                        }
                                        collision_answer_offset = uid_resp_bits%8;
                                        ReaderTransmitBits(sel_uid, 16 + uid_resp_bits, NULL);
-                                       if (!ReaderReceiveOffset(resp, collision_answer_offset, resp_par)) return 0;
+                                       if (!ReaderReceiveOffset(resp, collision_answer_offset, resp_par)) {
+                                               return 0;
+                                       }
                                }
                                // finally, add the last bits and BCC of the UID
                                for (uint16_t i = collision_answer_offset; i < (Demod.len-1)*8; i++, uid_resp_bits++) {
@@ -1833,7 +1832,9 @@ int iso14443a_select_card(byte_t *uid_ptr, iso14a_card_select_t *p_hi14a_card, u
                ReaderTransmit(sel_uid, sizeof(sel_uid), NULL);
 
                // Receive the SAK
-               if (!ReaderReceive(resp, resp_par)) return 0;
+               if (!ReaderReceive(resp, resp_par)) {
+                       return 0;
+               }
                sak = resp[0];
        
                // Test if more parts of the uid are coming
@@ -1868,7 +1869,9 @@ int iso14443a_select_card(byte_t *uid_ptr, iso14a_card_select_t *p_hi14a_card, u
                AppendCrc14443a(rats, 2);
                ReaderTransmit(rats, sizeof(rats), NULL);
 
-               if (!(len = ReaderReceive(resp, resp_par))) return 0;
+               if (!(len = ReaderReceive(resp, resp_par))) {
+                       return 0;
+               }
 
                if(p_hi14a_card) {
                        memcpy(p_hi14a_card->ats, resp, len);
@@ -1961,7 +1964,7 @@ int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, void *data, uint8_t *res) {
                return 0; //DATA LINK ERROR
        } else{
                // S-Block WTX 
-               while((data_bytes[0] & 0xF2) == 0xF2) {
+               while(len && ((data_bytes[0] & 0xF2) == 0xF2)) {
                        uint32_t save_iso14a_timeout = iso14a_get_timeout();
                        // temporarily increase timeout
                        iso14a_set_timeout(MAX((data_bytes[1] & 0x3f) * save_iso14a_timeout, MAX_ISO14A_TIMEOUT));
@@ -2000,12 +2003,14 @@ int iso14_apdu(uint8_t *cmd, uint16_t cmd_len, void *data, uint8_t *res) {
                
        }
        
-       // cut frame byte
-       len -= 1;
-       // memmove(data_bytes, data_bytes + 1, len);
-       for (int i = 0; i < len; i++)
-               data_bytes[i] = data_bytes[i + 1];
-       
+       if (len) {
+               // cut frame byte
+               len -= 1;
+               // memmove(data_bytes, data_bytes + 1, len);
+               for (int i = 0; i < len; i++)
+                       data_bytes[i] = data_bytes[i + 1];
+       }
+               
        return len;
 }
 
@@ -2048,7 +2053,7 @@ void ReaderIso14443a(UsbCommand *c)
                                // 1 - all is OK with ATS, 2 - without ATS
                                cantSELECT = true;
                        }
-                       
+                       FpgaDisableTracing();
                        LED_B_ON();
                        cmd_send(CMD_ACK,arg0,card->uidlen,0,buf,sizeof(iso14a_card_select_t));
                        LED_B_OFF();
@@ -2062,6 +2067,7 @@ void ReaderIso14443a(UsbCommand *c)
        if(param & ISO14A_APDU && !cantSELECT) {
                uint8_t res;
                arg0 = iso14_apdu(cmd, len, buf, &res);
+               FpgaDisableTracing();
                LED_B_ON();
                cmd_send(CMD_ACK, arg0, res, 0, buf, sizeof(buf));
                LED_B_OFF();
@@ -2103,6 +2109,7 @@ void ReaderIso14443a(UsbCommand *c)
                        }
                }
                arg0 = ReaderReceive(buf, par);
+               FpgaDisableTracing();
 
                LED_B_ON();
                cmd_send(CMD_ACK,arg0,0,0,buf,sizeof(buf));
@@ -2419,6 +2426,8 @@ void ReaderMifare(bool first_try)
                }
        }
        
+       FpgaDisableTracing();
+
        uint8_t buf[32];
        memcpy(buf + 0,  uid, 4);
        num_to_bytes(nt, 4, buf + 4);
@@ -2591,6 +2600,7 @@ void RAMFUNC SniffMifare(uint8_t param) {
        DbpString("COMMAND FINISHED.");
 
        FpgaDisableSscDma();
+       FpgaDisableTracing();
        MfSniffEnd();
        
        Dbprintf("maxDataLen=%x, Uart.state=%x, Uart.len=%x", maxDataLen, Uart.state, Uart.len);
Impressum, Datenschutz