static int CmdHelp(const char *Cmd);
-#define SESSION_IV 0x55
#define MAX_LENGTH 1024
int usage_legic_calccrc8(void){
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();
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);
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;
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;
}