#include "cmdhf14a.h"
#include "common.h"
#include "cmdmain.h"
+#include "sleep.h"
static int CmdHelp(const char *Cmd);
int CmdHF14AList(const char *Cmd)
{
uint8_t got[1920];
- GetFromBigBuf(got, sizeof(got));
+ GetFromBigBuf(got,sizeof(got),0);
PrintAndLog("recorded activity:");
PrintAndLog(" ETU :rssi: who bytes");
int CmdHF14AReader(const char *Cmd)
{
UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_CONNECT, 0, 0}};
+ char param[256]={0};
+
+ if( 3 == param_getstr(Cmd,0,param) && !strcmp("con",param))
+ {
+ c.arg[0]|=ISO14A_NO_DISCONNECT;
+ PrintAndLog("KEEP connected!\n");
+ }
+
+ if( 3 == param_getstr(Cmd,0,param) && !strcmp("dis",param))
+ {
+ c.arg[0] = 0;
+ PrintAndLog("disconnected!\n");
+ SendCommand(&c);
+ return 0;
+ }
+
SendCommand(&c);
UsbCommand * resp = WaitForResponse(CMD_ACK);
uint8_t * uid = resp->d.asBytes;
return resp->arg[0];
}
+// Collect ISO14443 Type A UIDs
+int CmdHF14ACUIDs(const char *Cmd)
+{
+ // requested number of UIDs
+ int n = atoi(Cmd);
+ // collect at least 1 (e.g. if no parameter was given)
+ n = n > 0 ? n : 1;
+
+ PrintAndLog("Collecting %d UIDs", n);
+ PrintAndLog("Start: %u", time(NULL));
+ // repeat n times
+ for (int i = 0; i < n; i++) {
+ // execute anticollision procedure
+ 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);
+
+ // check if command failed
+ if (resp->arg[0] == 0) {
+ PrintAndLog("Card select failed.");
+ } else {
+ // check if UID is 4 bytes
+ if ((card->atqa[1] & 0xC0) == 0) {
+ PrintAndLog("%02X%02X%02X%02X",
+ *uid, *(uid + 1), *(uid + 2), *(uid + 3));
+ } else {
+ PrintAndLog("UID longer than 4 bytes");
+ }
+ }
+ }
+ PrintAndLog("End: %u", time(NULL));
+
+ return 1;
+}
+
// ## simulate iso14443a tag
// ## greg - added ability to specify tag UID
int CmdHF14ASim(const char *Cmd)
return 0;
}
+int CmdHF14AFuzz(const char *Cmd) {
+ char formatstr[256] = {0},sendbuf[256] = {0};
+ uint32_t start=0,end=0;
+
+ if (param_getchar(Cmd, 0) == 0) {
+ PrintAndLog("fuzz raw hex data to the card and show response <ONLY for develepers>");
+ PrintAndLog("Usage: hf 14a fuzz <FORMAT> [<start index> <end index>]");
+ PrintAndLog("FORMAT controls the output as in C printf");
+ PrintAndLog("sample: hf 14a fuzz 909F");
+ PrintAndLog(" hf 14a fuzz 00%02x00000000 0 0xFF");
+ return 0;
+ }
+
+ start = param_get8ex(Cmd, 1, 0,16);
+ end = param_get8ex(Cmd, 2, 0,16);
+ param_getstr(Cmd, 0, formatstr);
+
+ for( int i=start;i<=end;++i)
+ {
+ snprintf(sendbuf, sizeof(sendbuf), formatstr, i);
+
+ int len = strlen(sendbuf)/2;
+
+ UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_APDU|ISO14A_NO_DISCONNECT, len, 0}};
+ param_gethex(sendbuf, 0, c.d.asBytes, len*2);
+ PrintAndLog("len:%d raw:",len);
+ PrintAndLog("%s",sprint_hex(c.d.asBytes, len));
+ SendCommand(&c);
+
+ UsbCommand * resp = WaitForResponse(CMD_ACK);
+ PrintAndLog("res:%d",resp->arg[0]);
+
+ while(resp->arg[0] > sizeof(resp->d))
+ {
+ PrintAndLog("%s", sprint_hex(resp->d.asBytes,sizeof(resp->d)));
+
+ resp = WaitForResponse(CMD_ACK);
+ }
+ PrintAndLog("%s", sprint_hex(resp->d.asBytes,resp->arg[0]));
+
+ PrintAndLog("");
+
+ msleep(100);
+ }
+
+ return 0;
+}
+
static command_t CommandTable[] =
{
- {"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"},
+ {"help", CmdHelp, 1, "This help"},
+ {"list", CmdHF14AList, 0, "List ISO 14443a history"},
+ {"reader", CmdHF14AReader, 0, "Act like an ISO14443 Type A reader"},
+ {"cuids", CmdHF14ACUIDs, 0, "<n> Collect n>0 ISO14443 Type A UIDs in one go"},
+ {"sim", CmdHF14ASim, 0, "<UID> -- Fake ISO 14443a tag"},
+ {"snoop", CmdHF14ASnoop, 0, "Eavesdrop ISO 14443 Type A"},
+ {"fuzz", CmdHF14AFuzz, 0, "Fuzz"},
{NULL, NULL, 0, NULL}
};