]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/iso14443a.c
moved includes, added clear_trace flag (it was there...) and fixed multiapdu iso14443...
[proxmark3-svn] / armsrc / iso14443a.c
index 2ff722b04f82677fda3afbb554459c4849e9e051..90e8538eb531c7c23c7e795c3f1b15d907fa1221 100644 (file)
@@ -1698,6 +1698,13 @@ int iso14443a_select_card(byte_t *uid_ptr, iso14a_card_select_t *p_hi14a_card, u
        int cascade_level = 0;
        int len;
 
+       // init card struct
+       if(p_hi14a_card) {
+               p_hi14a_card->uidlen = 0;
+               memset(p_hi14a_card->uid, 0, 10);
+               p_hi14a_card->ats_len = 0;
+       }
+
        // Broadcast for a card, WUPA (0x52) will force response from all cards in the field
     ReaderTransmitBitsPar(wupa, 7, NULL, NULL);
        
@@ -1706,8 +1713,6 @@ int iso14443a_select_card(byte_t *uid_ptr, iso14a_card_select_t *p_hi14a_card, u
 
        if(p_hi14a_card) {
                memcpy(p_hi14a_card->atqa, resp, 2);
-               p_hi14a_card->uidlen = 0;
-               memset(p_hi14a_card->uid,0,10);
        }
 
        if (anticollision) {
@@ -1813,10 +1818,9 @@ int iso14443a_select_card(byte_t *uid_ptr, iso14a_card_select_t *p_hi14a_card, u
 
        if(p_hi14a_card) {
                p_hi14a_card->sak = sak;
-               p_hi14a_card->ats_len = 0;
        }
 
-       // non iso14443a compliant tag
+       // PICC compilant with iso14443a-4 ---> (SAK & 0x20 != 0)
        if( (sak & 0x20) == 0) return 2; 
 
        if (!no_rats) {
@@ -1908,30 +1912,32 @@ void ReaderIso14443a(UsbCommand *c)
        size_t lenbits = c->arg[1] >> 16;
        uint32_t timeout = c->arg[2];
        uint32_t arg0 = 0;
-       byte_t buf[USB_CMD_DATA_SIZE];
+       byte_t buf[USB_CMD_DATA_SIZE] = {0};
        uint8_t par[MAX_PARITY_SIZE];
        bool cantSELECT = false;
   
-       if(param & ISO14A_CONNECT) {
+       set_tracing(true);
+       
+       if(param & ISO14A_CLEAR_TRACE) {
                clear_trace();
        }
 
-       set_tracing(true);
-
        if(param & ISO14A_REQUEST_TRIGGER) {
                iso14a_set_trigger(true);
        }
 
        if(param & ISO14A_CONNECT) {
                LED_A_ON();
-               clear_trace();
                iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN);
                if(!(param & ISO14A_NO_SELECT)) {
                        iso14a_card_select_t *card = (iso14a_card_select_t*)buf;
                        arg0 = iso14443a_select_card(NULL, card, NULL, true, 0, param & ISO14A_NO_RATS);
 
                        // if we cant select then we cant send data
-                       cantSELECT = (arg0 != 1);
+                       if (arg0 != 1 && arg0 != 2) {
+                               // 1 - all is OK with ATS, 2 - without ATS
+                               cantSELECT = true;
+                       }
                        
                        LED_B_ON();
                        cmd_send(CMD_ACK,arg0,card->uidlen,0,buf,sizeof(iso14a_card_select_t));
Impressum, Datenschutz