From 466bc4599c9aa7f3a925022322646f454f08d27f Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Tue, 28 Apr 2015 20:58:18 +0200 Subject: [PATCH 1/1] CHG: fixed a better detection for Ultralight, Ultralight-C, Ultralight-EV1 tags. --see https://github.com/Proxmark/proxmark3/issues/96 -- still todo, finding a good way of detecting Magic Ultralight-C tags. -- thanks @marshmellow for pointing out proper UL-C tags responses is different. --- client/cmdhf14a.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/client/cmdhf14a.c b/client/cmdhf14a.c index 1a31c71f..15faa2bc 100644 --- a/client/cmdhf14a.c +++ b/client/cmdhf14a.c @@ -163,17 +163,10 @@ int CmdHF14AReader(const char *Cmd) return 0; } - - PrintAndLog("ATQA : %02x %02x", card.atqa[1], card.atqa[0]); PrintAndLog(" UID : %s", sprint_hex(card.uid, card.uidlen)); + PrintAndLog("ATQA : %02x %02x", card.atqa[1], card.atqa[0]); PrintAndLog(" SAK : %02x [%d]", card.sak, resp.arg[0]); - // Double & triple sized UID, can be mapped to a manufacturer. - // HACK: does this apply for Ultralight cards? - if ( card.uidlen > 4 ) { - PrintAndLog("MANUFACTURER : %s", getTagInfo(card.uid[0])); - } - switch (card.sak) { case 0x00: // check if the tag answers to GETVERSION (0x60) @@ -186,13 +179,13 @@ int CmdHF14AReader(const char *Cmd) uint8_t version[8] = {0x00}; memcpy(&version, resp.d.asBytes, resp.arg[0]); - uint8_t isOK = resp.arg[0] & 0xff; - if ( isOK ){ - // size of tag, check version[4] == 0x0b == smaller. - PrintAndLog("TYPE : NXP MIFARE Ultralight EV1 %d bytes", (version[6] == 0xB) ? 48 : 128); - } - else { - PrintAndLog("TYPE : NXP MIFARE Ultralight | Ultralight C"); + uint8_t len = resp.arg[0] & 0xff; + switch ( len){ + // todo, identify "Magic UL-C tags". // they usually have a static nonce response to 0x1A command. + // UL-EV1, size, check version[6] == 0x0b (smaller) 0x0b * 4 == 48 + case 0x0A:PrintAndLog("TYPE : NXP MIFARE Ultralight EV1 %d bytes", (version[6] == 0xB) ? 48 : 128); break; + case 0x01:PrintAndLog("TYPE : NXP MIFARE Ultralight C");break; + case 0x00:PrintAndLog("TYPE : NXP MIFARE Ultralight");break; } break; @@ -212,6 +205,12 @@ int CmdHF14AReader(const char *Cmd) default: ; } + // Double & triple sized UID, can be mapped to a manufacturer. + // HACK: does this apply for Ultralight cards? + if ( card.uidlen > 4 ) { + PrintAndLog("MANUFACTURER : %s", getTagInfo(card.uid[0])); + } + // try to request ATS even if tag claims not to support it if (select_status == 2) { uint8_t rats[] = { 0xE0, 0x80 }; // FSDI=8 (FSD=256), CID=0 -- 2.39.5