+//-----------------------------------------------------------------------------
+// 2011, Merlok
+// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>, Hagen Fritsch
+//
+// This code is licensed to you under the terms of the GNU GPL, version 2 or,
+// at your option, any later version. See the LICENSE.txt file for the text of
+// the license.
+//-----------------------------------------------------------------------------
+// High frequency ISO14443A commands
+//-----------------------------------------------------------------------------
+
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
+#include "util.h"
#include "iso14443crc.h"
#include "data.h"
#include "proxusb.h"
#include "ui.h"
#include "cmdparser.h"
#include "cmdhf14a.h"
+#include "common.h"
+#include "cmdmain.h"
static int CmdHelp(const char *Cmd);
prev = timestamp;
i += (len + 9);
}
- return 0;
+ return 0;
}
-int CmdHF14AMifare(const char *Cmd)
-{
- UsbCommand c = {CMD_READER_MIFARE, {strtol(Cmd, NULL, 0), 0, 0}};
- SendCommand(&c);
- return 0;
+void iso14a_set_timeout(uint32_t timeout) {
+ UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_SET_TIMEOUT, 0, timeout}};
+ SendCommand(&c);
}
int CmdHF14AReader(const char *Cmd)
{
- UsbCommand c = {CMD_READER_ISO_14443a, {strtol(Cmd, NULL, 0), 0, 0}};
- SendCommand(&c);
- return 0;
+ UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_CONNECT, 0, 0}};
+ SendCommand(&c);
+ UsbCommand * resp = WaitForResponse(CMD_ACK);
+ uint8_t * uid = resp->d.asBytes;
+ iso14a_card_select_t * card = (iso14a_card_select_t *)(uid + 12);
+
+ if(resp->arg[0] == 0) {
+ PrintAndLog("iso14443a card select failed");
+ return 0;
+ }
+
+ PrintAndLog("ATQA : %02x %02x", card->atqa[0], card->atqa[1]);
+ PrintAndLog(" UID : %s", sprint_hex(uid, 12));
+ PrintAndLog(" SAK : %02x [%d]", card->sak, resp->arg[0]);
+
+ switch (card->sak) {
+ case 0x00: PrintAndLog(" SAK : NXP MIFARE Ultralight | Ultralight C"); break;
+ case 0x04: PrintAndLog(" SAK : NXP MIFARE (various !DESFire !DESFire EV1)"); break;
+
+ case 0x08: PrintAndLog(" SAK : NXP MIFARE CLASSIC 1k | Plus 2k"); break;
+ case 0x09: PrintAndLog(" SAK : NXP MIFARE Mini 0.3k"); break;
+ case 0x10: PrintAndLog(" SAK : NXP MIFARE Plus 2k"); break;
+ case 0x11: PrintAndLog(" SAK : NXP MIFARE Plus 4k"); break;
+ case 0x18: PrintAndLog(" SAK : NXP MIFARE Classic 4k | Plus 4k"); break;
+ case 0x20: PrintAndLog(" SAK : NXP MIFARE DESFire 4k | DESFire EV1 2k/4k/8k | Plus 2k/4k | JCOP 31/41"); break;
+ case 0x24: PrintAndLog(" SAK : NXP MIFARE DESFire | DESFire EV1"); break;
+ case 0x28: PrintAndLog(" SAK : JCOP31 or JCOP41 v2.3.1"); break;
+ case 0x38: PrintAndLog(" SAK : Nokia 6212 or 6131 MIFARE CLASSIC 4K"); break;
+ case 0x88: PrintAndLog(" SAK : Infineon MIFARE CLASSIC 1K"); break;
+ case 0x98: PrintAndLog(" SAK : Gemplus MPCOS"); break;
+ default: ;
+ }
+ if(resp->arg[0] == 1)
+ PrintAndLog(" ATS : %s", sprint_hex(card->ats, card->ats_len));
+ else
+ PrintAndLog("proprietary non-iso14443a card found, RATS not supported");
+
+ return resp->arg[0];
}
// ## simulate iso14443a tag
static command_t CommandTable[] =
{
- {"help", CmdHelp, 1, "This help"},
- {"list", CmdHF14AList, 0, "List ISO 14443a history"},
- {"mifare", CmdHF14AMifare, 0, "Read out sector 0 parity error messages"},
- {"reader", CmdHF14AReader, 0, "Act like an ISO14443 Type A reader"},
- {"sim", CmdHF14ASim, 0, "<UID> -- Fake ISO 14443a tag"},
- {"snoop", CmdHF14ASnoop, 0, "Eavesdrop ISO 14443 Type A"},
+ {"help", CmdHelp, 1, "This help"},
+ {"list", CmdHF14AList, 0, "List ISO 14443a history"},
+ {"reader", CmdHF14AReader, 0, "Act like an ISO14443 Type A reader"},
+ {"sim", CmdHF14ASim, 0, "<UID> -- Fake ISO 14443a tag"},
+ {"snoop", CmdHF14ASnoop, 0, "Eavesdrop ISO 14443 Type A"},
{NULL, NULL, 0, NULL}
};
int CmdHF14A(const char *Cmd)
{
+ // flush
+ while (WaitForResponseTimeout(CMD_ACK, 500) != NULL) ;
+
+ // parse
CmdsParse(CommandTable, Cmd);
return 0;
}