]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhflegic.c
CHG: Patch for making PM3 compatible to MCU's CDC-Host libraries Thanks to @cjbrigat...
[proxmark3-svn] / client / cmdhflegic.c
index 5bc24e9b3acbea1e4ab652e1d3508cee994ae3fd..f0fb12be8b7973ed1d2db94eb7925e35a60ccc55 100644 (file)
@@ -11,7 +11,6 @@
 
 static int CmdHelp(const char *Cmd);
 
-#define SESSION_IV 0x55
 #define MAX_LENGTH 1024        
 
 int usage_legic_calccrc8(void){
@@ -391,8 +390,8 @@ int CmdLegicDecode(const char *Cmd) {
 int CmdLegicRFRead(const char *Cmd) {
 
        // params:
-       // offset in data
-       // number of bytes.
+       // offset in data memory
+       // number of bytes to read
        char cmdp = param_getchar(Cmd, 0);
        if ( cmdp == 'H' || cmdp == 'h' ) return usage_legic_read();
        
@@ -400,17 +399,22 @@ int CmdLegicRFRead(const char *Cmd) {
        sscanf(Cmd, "%x %x %x", &offset, &len, &IV);
 
        // OUT-OF-BOUNDS check
-       if(len + offset > MAX_LENGTH) len = MAX_LENGTH - offset;
+       if ( len + offset > MAX_LENGTH ) {
+               len = MAX_LENGTH - offset;
+               PrintAndLog("Out-of-bound, shorten len to %d", len);
+       }
        
        if ( (IV & 0x7F) != IV ){
                IV &= 0x7F;
                PrintAndLog("Truncating IV to 7bits");
        }
+       
        if ( (IV & 1) == 0 ){
-               IV |= 0x01;  // IV must be odd
+               IV |= 0x01;
                PrintAndLog("LSB of IV must be SET");   
        }
-       PrintAndLog("Using IV: 0x%02x", IV);
+
+       //PrintAndLog("Using IV: 0x%02x | Offset: 0x%02x | Len: 0x%02x ", IV, offset, len);
        
        UsbCommand c = {CMD_READER_LEGIC_RF, {offset, len, IV}};
        clearCommandBuffer();
@@ -421,12 +425,14 @@ int CmdLegicRFRead(const char *Cmd) {
                uint16_t len = resp.arg[1] & 0x3FF;
                 if ( isOK ) {
                        PrintAndLog("use 'hf legic decode'");
-                }
+
                        uint8_t *data = resp.d.asBytes;
                        PrintAndLog("\nData        |");
                        PrintAndLog("-----------------------------");
                        PrintAndLog(" %s|\n", sprint_hex(data, len));
-               // }
+                } else {
+                        PrintAndLog("failed reading tag");
+                }
        } else {
                PrintAndLog("command execution time out");
                return 1;
@@ -818,28 +824,31 @@ int HFLegicInfo(const char *Cmd, bool verbose) {
        clearCommandBuffer();
     SendCommand(&c);
        UsbCommand resp;
-       if (WaitForResponseTimeout(CMD_ACK, &resp, 1000)) {
-               uint8_t isOK = resp.arg[0] & 0xFF;
-               uint16_t tagtype = resp.arg[1] & 0xFFF;
-                if ( isOK ) {
-                       PrintAndLog(" UID : %s", sprint_hex(resp.d.asBytes, 4));
-                       switch(tagtype) {
-                               case 22: PrintAndLog("MIM22 card (22bytes)"); break;
-                               case 256: PrintAndLog("MIM256 card (256bytes)"); break;
-                               case 1024: PrintAndLog("MIM1024 card (1024bytes)");     break;                          
-                               default: {
-                                       PrintAndLog("Unknown card format: %x", tagtype); 
-                                       return 1;
-                               }
-                       }               
-               } else {
-                       if ( verbose ) PrintAndLog("legic card select failed");
-                       return 1;
-               }
-       } else {
+       if (!WaitForResponseTimeout(CMD_ACK, &resp, 500)) {
                if ( verbose ) PrintAndLog("command execution time out");
                return 1;
        }
+       
+       uint8_t isOK = resp.arg[0] & 0xFF;
+       if ( !isOK ) {
+               if ( verbose ) PrintAndLog("legic card select failed");
+               return 1;
+       }
+       
+       legic_card_select_t card;
+       memcpy(&card, (legic_card_select_t *)resp.d.asBytes, sizeof(legic_card_select_t));
+
+       PrintAndLog("  UID : %s", sprint_hex(card.uid, sizeof(card.uid)));
+       switch(card.cardsize) {
+               case 22:
+               case 256: 
+               case 1024:
+                       PrintAndLog(" TYPE : MIM%d card (%d bytes)", card.cardsize, card.cardsize); break;                              
+               default: {
+                       PrintAndLog("Unknown card format: %d", card.cardsize); 
+                       return 1;
+               }
+       }
        return 0;
 }
 int CmdLegicInfo(const char *Cmd){
Impressum, Datenschutz