]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhficlass.c
Merge pull request #112 from marshmellow42/master
[proxmark3-svn] / client / cmdhficlass.c
index 7bc23e9bb522d32db4e3db637dfc60aa7b3eea9b..824aaa3674cc1bd5cf84d38174968d0e3fbd468e 100644 (file)
@@ -29,6 +29,8 @@
 #include "loclass/ikeys.h"
 #include "loclass/elite_crack.h"
 #include "loclass/fileutils.h"
 #include "loclass/ikeys.h"
 #include "loclass/elite_crack.h"
 #include "loclass/fileutils.h"
+#include "protocols.h"
+#include "usb_cmd.h"
 
 static int CmdHelp(const char *Cmd);
 
 
 static int CmdHelp(const char *Cmd);
 
@@ -75,10 +77,9 @@ int CmdHFiClassSim(const char *Cmd)
        uint8_t CSN[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 
        if (strlen(Cmd)<1) {
        uint8_t CSN[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 
        if (strlen(Cmd)<1) {
-               usage_hf_iclass_sim();
+               return usage_hf_iclass_sim();
        }
        }
-
-       simType = param_get8(Cmd, 0);
+       simType = param_get8ex(Cmd, 0, 0, 10);
 
        if(simType == 0)
        {
 
        if(simType == 0)
        {
@@ -164,38 +165,47 @@ int CmdHFiClassSim(const char *Cmd)
        return 0;
 }
 
        return 0;
 }
 
-int CmdHFiClassReader(const char *Cmd)
+int HFiClassReader(const char *Cmd, bool loop, bool verbose)
 {
 {
-       UsbCommand c = {CMD_READER_ICLASS, {0}};
+       bool tagFound = false;
+       UsbCommand c = {CMD_READER_ICLASS, {FLAG_ICLASS_READER_CSN|
+                                       FLAG_ICLASS_READER_CONF|FLAG_ICLASS_READER_AA}};
+       if (!loop) c.arg[0] |= FLAG_ICLASS_READER_ONLY_ONCE | FLAG_ICLASS_READER_ONE_TRY;
        SendCommand(&c);
        UsbCommand resp;
        while(!ukbhit()){
        SendCommand(&c);
        UsbCommand resp;
        while(!ukbhit()){
-               if (WaitForResponseTimeout(CMD_ACK,&resp,4500)) {
-                       uint8_t isOK    = resp.arg[0] & 0xff;
-                       uint8_t * data  = resp.d.asBytes;
+               if (WaitForResponseTimeout(CMD_ACK,&resp, 4500)) {
+                       uint8_t readStatus = resp.arg[0] & 0xff;
+                       uint8_t *data = resp.d.asBytes;
 
 
-                       PrintAndLog("isOk:%02x", isOK);
-                       if( isOK == 0){
+                       if (verbose)
+                               PrintAndLog("Readstatus:%02x", readStatus);
+                       if( readStatus == 0){
                                //Aborted
                                //Aborted
-                               PrintAndLog("Quitting...");
+                               if (verbose) PrintAndLog("Quitting...");
                                return 0;
                        }
                                return 0;
                        }
-                       if(isOK > 0)
-                       {
+                       if( readStatus & FLAG_ICLASS_READER_CSN){
                                PrintAndLog("CSN: %s",sprint_hex(data,8));
                                PrintAndLog("CSN: %s",sprint_hex(data,8));
+                               tagFound = true;
                        }
                        }
-                       if(isOK >= 1)
-                       {
-                               PrintAndLog("CC: %s",sprint_hex(data+8,8));
-                       }else{
-                               PrintAndLog("No CC obtained");
+                       if( readStatus & FLAG_ICLASS_READER_CC)  PrintAndLog("CC: %s",sprint_hex(data+16,8));
+                       if( readStatus & FLAG_ICLASS_READER_CONF){
+                               printIclassDumpInfo(data);
                        }
                        }
+                       if (tagFound && !loop) return 1;
                } else {
                } else {
-                       PrintAndLog("Command execute timeout");
+                       if (verbose) PrintAndLog("Command execute timeout");
                }
                }
+               if (!loop) break;
        }
        }
-
        return 0;
        return 0;
+
+}
+
+int CmdHFiClassReader(const char *Cmd)
+{
+       return HFiClassReader(Cmd, true, true);
 }
 
 int CmdHFiClassReader_Replay(const char *Cmd)
 }
 
 int CmdHFiClassReader_Replay(const char *Cmd)
@@ -269,7 +279,7 @@ int CmdHFiClassReader_Dump(const char *Cmd)
        uint8_t key_sel_p[8] = { 0 };
 
        UsbCommand c = {CMD_READER_ICLASS, {0}};
        uint8_t key_sel_p[8] = { 0 };
 
        UsbCommand c = {CMD_READER_ICLASS, {0}};
-       c.arg[0] = FLAG_ICLASS_READER_ONLY_ONCE| FLAG_ICLASS_READER_GET_CC;
+       c.arg[0] = FLAG_ICLASS_READER_ONLY_ONCE| FLAG_ICLASS_READER_CC;
        SendCommand(&c);
 
 
        SendCommand(&c);
 
 
@@ -284,7 +294,7 @@ int CmdHFiClassReader_Dump(const char *Cmd)
        uint8_t * data  = resp.d.asBytes;
 
        memcpy(CSN,data,8);
        uint8_t * data  = resp.d.asBytes;
 
        memcpy(CSN,data,8);
-       memcpy(CCNR,data+8,8);
+       memcpy(CCNR,data+16,8);
 
        PrintAndLog("isOk:%02x", isOK);
 
 
        PrintAndLog("isOk:%02x", isOK);
 
@@ -322,7 +332,7 @@ int CmdHFiClassReader_Dump(const char *Cmd)
        PrintAndLog("Hash0, a.k.a diversified key, that is computed using Ksel and stored in the card (Block 3):");
        printvar("Div key", div_key, 8);
        printvar("CC_NR:",CCNR,12);
        PrintAndLog("Hash0, a.k.a diversified key, that is computed using Ksel and stored in the card (Block 3):");
        printvar("Div key", div_key, 8);
        printvar("CC_NR:",CCNR,12);
-       doMAC(CCNR,12,div_key, MAC);
+       doMAC(CCNR,div_key, MAC);
        printvar("MAC", MAC, 4);
 
        uint8_t iclass_data[32000] = {0};
        printvar("MAC", MAC, 4);
 
        uint8_t iclass_data[32000] = {0};
@@ -348,7 +358,7 @@ int CmdHFiClassReader_Dump(const char *Cmd)
                        if(dataLength > 0)
                        {
                                PrintAndLog("Got %d bytes data (total so far %d)" ,dataLength,iclass_datalen);
                        if(dataLength > 0)
                        {
                                PrintAndLog("Got %d bytes data (total so far %d)" ,dataLength,iclass_datalen);
-                               memcpy(iclass_data, resp.d.asBytes,dataLength);
+                               memcpy(iclass_data+iclass_datalen, resp.d.asBytes,dataLength);
                                iclass_datalen += dataLength;
                        }else
                        {//Last transfer, datalength 0 means the dump is finished
                                iclass_datalen += dataLength;
                        }else
                        {//Last transfer, datalength 0 means the dump is finished
@@ -421,9 +431,12 @@ int CmdHFiClassELoad(const char *Cmd)
        fseek(f, 0, SEEK_SET);
 
        uint8_t *dump = malloc(fsize);
        fseek(f, 0, SEEK_SET);
 
        uint8_t *dump = malloc(fsize);
+
+
        size_t bytes_read = fread(dump, 1, fsize, f);
        fclose(f);
 
        size_t bytes_read = fread(dump, 1, fsize, f);
        fclose(f);
 
+       printIclassDumpInfo(dump);
        //Validate
 
        if (bytes_read < fsize)
        //Validate
 
        if (bytes_read < fsize)
@@ -456,7 +469,7 @@ int usage_hf_iclass_decrypt()
        PrintAndLog("OBS! In order to use this function, the file 'iclass_decryptionkey.bin' must reside");
        PrintAndLog("in the working directory. The file should be 16 bytes binary data");
        PrintAndLog("");
        PrintAndLog("OBS! In order to use this function, the file 'iclass_decryptionkey.bin' must reside");
        PrintAndLog("in the working directory. The file should be 16 bytes binary data");
        PrintAndLog("");
-       PrintAndLog("example: hf iclass decrypt tagdump_12312342343.bin");
+       PrintAndLog("example: hf iclass decrypt tagdump_12312342343.bin");
        PrintAndLog("");
        PrintAndLog("OBS! This is pretty stupid implementation, it tries to decrypt every block after block 6. ");
        PrintAndLog("Correct behaviour would be to decrypt only the application areas where the key is valid,");
        PrintAndLog("");
        PrintAndLog("OBS! This is pretty stupid implementation, it tries to decrypt every block after block 6. ");
        PrintAndLog("Correct behaviour would be to decrypt only the application areas where the key is valid,");
@@ -604,7 +617,7 @@ int CmdHFiClass_iso14443A_write(const char *Cmd)
        diversifyKey(CSN,KEY, div_key);
 
        PrintAndLog("Div Key: %s",sprint_hex(div_key,8));
        diversifyKey(CSN,KEY, div_key);
 
        PrintAndLog("Div Key: %s",sprint_hex(div_key,8));
-       doMAC(CCNR, 12,div_key, MAC);
+       doMAC(CCNR, div_key, MAC);
 
        UsbCommand c2 = {CMD_ICLASS_ISO14443A_WRITE, {readerType,blockNo}};
        memcpy(c2.d.asBytes, bldata, 8);
 
        UsbCommand c2 = {CMD_ICLASS_ISO14443A_WRITE, {readerType,blockNo}};
        memcpy(c2.d.asBytes, bldata, 8);
Impressum, Datenschutz