mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-02-13 02:34:48 +08:00
chg: emv commands should now compile. no testing done.
This commit is contained in:
parent
647411d10d
commit
9959d5c1e7
5 changed files with 21 additions and 12 deletions
|
@ -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... }"},
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// 2011, Merlok
|
||||
// 2014, Peter Fillmore
|
||||
// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>, 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;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
//-----------------------------------------------------------------------------
|
||||
// 2011, Merlok
|
||||
// Copyright (C) 2010 iZsh <izsh at fail0verflow.com>
|
||||
// 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);
|
||||
|
|
|
@ -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] <HEX applet AID>\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;
|
||||
}
|
||||
|
|
|
@ -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
|
Loading…
Reference in a new issue