diff --git a/client/cmdhf.c b/client/cmdhf.c index 2ab0a659a..906c3f5b2 100644 --- a/client/cmdhf.c +++ b/client/cmdhf.c @@ -1070,7 +1070,7 @@ static command_t CommandTable[] = { {"14b", CmdHF14B, 1, "{ ISO14443B RFIDs... }"}, {"15", CmdHF15, 1, "{ ISO15693 RFIDs... }"}, {"epa", CmdHFEPA, 1, "{ German Identification Card... }"}, - {"emv", CmdHFEmv, 1, "{ EMV RFIDs... }"}, + {"emv", CmdHFEMV, 1, "{ EMV RFIDs... }"}, {"felica", CmdHFFelica, 1, "{ ISO18092 / Felica RFIDs... }"}, {"legic", CmdHFLegic, 1, "{ LEGIC RFIDs... }"}, {"iclass", CmdHFiClass, 1, "{ ICLASS RFIDs... }"}, diff --git a/client/cmdhf14a.c b/client/cmdhf14a.c index 6344f1f49..17a745f45 100644 --- a/client/cmdhf14a.c +++ b/client/cmdhf14a.c @@ -1,7 +1,8 @@ //----------------------------------------------------------------------------- -// 2011, Merlok -// 2014, Peter Fillmore // Copyright (C) 2010 iZsh , Hagen Fritsch +// 2011, 2017 Merlok +// 2014, Peter Fillmore +// 2015, 2016, 2017 Iceman // // 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 @@ -655,7 +656,7 @@ void DropField() { SendCommand(&c); } -int ExchangeAPDU14a(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int *dataoutlen) { +int ExchangeAPDU14a(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen) { uint16_t cmdc = 0; if (activateField) { @@ -667,8 +668,8 @@ int ExchangeAPDU14a(uint8_t *datain, int datainlen, bool activateField, bool lea // "Command APDU" length should be 5+255+1, but javacard's APDU buffer might be smaller - 133 bytes // https://stackoverflow.com/questions/32994936/safe-max-java-card-apdu-data-command-and-respond-size // here length USB_CMD_DATA_SIZE=512 - // timeout timeout14a * 1.06 / 100, true, size, &keyBlock[6 * c], e_sector); // timeout is (ms * 106)/10 or us*0.0106 - UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_APDU | ISO14A_SET_TIMEOUT | cmdc, (datainlen & 0xFFFF), 1000 * 1000 * 1.06 / 100}}; + // timeout must be authomatically set by "get ATS" + UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_APDU | cmdc, (datainlen & 0xFFFF), 0}}; memcpy(c.d.asBytes, datain, datainlen); SendCommand(&c); @@ -693,6 +694,12 @@ int ExchangeAPDU14a(uint8_t *datain, int datainlen, bool activateField, bool lea *dataoutlen = iLen - 2; if (*dataoutlen < 0) *dataoutlen = 0; + + if (maxdataoutlen && *dataoutlen > maxdataoutlen) { + PrintAndLog("APDU ERROR: Buffer too small(%d). Needs %d bytes", *dataoutlen, maxdataoutlen); + return 2; + } + memcpy(dataout, recv, *dataoutlen); if(!iLen) { @@ -786,7 +793,7 @@ int CmdHF14AAPDU(const char *cmd) { PrintAndLog(">>>>[%s%s%s] %s", activateField ? "sel ": "", leaveSignalON ? "keep ": "", decodeTLV ? "TLV": "", sprint_hex(data, datalen)); - int res = ExchangeAPDU14a(data, datalen, activateField, leaveSignalON, data, &datalen); + int res = ExchangeAPDU14a(data, datalen, activateField, leaveSignalON, data, USB_CMD_DATA_SIZE, &datalen); if (res) return res; diff --git a/client/cmdhf14a.h b/client/cmdhf14a.h index d1e64628f..4a348a8f9 100644 --- a/client/cmdhf14a.h +++ b/client/cmdhf14a.h @@ -1,6 +1,6 @@ //----------------------------------------------------------------------------- -// 2011, Merlok // Copyright (C) 2010 iZsh +// 2011, Merlok // 2015,216,2017 iceman, marshmellow, piwi // 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 @@ -50,7 +50,8 @@ extern int CmdHF14ACUIDs(const char *Cmd); extern char* getTagInfo(uint8_t uid); extern void DropField(); -extern int ExchangeAPDU14a(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int *dataoutlen); +extern int ExchangeAPDU14a(uint8_t *datain, int datainlen, bool activateField, bool leaveSignalON, uint8_t *dataout, int maxdataoutlen, int *dataoutlen); + extern int usage_hf_14a_sim(void); diff --git a/client/emv/cmdemv.c b/client/emv/cmdemv.c index 3c3c1f112..41d06d08c 100644 --- a/client/emv/cmdemv.c +++ b/client/emv/cmdemv.c @@ -10,6 +10,8 @@ #include "cmdemv.h" +static int CmdHelp(const char *Cmd); + int UsageCmdHFEMVSelect(void) { PrintAndLog("HELP : Executes select applet command:\n"); PrintAndLog("Usage: hf emv select [-s][-k][-a][-t] \n"); @@ -289,8 +291,6 @@ int UsageCmdHFEMVExec(void) { return 0; } -#define TLV_ADD(tag, value)( tlvdb_add(tlvRoot, tlvdb_fixed(tag, sizeof(value) - 1, (const unsigned char *)value)) ) - int CmdHFEMVExec(const char *cmd) { bool activateField = false; bool showAPDU = false; @@ -531,7 +531,6 @@ return 0; return 0; } -int CmdHelp(const char *Cmd); static command_t CommandTable[] = { {"help", CmdHelp, 1, "This help"}, {"exec", CmdHFEMVExec, 0, "Executes EMV contactless transaction."}, @@ -542,6 +541,7 @@ static command_t CommandTable[] = { }; int CmdHFEMV(const char *Cmd) { + clearCommandBuffer(); CmdsParse(CommandTable, Cmd); return 0; } diff --git a/client/emv/cmdemv.h b/client/emv/cmdemv.h index 78796efab..b94a0ea2a 100644 --- a/client/emv/cmdemv.h +++ b/client/emv/cmdemv.h @@ -27,5 +27,6 @@ int CmdHFEMV(const char *Cmd); +#define TLV_ADD(tag, value)( tlvdb_add(tlvRoot, tlvdb_fixed(tag, sizeof(value) - 1, (const unsigned char *)value)) ) #endif \ No newline at end of file