From f9ba0e59faccdbed2ca9a0fda141724e85e119fc Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 8 Jul 2018 11:19:26 +0200 Subject: [PATCH] chg: 'sc list' - hooked up list command (runs 'trace list 7816' ) chg: 'sc reader' - added 's' silent parameter chg: 'sc info' - added 's' silent parameter --- client/cmdhf14a.c | 35 ++++++++++++------------- client/cmdsmartcard.c | 61 +++++++++++++++++++++++++++++++++---------- 2 files changed, 63 insertions(+), 33 deletions(-) diff --git a/client/cmdhf14a.c b/client/cmdhf14a.c index 4d4aacaa6..b00a221c8 100644 --- a/client/cmdhf14a.c +++ b/client/cmdhf14a.c @@ -191,12 +191,11 @@ int CmdHF14AList(const char *Cmd) { } int CmdHF14AReader(const char *Cmd) { - bool silent = false; uint32_t cm = ISO14A_CONNECT; - bool disconnectAfter = true; - + bool disconnectAfter = true, silent = false; int cmdp = 0; + while (param_getchar(Cmd, cmdp) != 0x00) { switch (tolower(param_getchar(Cmd, cmdp))) { case 'h': @@ -208,16 +207,15 @@ int CmdHF14AReader(const char *Cmd) { disconnectAfter = false; break; case 's': - silent = true; - break; + silent = true; + break; case 'x': cm &= ~ISO14A_CONNECT; break; default: PrintAndLogEx(WARNING, "Unknown command."); return 1; - } - + } cmdp++; } @@ -225,7 +223,6 @@ int CmdHF14AReader(const char *Cmd) { cm |= ISO14A_NO_DISCONNECT; UsbCommand c = {CMD_READER_ISO_14443a, {cm, 0, 0}}; - clearCommandBuffer(); SendCommand(&c); @@ -1020,17 +1017,17 @@ int CmdHF14AAntiFuzz(const char *cmd) { } static command_t CommandTable[] = { - {"help", CmdHelp, 1, "This help"}, - {"list", CmdHF14AList, 0, "[Deprecated] List ISO 14443-a history"}, - {"info", CmdHF14AInfo, 0, "Tag information"}, - {"reader", CmdHF14AReader, 0, "Act like an ISO14443-a reader"}, - {"cuids", CmdHF14ACUIDs, 0, " Collect n>0 ISO14443-a UIDs in one go"}, - {"sim", CmdHF14ASim, 0, " -- Simulate ISO 14443-a tag"}, - {"sniff", CmdHF14ASniff, 0, "sniff ISO 14443-a traffic"}, - {"apdu", CmdHF14AAPDU, 0, "Send ISO 14443-4 APDU to tag"}, - {"raw", CmdHF14ACmdRaw, 0, "Send raw hex data to tag"}, - {"antifuzz", CmdHF14AAntiFuzz, 0, "Fuzzing the anticollision phase. Warning! Readers may react strange"}, - {NULL, NULL, 0, NULL} + {"help", CmdHelp, 1, "This help"}, + {"list", CmdHF14AList, 0, "[Deprecated] List ISO 14443-a history"}, + {"info", CmdHF14AInfo, 0, "Tag information"}, + {"reader", CmdHF14AReader, 0, "Act like an ISO14443-a reader"}, + {"cuids", CmdHF14ACUIDs, 0, " Collect n>0 ISO14443-a UIDs in one go"}, + {"sim", CmdHF14ASim, 0, " -- Simulate ISO 14443-a tag"}, + {"sniff", CmdHF14ASniff, 0, "sniff ISO 14443-a traffic"}, + {"apdu", CmdHF14AAPDU, 0, "Send ISO 14443-4 APDU to tag"}, + {"raw", CmdHF14ACmdRaw, 0, "Send raw hex data to tag"}, + {"antifuzz", CmdHF14AAntiFuzz, 0, "Fuzzing the anticollision phase. Warning! Readers may react strange"}, + {NULL, NULL, 0, NULL} }; int CmdHF14A(const char *Cmd) { diff --git a/client/cmdsmartcard.c b/client/cmdsmartcard.c index 04eede4da..283021603 100644 --- a/client/cmdsmartcard.c +++ b/client/cmdsmartcard.c @@ -211,38 +211,68 @@ int CmdSmartUpgrade(const char *Cmd) { } int CmdSmartInfo(const char *Cmd){ - uint8_t cmdp = 0; - bool errors = false; + bool errors = false, silent = false; while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { case 'h': return usage_sm_info(); + case 's': + silent = true; + break; default: PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); errors = true; break; } + cmdp++; } //Validations if (errors || cmdp == 0 ) return usage_sm_info(); - + + UsbCommand c = {CMD_SMART_ATR, {0, 0, 0}}; + clearCommandBuffer(); + SendCommand(&c); + UsbCommand resp; + if ( !WaitForResponseTimeout(CMD_ACK, &resp, 2500) ) { + if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); + return 1; + } + + uint8_t isok = resp.arg[0] & 0xFF; + if (!isok) { + if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); + return 1; + } + + smart_card_atr_t card; + memcpy(&card, (smart_card_atr_t *)resp.d.asBytes, sizeof(smart_card_atr_t)); + + // print header + PrintAndLogEx(INFO, "\n--- Smartcard Information ---------"); + PrintAndLogEx(INFO, "-------------------------------------------------------------"); + PrintAndLogEx(INFO, "ATR : %s", sprint_hex(card.atr, sizeof(card.atr_len))); + PrintAndLogEx(INFO, "\n todo - look up ATR "); return 0; } int CmdSmartReader(const char *Cmd){ - uint8_t cmdp = 0; - bool errors = false; + bool errors = false, silent = false; + while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { - case 'h': return usage_sm_reader(); + case 'h': return usage_sm_reader(); + case 's': + silent = true; + break; default: PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); errors = true; break; } + cmdp++; } //Validations @@ -253,27 +283,30 @@ int CmdSmartReader(const char *Cmd){ SendCommand(&c); UsbCommand resp; if ( !WaitForResponseTimeout(CMD_ACK, &resp, 2500) ) { - PrintAndLogEx(WARNING, "timeout while waiting for reply."); + if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); return 1; } uint8_t isok = resp.arg[0] & 0xFF; if (!isok) { - PrintAndLogEx(FAILED, "failed to get ATR"); + if (!silent) PrintAndLogEx(WARNING, "smart card select failed"); return 1; } + smart_card_atr_t card; + memcpy(&card, (smart_card_atr_t *)resp.d.asBytes, sizeof(smart_card_atr_t)); - smart_card_atr_t *card = (smart_card_atr_t *)resp.d.asBytes; - - // print header - PrintAndLogEx(INFO, "\n--- Smartcard Information ---------"); - PrintAndLogEx(INFO, "-------------------------------------------------------------"); - PrintAndLogEx(INFO, "ATR : %s", sprint_hex(card->atr, sizeof(card->atr_len))); + PrintAndLogEx(INFO, "ATR : %s", sprint_hex(card.atr, sizeof(card.atr_len))); + return 0; +} + +int CmdSmartList(const char *Cmd) { + CmdTraceList("7816"); return 0; } static command_t CommandTable[] = { {"help", CmdHelp, 1, "This help"}, + {"list", CmdSmartList, 0, "List ISO 7816 history"}, {"info", CmdSmartInfo, 1, "Tag information [rdv40]"}, {"reader", CmdSmartReader, 1, "Act like an IS07816 reader [rdv40]"}, {"raw", CmdSmartRaw, 1, "Send raw hex data to tag [rdv40]"},