]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhf14a.c
Merge branch 'graphwork2' into graphwork
[proxmark3-svn] / client / cmdhf14a.c
index 200c9dcd6d9dd84431fb71ea79f9096f0d32b24b..812db8ee0d85506630119de580162e2e4884dae4 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <inttypes.h>
 #include <string.h>
 #include <unistd.h>
 #include "util.h"
 #include <string.h>
 #include <unistd.h>
 #include "util.h"
@@ -23,6 +24,7 @@
 #include "common.h"
 #include "cmdmain.h"
 #include "mifare.h"
 #include "common.h"
 #include "cmdmain.h"
 #include "mifare.h"
+#include "cmdhfmfu.h"
 
 static int CmdHelp(const char *Cmd);
 static void waitCmd(uint8_t iLen);
 
 static int CmdHelp(const char *Cmd);
 static void waitCmd(uint8_t iLen);
@@ -140,10 +142,10 @@ int CmdHF14AReader(const char *Cmd)
        iso14a_card_select_t card;
        memcpy(&card, (iso14a_card_select_t *)resp.d.asBytes, sizeof(iso14a_card_select_t));
 
        iso14a_card_select_t card;
        memcpy(&card, (iso14a_card_select_t *)resp.d.asBytes, sizeof(iso14a_card_select_t));
 
