X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/323e05cc20b9c6f3235e6b94046f9aa587643c87..f2ba788536822f03dea834cd3310d9915e3b2b35:/client/cmdhflegic.c diff --git a/client/cmdhflegic.c b/client/cmdhflegic.c index 031265fa..f4d0827f 100644 --- a/client/cmdhflegic.c +++ b/client/cmdhflegic.c @@ -11,7 +11,6 @@ static int CmdHelp(const char *Cmd); -#define SESSION_IV 0x55 #define MAX_LENGTH 1024 int usage_legic_calccrc8(void){ @@ -400,28 +399,23 @@ 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("Current IV: 0x%02x", IV); + + PrintAndLog("Using IV: 0x%02x", IV); - // get some prng bytes from - uint8_t temp[32]; - legic_prng_init(IV); - for ( uint8_t j = 0; j < sizeof(temp); ++j) { - temp[j] = legic_prng_get_bit(1); - legic_prng_forward(1); - //PrintAndLog("PRNG: %s", sprint_hex(temp, sizeof(temp))); - } - PrintAndLog("PRNG: %s", sprint_bin(temp, sizeof(temp))); - UsbCommand c = {CMD_READER_LEGIC_RF, {offset, len, IV}}; clearCommandBuffer(); SendCommand(&c); @@ -828,28 +822,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){