X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/3e750be37cd8e3231ae02260be6899391d206cb4..c649c43389d23fef7d28541739c89d22ad1f5250:/client/cmdhflegic.c diff --git a/client/cmdhflegic.c b/client/cmdhflegic.c index 2200a15b..f0fb12be 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){ @@ -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,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 | Offset: 0x%02x | Len: 0x%02x ", IV, offset, len); - // 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); @@ -431,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; @@ -828,27 +824,30 @@ 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 { - PrintAndLog("legic card select failed"); + 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; } - } else { - PrintAndLog("command execution time out"); - return 1; } return 0; }