-       uint64_t select_status = resp.arg[0];           // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS
+       uint64_t select_status = resp.arg[0];           // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS, 3: proprietary Anticollision
        
        if(select_status == 0) {
        
        if(select_status == 0) {
-               PrintAndLog("iso14443a card select failed");
+               if (Cmd[0] != 's') PrintAndLog("iso14443a card select failed");
                // disconnect
                c.arg[0] = 0;
                c.arg[1] = 0;
                // disconnect
                c.arg[0] = 0;
                c.arg[1] = 0;
@@ -169,6 +171,42 @@ int CmdHF14AReader(const char *Cmd)
 
        switch (card.sak) {
                case 0x00: 
 
        switch (card.sak) {
                case 0x00: 
+
+                       //***************************************test****************
+                       // disconnect
+                       c.arg[0] = 0;
+                       c.arg[1] = 0;
+                       c.arg[2] = 0;
+                       SendCommand(&c);
+                       
+                       uint32_t tagT = GetHF14AMfU_Type();
+                       ul_print_type(tagT, 0);
+
+                       //reconnect for further tests
+                       c.arg[0] = ISO14A_CONNECT | ISO14A_NO_DISCONNECT;
+                       c.arg[1] = 0;
+                       c.arg[2] = 0;
+
+                       SendCommand(&c);
+
+                       UsbCommand resp;
+                       WaitForResponse(CMD_ACK,&resp);
+                       
+                       memcpy(&card, (iso14a_card_select_t *)resp.d.asBytes, sizeof(iso14a_card_select_t));
+
+                       select_status = resp.arg[0];            // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS
+                       
+                       if(select_status == 0) {
+                               //PrintAndLog("iso14443a card select failed");
+                               // disconnect
+                               c.arg[0] = 0;
+                               c.arg[1] = 0;
+                               c.arg[2] = 0;
+                               SendCommand(&c);
+                               return 0;
+                       }
+
+                       /*  orig
                        // check if the tag answers to GETVERSION (0x60)
                        c.arg[0] = ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT;
                        c.arg[1] = 1;
                        // check if the tag answers to GETVERSION (0x60)
                        c.arg[0] = ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT;
                        c.arg[1] = 1;
@@ -177,8 +215,8 @@ int CmdHF14AReader(const char *Cmd)
                        SendCommand(&c);
                        WaitForResponse(CMD_ACK,&resp);
 
                        SendCommand(&c);
                        WaitForResponse(CMD_ACK,&resp);
 
-                       uint8_t version[8] = {0,0,0,0,0,0,0,0};
-                       memcpy(&version, resp.d.asBytes, resp.arg[0]);
+                       uint8_t version[10] = {0};
+                       memcpy(version, resp.d.asBytes, resp.arg[0] < sizeof(version) ? resp.arg[0] : sizeof(version));
                        uint8_t len = resp.arg[0] & 0xff;
                        switch ( len ){
                                // todo, identify "Magic UL-C tags". // they usually have a static nonce response to 0x1A command.
                        uint8_t len = resp.arg[0] & 0xff;
                        switch ( len ){
                                // todo, identify "Magic UL-C tags". // they usually have a static nonce response to 0x1A command.
@@ -187,7 +225,7 @@ int CmdHF14AReader(const char *Cmd)
                                case 0x01:PrintAndLog("TYPE : NXP MIFARE Ultralight C");break;
                                case 0x00:PrintAndLog("TYPE : NXP MIFARE Ultralight");break;    
                        }
                                case 0x01:PrintAndLog("TYPE : NXP MIFARE Ultralight C");break;
                                case 0x00:PrintAndLog("TYPE : NXP MIFARE Ultralight");break;    
                        }
-
+                       */
                        break;
                case 0x01: PrintAndLog("TYPE : NXP TNP3xxx Activision Game Appliance"); break;
                case 0x04: PrintAndLog("TYPE : NXP MIFARE (various !DESFire !DESFire EV1)"); break;
                        break;
                case 0x01: PrintAndLog("TYPE : NXP TNP3xxx Activision Game Appliance"); break;
                case 0x04: PrintAndLog("TYPE : NXP MIFARE (various !DESFire !DESFire EV1)"); break;
@@ -221,7 +259,7 @@ int CmdHF14AReader(const char *Cmd)
                SendCommand(&c);
                WaitForResponse(CMD_ACK,&resp);
                
                SendCommand(&c);
                WaitForResponse(CMD_ACK,&resp);
                
-           memcpy(&card.ats, resp.d.asBytes, resp.arg[0]);
+           memcpy(card.ats, resp.d.asBytes, resp.arg[0]);
                card.ats_len = resp.arg[0];                             // note: ats_len includes CRC Bytes
        } 
 
                card.ats_len = resp.arg[0];                             // note: ats_len includes CRC Bytes
        } 
 
@@ -315,16 +353,16 @@ int CmdHF14AReader(const char *Cmd)
                                                PrintAndLog("                     x0 -> <1 kByte");
                                                break;
                                        case 0x01:
                                                PrintAndLog("                     x0 -> <1 kByte");
                                                break;
                                        case 0x01:
-                                               PrintAndLog("                     x0 -> 1 kByte");
+                                               PrintAndLog("                     x1 -> 1 kByte");
                                                break;
                                        case 0x02:
                                                break;
                                        case 0x02:
-                                               PrintAndLog("                     x0 -> 2 kByte");
+                                               PrintAndLog("                     x2 -> 2 kByte");
                                                break;
                                        case 0x03:
                                                break;
                                        case 0x03:
-                                               PrintAndLog("                     x0 -> 4 kByte");
+                                               PrintAndLog("                     x3 -> 4 kByte");
                                                break;
                                        case 0x04:
                                                break;
                                        case 0x04:
-                                               PrintAndLog("                     x0 -> 8 kByte");
+                                               PrintAndLog("                     x4 -> 8 kByte");
                                                break;
                                }
                                switch (card.ats[pos + 3] & 0xf0) {
                                                break;
                                }
                                switch (card.ats[pos + 3] & 0xf0) {
@@ -393,7 +431,7 @@ int CmdHF14ACUIDs(const char *Cmd)
        n = n > 0 ? n : 1;
 
        PrintAndLog("Collecting %d UIDs", n);
        n = n > 0 ? n : 1;
 
        PrintAndLog("Collecting %d UIDs", n);
-       PrintAndLog("Start: %u", time(NULL));
+       PrintAndLog("Start: %" PRIu64, msclock()/1000);
        // repeat n times
        for (int i = 0; i < n; i++) {
                // execute anticollision procedure
        // repeat n times
        for (int i = 0; i < n; i++) {
                // execute anticollision procedure
@@ -416,7 +454,7 @@ int CmdHF14ACUIDs(const char *Cmd)
                        PrintAndLog("%s", uid_string);
                }
        }
                        PrintAndLog("%s", uid_string);
                }
        }
-       PrintAndLog("End: %u", time(NULL));
+       PrintAndLog("End: %" PRIu64, msclock()/1000);
 
        return 1;
 }
 
        return 1;
 }
