From 3e83ff215963589f2443f4e5f82e286c5accd38b Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sun, 5 Feb 2017 21:09:36 +0100 Subject: [PATCH] CHG: '-DWITH_EMV' - fixing some compilation errors when compiling with peter fillmore's emv code. Warning a 256kb Proxmark3 device will only have 7% memory left if you enable this --- armsrc/emvcmd.c | 29 +++++++++++++++-------------- armsrc/emvdataels.c | 8 +------- armsrc/emvdataels.h | 43 ++++++++++++++++++++++++------------------- armsrc/emvutil.c | 34 ++++++++++++++++++---------------- armsrc/util.c | 30 ++++++++++++++++++++++++++++++ armsrc/util.h | 1 + client/proxmark3.c | 3 ++- 7 files changed, 91 insertions(+), 57 deletions(-) diff --git a/armsrc/emvcmd.c b/armsrc/emvcmd.c index f3953fa7..8b93ad9d 100644 --- a/armsrc/emvcmd.c +++ b/armsrc/emvcmd.c @@ -11,14 +11,14 @@ #include "emvcmd.h" static emvtags currentcard; //use to hold emv tags for the reader/card during communications -static tUart Uart; +//static tUart Uart; // The FPGA will report its internal sending delay in uint16_t FpgaSendQueueDelay; //variables used for timing purposes: //these are in ssp_clk cycles: //static uint32_t NextTransferTime; -static uint32_t LastTimeProxToAirStart; +//static uint32_t LastTimeProxToAirStart; //static uint32_t LastProxToAirDuration; //load individual tag into current card @@ -128,7 +128,6 @@ int EMVGetProcessingOptions(uint8_t *PDOL, uint8_t PDOLlen, emvtags* inputcard) int EMVGetChallenge(emvtags* inputcard) { uint8_t receivedAnswer[MAX_FRAME_SIZE]; - //uint8_t receivedAnswerPar[MAX_PARITY_SIZE]; //variables //tlvtag inputtag; //create the tag structure //perform select @@ -146,7 +145,6 @@ int EMVGenerateAC(uint8_t refcontrol, emvtags* inputcard) uint8_t cdolcommandlen = 0; tlvtag temptag; - //uint8_t receivedAnswerPar[MAX_PARITY_SIZE]; if(currentcard.tag_8C_len > 0) { emv_generateDOL(currentcard.tag_8C, currentcard.tag_8C_len, ¤tcard, cdolcommand, &cdolcommandlen); } else{ @@ -184,10 +182,9 @@ int EMV_PaywaveTransaction() else if((currentcard.tag_9F66[0] & 0x80) == 0x80) { if((currentcard.tag_9F66[1] & 0x80) == 1) { //CVN17 cardMode = VISA_CVN17; - } - else{ + } else { cardMode = VISA_DCVV; - } + } } EMVSelectAID(currentcard.tag_4F,currentcard.tag_4F_len, ¤tcard); //perform second AID command @@ -243,7 +240,7 @@ int EMV_PaywaveTransaction() EMVReadRecord(4,2,¤tcard); } //EMVGetChallenge(¤tcard); - //memcpy(currentcard.tag_9F4C,&responsebuffer[1],8); // ICC UN + //memcpy(currentcard.tag_9F4C,&responsebuffer[1],8); // ICC UN EMVGenerateAC(0x81,¤tcard); Dbprintf("CARDMODE=%i",cardMode); @@ -383,6 +380,8 @@ void EMVdumpcard(void){ //----------------------------------------------------------------------------- void SimulateEMVcard() { + /* + //uint8_t sak; //select ACKnowledge uint16_t readerPacketLen = 64; //reader packet length - provided by RATS, default to 64 bytes if RATS not supported @@ -548,17 +547,17 @@ void SimulateEMVcard() currentblock = receivedCmd[0] & 0x01; if(receivedCmd[0] == 0x26) { // Received a REQUEST - p_response = &responses[ATR]; order = REQA; + p_response = &responses[ATR]; order = ISO14443A_CMD_REQA; } else if(receivedCmd[0] == 0x52) { // Received a WAKEUP - p_response = &responses[ATR]; order = WUPA; + p_response = &responses[ATR]; order = ISO14443A_CMD_WUPA; } else if(receivedCmd[1] == 0x20 && receivedCmd[0] == 0x93) { // Received request for UID (cascade 1) - p_response = &responses[UID1]; order = SELUID1; + p_response = &responses[UID1]; order = ISO14443A_CMD_ANTICOLL_OR_SELECT; } else if(receivedCmd[1] == 0x20 && receivedCmd[0] == 0x95) { // Received request for UID (cascade 2) - p_response = &responses[UID2]; order = SELUID2; + p_response = &responses[UID2]; order = ISO14443A_CMD_ANTICOLL_OR_SELECT_2; } else if(receivedCmd[1] == 0x70 && receivedCmd[0] == 0x93) { // Received a SELECT (cascade 1) - p_response = &responses[SELACK1]; order = SEL1; + p_response = &responses[SELACK1]; order = ISO14443A_CMD_ANTICOLL_OR_SELECT; } else if(receivedCmd[1] == 0x70 && receivedCmd[0] == 0x95) { // Received a SELECT (cascade 2) - p_response = &responses[SELACK2]; order = SEL2; + p_response = &responses[SELACK2]; order = ISO14443A_CMD_ANTICOLL_OR_SELECT_2; } else if((receivedCmd[0] & 0xA2) == 0xA2){ //R-Block received if(previousblock == currentblock){ //rule 11, retransmit last block p_response = &dynamic_response_info; @@ -731,4 +730,6 @@ void SimulateEMVcard() Dbprintf("%x %x %x", happened, happened2, cmdsRecvd); LED_A_OFF(); BigBuf_free_keep_EM(); + + */ } diff --git a/armsrc/emvdataels.c b/armsrc/emvdataels.c index da64a6f4..48015be4 100644 --- a/armsrc/emvdataels.c +++ b/armsrc/emvdataels.c @@ -3,12 +3,6 @@ #include "emvdataels.h" -//Known AIDs -struct tagdescription { - uint8_t tag[2]; - char description[255]; -}; - const uint8_t AID_VISA[] = {0xa0,0x00,0x00,0x00,0x03}; const uint8_t AID_VISA_DB[] = {0xa0,0x00,0x00,0x00,0x03,0x10,0x10}; const uint8_t AID_VISA_C[] = {0xa0,0x00,0x00,0x00,0x03,0x10,0x10,0x01}; @@ -44,7 +38,7 @@ const uint8_t PIN_BLOCKED[] = {0x69,0x84}; const uint8_t PIN_BLOCKED2[] = {0x69,0x84}; const uint8_t PIN_WRONG[] = {0x63}; -const tagdescription EMV_TAG_LIST[] = { +const tagdescription_t EMV_TAG_LIST[62] = { {"\x4f\x00","Application Identifier (AID)"}, {"\x50\x00","Application Label"}, {"\x57\x00","Track 2 Equivalent Data"}, diff --git a/armsrc/emvdataels.h b/armsrc/emvdataels.h index ad46e9f4..cb714791 100644 --- a/armsrc/emvdataels.h +++ b/armsrc/emvdataels.h @@ -4,16 +4,20 @@ #include -typedef struct tagdescription tagdescription; +//Known AIDs +typedef struct { + uint8_t tag[2]; + char description[255]; +} __attribute__((__packed__)) tagdescription_t; //Known AIDs extern const uint8_t AID_VISA[5]; -extern const uint8_t AID_VISA_DB[7] ; -extern const uint8_t AID_VISA_C[8] ; -extern const uint8_t AID_VISA_D[8] ; -extern const uint8_t AID_VISA_E[7] ; -extern const uint8_t AID_VISA_I[7] ; -extern const uint8_t AID_VISA_P[7] ; +extern const uint8_t AID_VISA_DB[7]; +extern const uint8_t AID_VISA_C[8]; +extern const uint8_t AID_VISA_D[8]; +extern const uint8_t AID_VISA_E[7]; +extern const uint8_t AID_VISA_I[7]; +extern const uint8_t AID_VISA_P[7]; extern const uint8_t AID_VISA_ATM[8]; extern const uint8_t AID_MASTERCARD[7]; extern const uint8_t AID_MAESTRO[7]; @@ -21,22 +25,23 @@ extern const uint8_t AID_MAESTRO_UK[7]; extern const uint8_t AID_MAESTRO_TEST[5]; extern const uint8_t AID_SELF_SERVICE[6]; extern const uint8_t AID_AMEX[5]; -extern const uint8_t AID_EXPRESSPAY[]; +extern const uint8_t AID_EXPRESSPAY[8]; extern const uint8_t AID_LINK[7]; extern const uint8_t AID_ALIAS[7]; //Master data file for PSE -extern const uint8_t DF_PSE[]; -extern const tagdescription EMV_TAG_LIST[62]; //SW1 return values -extern const uint8_t SW1_RESPONSE_BYTES[]; -extern const uint8_t SW1_WRONG_LENGTH[] ; -extern const uint8_t SW12_OK[]; -extern const uint8_t SW12_NOT_SUPPORTED[] ; -extern const uint8_t SW12_NOT_FOUND[]; -extern const uint8_t SW12_COND_NOT_SAT[]; -extern const uint8_t PIN_BLOCKED[] ; -extern const uint8_t PIN_BLOCKED2[] ; -extern const uint8_t PIN_WRONG[] ; +extern const uint8_t DF_PSE[14]; +extern const uint8_t SW1_RESPONSE_BYTES[1]; +extern const uint8_t SW1_WRONG_LENGTH[1]; +extern const uint8_t SW12_OK[2]; +extern const uint8_t SW12_NOT_SUPPORTED[2]; +extern const uint8_t SW12_NOT_FOUND[2]; +extern const uint8_t SW12_COND_NOT_SAT[2]; +extern const uint8_t PIN_BLOCKED[2]; +extern const uint8_t PIN_BLOCKED2[2]; +extern const uint8_t PIN_WRONG[1]; + +extern const tagdescription_t EMV_TAG_LIST[62]; //SW1 return values //AIP bitmasks details #define AIP_CHIP_SUPPORTED 0x80 diff --git a/armsrc/emvutil.c b/armsrc/emvutil.c index c4c29613..6fd60f75 100644 --- a/armsrc/emvutil.c +++ b/armsrc/emvutil.c @@ -370,14 +370,18 @@ exitfunction: //goto label to exit search quickly once found //function to int emv_settag(uint32_t tag, uint8_t *datain, emvtags *currentcard){ char binarydata[255] = {0}; - //if((strlen((const char *)datain)%2) != 0){ //must be an even string + + /* + // if((strlen((const char *)datain)%2) != 0){ //must be an even string // return -1; - //} - //if(strlen((const char *)datain) > 255) { + // } + // if(strlen((const char *)datain) > 255) { // return -1; - //} - uint8_t datalen = strlen((const char *)datain) / 2; //length of datain - for(int i=0;i