@@ -453,7 +491,7 @@ int CmdHF14ASim(const char *Cmd)
 
        // Are we handling the (optional) second part uid?
        if (long_uid > 0xffffffff) {
 
        // Are we handling the (optional) second part uid?
        if (long_uid > 0xffffffff) {
-               PrintAndLog("Emulating ISO/IEC 14443 type A tag with 7 byte UID (%014"llx")",long_uid);
+               PrintAndLog("Emulating ISO/IEC 14443 type A tag with 7 byte UID (%014" PRIx64 ")",long_uid);
                // Store the second part
                c.arg[2] = (long_uid & 0xffffffff);
                long_uid >>= 32;
                // Store the second part
                c.arg[2] = (long_uid & 0xffffffff);
                long_uid >>= 32;
@@ -528,20 +566,22 @@ int CmdHF14ASnoop(const char *Cmd) {
   return 0;
 }
 
   return 0;
 }
 
+
 int CmdHF14ACmdRaw(const char *cmd) {
     UsbCommand c = {CMD_READER_ISO_14443a, {0, 0, 0}};
 int CmdHF14ACmdRaw(const char *cmd) {
     UsbCommand c = {CMD_READER_ISO_14443a, {0, 0, 0}};
-    uint8_t reply=1;
-    uint8_t crc=0;
-    uint8_t power=0;
-    uint8_t active=0;
-    uint8_t active_select=0;
-    uint16_t numbits=0;
-       uint32_t timeout=0;
-       uint8_t bTimeout=0;
+    bool reply=1;
+    bool crc = false;
+    bool power = false;
+    bool active = false;
+    bool active_select = false;
+    uint16_t numbits = 0;
+       bool bTimeout = false;
+       uint32_t timeout = 0;
+       bool topazmode = false;
     char buf[5]="";
     char buf[5]="";
-    int i=0;
+    int i = 0;
     uint8_t data[USB_CMD_DATA_SIZE];
     uint8_t data[USB_CMD_DATA_SIZE];
-       uint16_t datalen=0;
+       uint16_t datalen = 0;
        uint32_t temp;
 
     if (strlen(cmd)<2) {
        uint32_t temp;
 
     if (strlen(cmd)<2) {
@@ -553,9 +593,11 @@ int CmdHF14ACmdRaw(const char *cmd) {
         PrintAndLog("       -s    active signal field ON with select");
         PrintAndLog("       -b    number of bits to send. Useful for send partial byte");
                PrintAndLog("       -t    timeout in ms");
         PrintAndLog("       -s    active signal field ON with select");
         PrintAndLog("       -b    number of bits to send. Useful for send partial byte");
                PrintAndLog("       -t    timeout in ms");
+               PrintAndLog("       -T    use Topaz protocol to send command");
         return 0;
     }
 
         return 0;
     }
 
+       
     // strip
     while (*cmd==' ' || *cmd=='\t') cmd++;
 
     // strip
     while (*cmd==' ' || *cmd=='\t') cmd++;
 
@@ -564,19 +606,19 @@ int CmdHF14ACmdRaw(const char *cmd) {
         if (cmd[i]=='-') {
             switch (cmd[i+1]) {
                 case 'r': 
         if (cmd[i]=='-') {
             switch (cmd[i+1]) {
                 case 'r': 
-                    reply=0;
+                    reply = false;
                     break;
                 case 'c':
                     break;
                 case 'c':
-                    crc=1;
+                    crc = true;
                     break;
                 case 'p':
                     break;
                 case 'p':
-                    power=1;
+                    power = true;
                     break;
                 case 'a':
                     break;
                 case 'a':
-                    active=1;
+                    active = true;
                     break;
                 case 's':
                     break;
                 case 's':
-                    active_select=1;
+                    active_select = true;
                     break;
                 case 'b': 
                     sscanf(cmd+i+2,"%d",&temp);
                     break;
                 case 'b': 
                     sscanf(cmd+i+2,"%d",&temp);
@@ -586,13 +628,16 @@ int CmdHF14ACmdRaw(const char *cmd) {
                     i-=2;
                     break;
                                case 't':
                     i-=2;
                     break;
                                case 't':
-                                       bTimeout=1;
+                                       bTimeout = true;
                                        sscanf(cmd+i+2,"%d",&temp);
                                        timeout = temp;
                                        i+=3;
                                        while(cmd[i]!=' ' && cmd[i]!='\0') { i++; }
                                        i-=2;
                                        break;
                                        sscanf(cmd+i+2,"%d",&temp);
                                        timeout = temp;
                                        i+=3;
                                        while(cmd[i]!=' ' && cmd[i]!='\0') { i++; }
                                        i-=2;
                                        break;
+                case 'T':
+                                       topazmode = true;
+                                       break;
                 default:
                     PrintAndLog("Invalid option");
                     return 0;
                 default:
                     PrintAndLog("Invalid option");
                     return 0;
@@ -622,10 +667,15 @@ int CmdHF14ACmdRaw(const char *cmd) {
         PrintAndLog("Invalid char on input");
         return 0;
     }
         PrintAndLog("Invalid char on input");
         return 0;
     }
+
     if(crc && datalen>0 && datalen<sizeof(data)-2)
     {
         uint8_t first, second;
     if(crc && datalen>0 && datalen<sizeof(data)-2)
     {
         uint8_t first, second;
-        ComputeCrc14443(CRC_14443_A, data, datalen, &first, &second);
+               if (topazmode) {
+                       ComputeCrc14443(CRC_14443_B, data, datalen, &first, &second);
+               } else {
+                       ComputeCrc14443(CRC_14443_A, data, datalen, &first, &second);
+               }
         data[datalen++] = first;
         data[datalen++] = second;
     }
         data[datalen++] = first;
         data[datalen++] = second;
     }
@@ -638,7 +688,7 @@ int CmdHF14ACmdRaw(const char *cmd) {
     }
 
        if(bTimeout){
     }
 
        if(bTimeout){
-           #define MAX_TIMEOUT 40542464        // (2^32-1) * (8*16) / 13560000Hz * 1000ms/s = 
+           #define MAX_TIMEOUT 40542464        // = (2^32-1) * (8*16) / 13560000Hz * 1000ms/s
         c.arg[0] |= ISO14A_SET_TIMEOUT;
         if(timeout > MAX_TIMEOUT) {
             timeout = MAX_TIMEOUT;
         c.arg[0] |= ISO14A_SET_TIMEOUT;
         if(timeout > MAX_TIMEOUT) {
             timeout = MAX_TIMEOUT;
@@ -646,11 +696,19 @@ int CmdHF14ACmdRaw(const char *cmd) {
         }
                c.arg[2] = 13560000 / 1000 / (8*16) * timeout; // timeout in ETUs (time to transfer 1 bit, approx. 9.4 us)
        }
         }
                c.arg[2] = 13560000 / 1000 / (8*16) * timeout; // timeout in ETUs (time to transfer 1 bit, approx. 9.4 us)
        }
-    if(power)
+
+    if(power) {
         c.arg[0] |= ISO14A_NO_DISCONNECT;
         c.arg[0] |= ISO14A_NO_DISCONNECT;
-    if(datalen>0)
+    }
+
+       if(datalen > 0) {
         c.arg[0] |= ISO14A_RAW;
         c.arg[0] |= ISO14A_RAW;
+    }
 
 
+       if(topazmode) {
+               c.arg[0] |= ISO14A_TOPAZMODE;
+    }
+               
        // Max buffer is USB_CMD_DATA_SIZE
     c.arg[1] = (datalen & 0xFFFF) | (numbits << 16);
     memcpy(c.d.asBytes,data,datalen);
        // Max buffer is USB_CMD_DATA_SIZE
     c.arg[1] = (datalen & 0xFFFF) | (numbits << 16);
     memcpy(c.d.asBytes,data,datalen);
@@ -666,6 +724,7 @@ int CmdHF14ACmdRaw(const char *cmd) {
     return 0;
 }
 
     return 0;
 }
 
+
 static void waitCmd(uint8_t iSelect)
 {
     uint8_t *recv;
 static void waitCmd(uint8_t iSelect)
 {
     uint8_t *recv;
@@ -675,7 +734,7 @@ static void waitCmd(uint8_t iSelect)
     if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
         recv = resp.d.asBytes;
         uint8_t iLen = iSelect ? resp.arg[1] : resp.arg[0];
     if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {
         recv = resp.d.asBytes;
         uint8_t iLen = iSelect ? resp.arg[1] : resp.arg[0];
-        PrintAndLog("received %i octets",iLen);
+        PrintAndLog("received %i octets", iLen);
         if(!iLen)
             return;
         hexout = (char *)malloc(iLen * 3 + 1);
         if(!iLen)
             return;
         hexout = (char *)malloc(iLen * 3 + 1);
Impressum, Datenschutz