//----------------------------------------------------------------------------- // Peter Fillmore 2015 // Many authors, whom made it possible // // 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 // the license. //----------------------------------------------------------------------------- // various EMV related functions. //----------------------------------------------------------------------------- #include #include "proxmark3.h" #include "apps.h" #include "util.h" #include "string.h" #include "BigBuf.h" #include "iso14443crc.h" #include "iso14443a.h" #include "emvutil.h" #include "emvdataels.h" //EMV data elements #include "emvtags.h" //EMV card structure #define DUMP(varname) Dbprintf("%s=", #varname); int EMV_DBGLEVEL = EMV_DBG_ALL; //uint8_t PCB = 0x00; //track Protocol Control Byte externally //util functions //print detected tag name over the serial link int emv_printtag(uint8_t* selected_tag, emvtags* inputcard, uint8_t* outputstring, uint8_t* outputlen) { //search tag list and print the match //get the value of the tag uint8_t tagvalue[255]; uint8_t tagvaluelen; emv_lookuptag(selected_tag, inputcard, tagvalue, &tagvaluelen); //loop through selected tag, print the value found for(int i=0; i<(sizeof(EMV_TAG_LIST)/sizeof(EMV_TAG_LIST[0])); i++){ if(!memcmp(selected_tag, EMV_TAG_LIST[i].tag, 2)){ memcpy(outputstring, EMV_TAG_LIST[i].description, strlen(EMV_TAG_LIST[i].description)); memcpy(outputstring+(strlen(EMV_TAG_LIST[i].description)), "=", 1); memcpy(outputstring+(strlen(EMV_TAG_LIST[i].description))+1, tagvalue, tagvaluelen); *outputlen = strlen(EMV_TAG_LIST[i].description) + 1 + tagvaluelen; break; } } return 0; } //returns the value of the emv tag in the supplied emvtags structure int emv_lookuptag(uint8_t* tag, emvtags *currentcard, uint8_t* outputval, uint8_t* outputvallen) { //loop through tag and return the appropriate value uint8_t returnedtag[255]; uint8_t returnedlength; memset(returnedtag, 0x00, sizeof(returnedtag)); if(!memcmp(tag, "\x4F\x00",2)){ memcpy(&returnedtag, currentcard->tag_4F, currentcard->tag_4F_len); returnedlength = currentcard->tag_4F_len; goto exitfunction;} else if(!memcmp(tag, "\x50\x00",2)){ memcpy(&returnedtag, currentcard->tag_50, currentcard->tag_50_len); returnedlength = currentcard->tag_50_len; goto exitfunction;} else if(!memcmp(tag, "\x56\x00",2)){ memcpy(&returnedtag, currentcard->tag_56, currentcard->tag_56_len); returnedlength = currentcard->tag_56_len; goto exitfunction;} else if(!memcmp(tag, "\x57\x00",2)){ memcpy(&returnedtag, currentcard->tag_57, currentcard->tag_57_len); returnedlength = currentcard->tag_57_len; goto exitfunction;} else if(!memcmp(tag, "\x5A\x00",2)){ memcpy(&returnedtag, currentcard->tag_5A, currentcard->tag_5A_len); returnedlength = currentcard->tag_5A_len; goto exitfunction;} else if(!memcmp(tag, "\x82\x00",2)){ memcpy(&returnedtag, currentcard->tag_82, sizeof(currentcard->tag_82)); returnedlength = sizeof(currentcard->tag_82);goto exitfunction;} else if(!memcmp(tag, "\x84\x00",2)){ memcpy(&returnedtag, currentcard->tag_84, currentcard->tag_84_len); returnedlength = currentcard->tag_84_len; goto exitfunction;} else if(!memcmp(tag, "\x86\x00",2)){ memcpy(&returnedtag, currentcard->tag_86, currentcard->tag_86_len); returnedlength = currentcard->tag_86_len; goto exitfunction;} else if(!memcmp(tag, "\x87\x00",2)){ memcpy(&returnedtag, currentcard->tag_87, sizeof(currentcard->tag_87)); returnedlength = sizeof(currentcard->tag_87);goto exitfunction;} else if(!memcmp(tag, "\x88\x00",2)){ memcpy(&returnedtag, currentcard->tag_88, currentcard->tag_50_len); returnedlength = sizeof(currentcard->tag_88); goto exitfunction;} else if(!memcmp(tag, "\x8A\x00",2)){ memcpy(&returnedtag, currentcard->tag_8A, sizeof(currentcard->tag_8A)); returnedlength = sizeof(currentcard->tag_8A);goto exitfunction;} else if(!memcmp(tag, "\x8C\x00",2)){ memcpy(&returnedtag, currentcard->tag_8C, currentcard->tag_8C_len); returnedlength = currentcard->tag_8C_len; goto exitfunction;} else if(!memcmp(tag, "\x8D\x00",2)){ memcpy(&returnedtag, currentcard->tag_8D, currentcard->tag_8D_len); returnedlength = currentcard->tag_8D_len; goto exitfunction;} else if(!memcmp(tag, "\x8E\x00",2)){ memcpy(&returnedtag, currentcard->tag_8E, currentcard->tag_8E_len); returnedlength = currentcard->tag_8E_len; goto exitfunction;} else if(!memcmp(tag, "\x8F\x00",2)){ memcpy(&returnedtag, currentcard->tag_8F, sizeof(currentcard->tag_8F)); returnedlength = sizeof(currentcard->tag_8F);goto exitfunction;} else if(!memcmp(tag, "\x90\x00",2)){ memcpy(&returnedtag, currentcard->tag_90, currentcard->tag_90_len); returnedlength = currentcard->tag_90_len; goto exitfunction;} else if(!memcmp(tag, "\x92\x00",2)){ memcpy(&returnedtag, currentcard->tag_92, currentcard->tag_92_len); returnedlength = currentcard->tag_92_len; goto exitfunction;} else if(!memcmp(tag, "\x93\x00",2)){ memcpy(&returnedtag, currentcard->tag_93, currentcard->tag_93_len); returnedlength = currentcard->tag_93_len; goto exitfunction;} else if(!memcmp(tag, "\x94\x00",2)){ memcpy(&returnedtag, currentcard->tag_94, currentcard->tag_94_len); returnedlength = currentcard->tag_94_len; goto exitfunction;} else if(!memcmp(tag, "\x95\x00",2)){ memcpy(&returnedtag, currentcard->tag_95, sizeof(currentcard->tag_95)); returnedlength = sizeof(currentcard->tag_95);goto exitfunction;} else if(!memcmp(tag, "\x97\x00",2)){ memcpy(&returnedtag, currentcard->tag_97, currentcard->tag_97_len); returnedlength = currentcard->tag_97_len; goto exitfunction;} else if(!memcmp(tag, "\x98\x00",2)){ memcpy(&returnedtag, currentcard->tag_98, sizeof(currentcard->tag_98)); returnedlength = sizeof(currentcard->tag_98);goto exitfunction;} else if(!memcmp(tag, "\x99\x00",2)){ memcpy(&returnedtag, currentcard->tag_99, currentcard->tag_99_len); returnedlength = currentcard->tag_99_len; goto exitfunction;} else if(!memcmp(tag, "\x9A\x00",2)){ memcpy(&returnedtag, currentcard->tag_9A, sizeof(currentcard->tag_9A)); returnedlength = sizeof(currentcard->tag_9A);goto exitfunction;} else if(!memcmp(tag, "\x9B\x00",2)){ memcpy(&returnedtag, currentcard->tag_9B, sizeof(currentcard->tag_9B)); returnedlength = sizeof(currentcard->tag_9B);goto exitfunction;} else if(!memcmp(tag, "\x9C\x00",2)){ memcpy(&returnedtag, currentcard->tag_9C, sizeof(currentcard->tag_9C)); returnedlength = sizeof(currentcard->tag_9C);goto exitfunction;} else if(!memcmp(tag, "\x9D\x00",2)){ memcpy(&returnedtag, currentcard->tag_9D, currentcard->tag_9D_len); returnedlength = currentcard->tag_9D_len; goto exitfunction;} else if(!memcmp(tag, "\x9D\x00",2)){ memcpy(&returnedtag, currentcard->tag_9D, currentcard->tag_9D_len); returnedlength = currentcard->tag_9D_len; goto exitfunction;} else if(!memcmp(tag, "\xCD\x00",2)){ memcpy(&returnedtag, currentcard->tag_CD, sizeof(currentcard->tag_CD)); returnedlength = sizeof(currentcard->tag_CD);goto exitfunction;} else if(!memcmp(tag, "\xCE\x00",2)){ memcpy(&returnedtag, currentcard->tag_CE, sizeof(currentcard->tag_CE)); returnedlength = sizeof(currentcard->tag_CE);goto exitfunction;} else if(!memcmp(tag, "\xCF\x00",2)){ memcpy(&returnedtag, currentcard->tag_CF, sizeof(currentcard->tag_CF)); returnedlength = sizeof(currentcard->tag_CF);goto exitfunction;} else if(!memcmp(tag, "\xD7\x00",2)){ memcpy(&returnedtag, currentcard->tag_D7, sizeof(currentcard->tag_D7)); returnedlength = sizeof(currentcard->tag_D7);goto exitfunction;} else if(!memcmp(tag, "\xD8\x00",2)){ memcpy(&returnedtag, currentcard->tag_D8, sizeof(currentcard->tag_D8)); returnedlength = sizeof(currentcard->tag_D8);goto exitfunction;} else if(!memcmp(tag, "\xD9\x00",2)){ memcpy(&returnedtag, currentcard->tag_D9, currentcard->tag_D9_len); returnedlength = currentcard->tag_D9_len;goto exitfunction;} else if(!memcmp(tag, "\xDA\x00",2)){ memcpy(&returnedtag, currentcard->tag_DA, sizeof(currentcard->tag_DA)); returnedlength = sizeof(currentcard->tag_DA);goto exitfunction;} else if(!memcmp(tag, "\xDB\x00",2)){ memcpy(&returnedtag, currentcard->tag_DB, sizeof(currentcard->tag_DB)); returnedlength = sizeof(currentcard->tag_DB);goto exitfunction;} else if(!memcmp(tag, "\xDC\x00",2)){ memcpy(&returnedtag, currentcard->tag_DC, sizeof(currentcard->tag_DC)); returnedlength = sizeof(currentcard->tag_DC);goto exitfunction;} else if(!memcmp(tag, "\xDD\x00",2)){ memcpy(&returnedtag, currentcard->tag_DD, sizeof(currentcard->tag_DD)); returnedlength = sizeof(currentcard->tag_DD);goto exitfunction;} else if(!memcmp(tag, "\xA5\x00",2)){ memcpy(&returnedtag, currentcard->tag_A5, currentcard->tag_A5_len); returnedlength = currentcard->tag_A5_len; goto exitfunction;} else if(!memcmp(tag, "\xAF\x00",2)){ memcpy(&returnedtag, currentcard->tag_AF, currentcard->tag_AF_len); returnedlength = currentcard->tag_AF_len; goto exitfunction;} if(*tag == 0x5F){ if(*(tag+1) == 0x20){ memcpy(&returnedtag, currentcard->tag_5F20, currentcard->tag_5F20_len); returnedlength = currentcard->tag_5F20_len; goto exitfunction;} else if(*(tag+1) == 0x24){ memcpy(&returnedtag, currentcard->tag_5F24, sizeof(currentcard->tag_5F24)); returnedlength = sizeof(currentcard->tag_5F24);goto exitfunction;} else if(*(tag+1) == 0x25){ memcpy(&returnedtag, currentcard->tag_5F25, sizeof(currentcard->tag_5F25)); returnedlength = sizeof(currentcard->tag_5F25);goto exitfunction;} else if(*(tag+1) == 0x28){ memcpy(&returnedtag, currentcard->tag_5F28, sizeof(currentcard->tag_5F28)); returnedlength = sizeof(currentcard->tag_5F28);goto exitfunction;} else if(*(tag+1) == 0x2A){ memcpy(&returnedtag, currentcard->tag_5F2A, sizeof(currentcard->tag_5F2A)); returnedlength = sizeof(currentcard->tag_5F2A);goto exitfunction;} else if(*(tag+1) == 0x2D){ memcpy(&returnedtag, currentcard->tag_5F2D, currentcard->tag_5F2D_len); returnedlength = currentcard->tag_5F2D_len; goto exitfunction;} else if(*(tag+1) == 0x30){ memcpy(&returnedtag, currentcard->tag_5F30, sizeof(currentcard->tag_5F30)); returnedlength = sizeof(currentcard->tag_5F30);goto exitfunction;} else if(*(tag+1) == 0x34){ memcpy(&returnedtag, currentcard->tag_5F34, sizeof(currentcard->tag_5F34)); returnedlength = sizeof(currentcard->tag_5F34);goto exitfunction;} else if(*(tag+1) == 0x36){ memcpy(&returnedtag, currentcard->tag_5F36, sizeof(currentcard->tag_5F36)); returnedlength = sizeof(currentcard->tag_5F36);goto exitfunction;} else if(*(tag+1) == 0x50){ memcpy(&returnedtag, currentcard->tag_5F50, currentcard->tag_5F50_len); returnedlength = currentcard->tag_5F50_len; goto exitfunction;} else if(*(tag+1) == 0x54){ memcpy(&returnedtag, currentcard->tag_5F54, currentcard->tag_5F54_len); returnedlength = currentcard->tag_5F54_len; goto exitfunction;} } if(*tag == 0x9F) { if(*(tag+1) == 0x01){ memcpy(&returnedtag, currentcard->tag_9F01, sizeof(currentcard->tag_9F01)); returnedlength = sizeof(currentcard->tag_9F01);goto exitfunction;} else if(*(tag+1) == 0x02){ memcpy(&returnedtag, currentcard->tag_9F02, sizeof(currentcard->tag_9F02)); returnedlength = sizeof(currentcard->tag_9F02);goto exitfunction;} else if(*(tag+1) == 0x03){ returnedlength = sizeof(currentcard->tag_9F03);goto exitfunction;} else if(*(tag+1) == 0x04){ memcpy(&returnedtag, currentcard->tag_9F04, sizeof(currentcard->tag_9F04)); returnedlength = sizeof(currentcard->tag_9F04);goto exitfunction;} else if(*(tag+1) == 0x05){ memcpy(&returnedtag, currentcard->tag_9F05, currentcard->tag_9F05_len); returnedlength = currentcard->tag_9F05_len; goto exitfunction;} else if(*(tag+1) == 0x06){ memcpy(&returnedtag, currentcard->tag_9F06, currentcard->tag_9F06_len); returnedlength = currentcard->tag_9F06_len; goto exitfunction;} else if(*(tag+1) == 0x07){ memcpy(&returnedtag, currentcard->tag_9F07, sizeof(currentcard->tag_9F07)); returnedlength = sizeof(currentcard->tag_9F07);goto exitfunction;} else if(*(tag+1) == 0x08){ memcpy(&returnedtag, currentcard->tag_9F08, sizeof(currentcard->tag_9F08)); returnedlength = sizeof(currentcard->tag_9F08);goto exitfunction;} else if(*(tag+1) == 0x09){ memcpy(&returnedtag, currentcard->tag_9F09, sizeof(currentcard->tag_9F09)); returnedlength = sizeof(currentcard->tag_9F09);goto exitfunction;} else if(*(tag+1) == 0x0B){ memcpy(&returnedtag, currentcard->tag_9F0B, currentcard->tag_9F0B_len); returnedlength = currentcard->tag_9F0B_len; goto exitfunction;} else if(*(tag+1) == 0x0D){ memcpy(&returnedtag, currentcard->tag_9F0D, sizeof(currentcard->tag_9F0D)); returnedlength = sizeof(currentcard->tag_9F0D);goto exitfunction;} else if(*(tag+1) == 0x0E){ memcpy(&returnedtag, currentcard->tag_9F0E, sizeof(currentcard->tag_9F0E)); returnedlength = sizeof(currentcard->tag_9F0E);goto exitfunction;} else if(*(tag+1) == 0x0F){ memcpy(&returnedtag, currentcard->tag_9F0F, sizeof(currentcard->tag_9F0F)); returnedlength = sizeof(currentcard->tag_9F0F);goto exitfunction;} else if(*(tag+1) == 0x10){ memcpy(&returnedtag, currentcard->tag_9F10, currentcard->tag_9F10_len); returnedlength = currentcard->tag_9F10_len;goto exitfunction;} else if(*(tag+1) == 0x11){ memcpy(&returnedtag, currentcard->tag_9F11, sizeof(currentcard->tag_9F11)); returnedlength = sizeof(currentcard->tag_9F11);goto exitfunction;} else if(*(tag+1) == 0x12){ memcpy(&returnedtag, currentcard->tag_9F12, currentcard->tag_9F12_len); returnedlength = currentcard->tag_9F12_len;goto exitfunction;} else if(*(tag+1) == 0x1A){ memcpy(&returnedtag, currentcard->tag_9F1A, sizeof(currentcard->tag_9F1A)); goto exitfunction;} else if(*(tag+1) == 0x1F){ memcpy(&returnedtag, currentcard->tag_9F1F, currentcard->tag_9F1F_len); returnedlength = currentcard->tag_9F1F_len; goto exitfunction;} else if(*(tag+1) == 0x32){ memcpy(&returnedtag, currentcard->tag_9F32, currentcard->tag_9F32_len); returnedlength = currentcard->tag_9F32_len; goto exitfunction;} else if(*(tag+1) == 0x34){ memcpy(&returnedtag, currentcard->tag_9F34, sizeof(currentcard->tag_9F34)); returnedlength = sizeof(currentcard->tag_9F34); goto exitfunction;} else if(*(tag+1) == 0x35){ memcpy(&returnedtag, currentcard->tag_9F35, sizeof(currentcard->tag_9F35)); returnedlength = sizeof(currentcard->tag_9F35); goto exitfunction;} else if(*(tag+1) == 0x37){ memcpy(&returnedtag, currentcard->tag_9F37, sizeof(currentcard->tag_9F37)); returnedlength = sizeof(currentcard->tag_9F37);goto exitfunction;} else if(*(tag+1) == 0x38){ memcpy(&returnedtag, currentcard->tag_9F38, currentcard->tag_9F38_len); returnedlength = currentcard->tag_9F38_len; goto exitfunction;} else if(*(tag+1) == 0x44){ memcpy(&returnedtag, currentcard->tag_9F44, sizeof(currentcard->tag_9F44)); returnedlength = sizeof(currentcard->tag_9F44);goto exitfunction;} else if(*(tag+1) == 0x45){ memcpy(&returnedtag, currentcard->tag_9F45, sizeof(currentcard->tag_9F45)); returnedlength = sizeof(currentcard->tag_9F45);goto exitfunction;} else if(*(tag+1) == 0x46){ memcpy(&returnedtag, currentcard->tag_9F46, currentcard->tag_9F46_len); returnedlength = currentcard->tag_9F46_len; goto exitfunction;} else if(*(tag+1) == 0x47){ memcpy(&returnedtag, currentcard->tag_9F47, currentcard->tag_9F47_len); returnedlength = currentcard->tag_9F47_len; goto exitfunction;} else if(*(tag+1) == 0x48){ memcpy(&returnedtag, currentcard->tag_9F48, currentcard->tag_9F48_len); returnedlength = currentcard->tag_9F48_len; goto exitfunction;} else if(*(tag+1) == 0x49){ memcpy(&returnedtag, currentcard->tag_9F49, currentcard->tag_9F49_len); returnedlength = currentcard->tag_9F49_len; goto exitfunction;} else if(*(tag+1) == 0x4A){ memcpy(&returnedtag, currentcard->tag_9F4A, sizeof(currentcard->tag_9F4A)); returnedlength = sizeof(currentcard->tag_9F4A);goto exitfunction;} else if(*(tag+1) == 0x4B){ memcpy(&returnedtag, currentcard->tag_9F4B, currentcard->tag_9F4B_len); returnedlength = currentcard->tag_9F4B_len; goto exitfunction;} else if(*(tag+1) == 0x4C){ memcpy(&returnedtag, currentcard->tag_9F4C, sizeof(currentcard->tag_9F4C)); returnedlength = sizeof(currentcard->tag_9F4C); goto exitfunction;} else if(*(tag+1) == 0x60){ memcpy(&returnedtag, currentcard->tag_9F60, sizeof(currentcard->tag_9F60)); returnedlength = sizeof(currentcard->tag_9F60);goto exitfunction;} else if(*(tag+1) == 0x61){ memcpy(&returnedtag, currentcard->tag_9F61, sizeof(currentcard->tag_9F61)); returnedlength = sizeof(currentcard->tag_9F61);goto exitfunction;} else if(*(tag+1) == 0x62){ memcpy(&returnedtag, currentcard->tag_9F62, sizeof(currentcard->tag_9F62)); returnedlength = sizeof(currentcard->tag_9F62);goto exitfunction;} else if(*(tag+1) == 0x63){ memcpy(&returnedtag, currentcard->tag_9F63, sizeof(currentcard->tag_9F63)); returnedlength = sizeof(currentcard->tag_9F63);goto exitfunction;} else if(*(tag+1) == 0x64){ memcpy(&returnedtag, currentcard->tag_9F64, sizeof(currentcard->tag_9F64)); returnedlength = sizeof(currentcard->tag_9F64);goto exitfunction;} else if(*(tag+1) == 0x65){ memcpy(&returnedtag, currentcard->tag_9F65, sizeof(currentcard->tag_9F65)); returnedlength = sizeof(currentcard->tag_9F65);goto exitfunction;} else if(*(tag+1) == 0x66){ memcpy(&returnedtag, currentcard->tag_9F66, sizeof(currentcard->tag_9F66)); returnedlength = sizeof(currentcard->tag_9F66);goto exitfunction;} else if(*(tag+1) == 0x67){ memcpy(&returnedtag, currentcard->tag_9F67, sizeof(currentcard->tag_9F67)); returnedlength = sizeof(currentcard->tag_9F67);goto exitfunction;} else if(*(tag+1) == 0x68){ memcpy(&returnedtag, currentcard->tag_9F68, currentcard->tag_9F68_len); returnedlength = currentcard->tag_9F68_len;goto exitfunction;} else if(*(tag+1) == 0x69){ memcpy(&returnedtag, currentcard->tag_9F69, currentcard->tag_9F69_len); returnedlength = currentcard->tag_9F69_len; goto exitfunction;} else if(*(tag+1) == 0x6A){ memcpy(&returnedtag, currentcard->tag_9F6A, sizeof(currentcard->tag_9F6A)); returnedlength = sizeof(currentcard->tag_9F6A);goto exitfunction;} else if(*(tag+1) == 0x6B){ memcpy(&returnedtag, currentcard->tag_9F6B, currentcard->tag_9F6B_len); returnedlength = currentcard->tag_9F6B_len; goto exitfunction;} else if(*(tag+1) == 0x6C){ memcpy(&returnedtag, currentcard->tag_9F6C, sizeof(currentcard->tag_9F6C)); returnedlength = sizeof(currentcard->tag_9F6C);goto exitfunction;} } else { if(!memcmp(tag, "\x61\x00",2)){ memcpy(&returnedtag, currentcard->tag_61, currentcard->tag_61_len); returnedlength = currentcard->tag_61_len; goto exitfunction;} else if(!memcmp(tag, "\x6F\x00",2)){ memcpy(&returnedtag, currentcard->tag_6F, currentcard->tag_6F_len); returnedlength = currentcard->tag_6F_len; goto exitfunction;} else if(!memcmp(tag, "\xAF\x00",2)){ memcpy(&returnedtag, currentcard->tag_AF, currentcard->tag_AF_len); returnedlength = currentcard->tag_AF_len; goto exitfunction;} else if(!memcmp(tag, "\x70\x00",2)){ memcpy(&returnedtag, currentcard->tag_70, currentcard->tag_70_len); returnedlength = currentcard->tag_70_len; goto exitfunction;} else if(!memcmp(tag, "\x77\x00",2)){ memcpy(&returnedtag, currentcard->tag_77, currentcard->tag_77_len); returnedlength = currentcard->tag_77_len; goto exitfunction;} else if(!memcmp(tag, "\x80\x00",2)){ memcpy(&returnedtag, currentcard->tag_80, currentcard->tag_80_len); returnedlength = currentcard->tag_80_len; goto exitfunction;} else if(!memcmp(tag, "\xBF\x0C",2)){ memcpy(&returnedtag, currentcard->tag_BF0C, currentcard->tag_BF0C_len); returnedlength = currentcard->tag_BF0C_len; goto exitfunction;} else if(!memcmp(tag, "\xFF\x01",2)){ //special DF tag memcpy(&returnedtag, currentcard->tag_DFName, currentcard->tag_DFName_len); returnedlength = currentcard->tag_DFName_len; goto exitfunction;} } exitfunction: //goto label to exit search quickly once found memcpy(outputval, &returnedtag, returnedlength); *outputvallen = returnedlength; return 0; } //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 // return -1; //} //if(strlen((const char *)datain) > 255) { // return -1; //} uint8_t datalen = strlen((const char *)datain) / 2; //length of datain for(int i=0;iATQA); Dbhexdump(sizeof(currentcard->ATQA), currentcard->ATQA, false); DUMP(currentcard->UID); Dbhexdump(currentcard->UID_len, currentcard->UID, false); DUMP(currentcard->SAK1); Dbhexdump(1, ¤tcard->SAK1, false); DUMP(currentcard->SAK2); Dbhexdump(1, ¤tcard->SAK2, false); DUMP(currentcard->ATS); Dbhexdump(currentcard->ATS_len, currentcard->ATS, false); DUMP(currentcard->tag_4F); Dbhexdump(currentcard->tag_4F_len, currentcard->tag_4F, false); DUMP(currentcard->tag_50); Dbhexdump(currentcard->tag_50_len, currentcard->tag_50, false); DUMP(currentcard->tag_56); Dbhexdump(currentcard->tag_56_len, currentcard->tag_56, false); DUMP(currentcard->tag_57); Dbhexdump(currentcard->tag_57_len, currentcard->tag_57, false); DUMP(currentcard->tag_5A); Dbhexdump(currentcard->tag_5A_len, currentcard->tag_5A, false); DUMP(currentcard->tag_82); Dbhexdump(sizeof(currentcard->tag_82), currentcard->tag_82, false); DUMP(currentcard->tag_84); Dbhexdump(currentcard->tag_84_len, currentcard->tag_84, false); DUMP(currentcard->tag_86); Dbhexdump(currentcard->tag_86_len, currentcard->tag_86, false); DUMP(currentcard->tag_87); Dbhexdump(1, currentcard->tag_87, false); DUMP(currentcard->tag_88); Dbhexdump(1, currentcard->tag_88, false); DUMP(currentcard->tag_8A); Dbhexdump(2, currentcard->tag_8A, false); DUMP(currentcard->tag_8C); Dbhexdump(currentcard->tag_8C_len, currentcard->tag_8C, false); DUMP(currentcard->tag_8D); Dbhexdump(currentcard->tag_8D_len, currentcard->tag_8D, false); DUMP(currentcard->tag_8E); Dbhexdump(currentcard->tag_8E_len, currentcard->tag_8E, false); DUMP(currentcard->tag_8F); Dbhexdump(1, currentcard->tag_8F, false); DUMP(currentcard->tag_90); Dbhexdump(currentcard->tag_90_len, currentcard->tag_90, false); DUMP(currentcard->tag_92); Dbhexdump(currentcard->tag_92_len, currentcard->tag_92, false); DUMP(currentcard->tag_93); Dbhexdump(currentcard->tag_93_len, currentcard->tag_93, false); DUMP(currentcard->tag_94); Dbhexdump(currentcard->tag_94_len, currentcard->tag_94, false); DUMP(currentcard->tag_95); Dbhexdump(5, currentcard->tag_95, false); DUMP(currentcard->tag_97); Dbhexdump(currentcard->tag_97_len, currentcard->tag_97, false); DUMP(currentcard->tag_98); Dbhexdump(20, currentcard->tag_98, false); DUMP(currentcard->tag_99); Dbhexdump(currentcard->tag_99_len, currentcard->tag_99, false); DUMP(currentcard->tag_9A); Dbhexdump(3, currentcard->tag_9A, false); DUMP(currentcard->tag_9B); Dbhexdump(2, currentcard->tag_9B, false); DUMP(currentcard->tag_9C); Dbhexdump(1, currentcard->tag_9C, false); DUMP(currentcard->tag_9D); Dbhexdump(currentcard->tag_9D_len, currentcard->tag_9D, false); DUMP(currentcard->tag_CD); Dbhexdump(3, currentcard->tag_CD, false); DUMP(currentcard->tag_CE); Dbhexdump(3, currentcard->tag_CE, false); DUMP(currentcard->tag_CF); Dbhexdump(3, currentcard->tag_CF, false); DUMP(currentcard->tag_D7); Dbhexdump(3, currentcard->tag_D7, false); DUMP(currentcard->tag_D8); Dbhexdump(2, currentcard->tag_D8, false); DUMP(currentcard->tag_D9); Dbhexdump(currentcard->tag_D9_len, currentcard->tag_D9, false); DUMP(currentcard->tag_DA); Dbhexdump(2, currentcard->tag_DA, false); DUMP(currentcard->tag_DB); Dbhexdump(2, currentcard->tag_DB, false); DUMP(currentcard->tag_DC); Dbhexdump(2, currentcard->tag_DC, false); DUMP(currentcard->tag_DD); Dbhexdump(2, currentcard->tag_DD, false); DUMP(currentcard->tag_AF); Dbhexdump(currentcard->tag_AF_len, currentcard->tag_AF, false); DUMP(currentcard->tag_5F20); Dbhexdump(currentcard->tag_5F20_len, currentcard->tag_5F20, false); DUMP(currentcard->tag_5F24); Dbhexdump(3, currentcard->tag_5F24, false); DUMP(currentcard->tag_5F25); Dbhexdump(3, currentcard->tag_5F25, false); DUMP(currentcard->tag_5F28); Dbhexdump(2, currentcard->tag_5F28, false); DUMP(currentcard->tag_5F2A); Dbhexdump(2, currentcard->tag_5F2A, false); DUMP(currentcard->tag_5F2D); Dbhexdump(currentcard->tag_5F2D_len, currentcard->tag_5F2D, false); DUMP(currentcard->tag_5F30); Dbhexdump(3, currentcard->tag_5F30, false); DUMP(currentcard->tag_5F34); Dbhexdump(1, currentcard->tag_5F34, false); DUMP(currentcard->tag_5F36); Dbhexdump(2, currentcard->tag_5F36, false); DUMP(currentcard->tag_5F50); Dbhexdump(currentcard->tag_5F50_len, currentcard->tag_5F50, false); DUMP(currentcard->tag_5F54); Dbhexdump(currentcard->tag_5F54_len, currentcard->tag_5F54, false); DUMP(currentcard->tag_9F01); Dbhexdump(6, currentcard->tag_9F01, false); DUMP(currentcard->tag_9F02); Dbhexdump(6, currentcard->tag_9F02, false); DUMP(currentcard->tag_9F03); Dbhexdump(6, currentcard->tag_9F03, false); DUMP(currentcard->tag_9F04); Dbhexdump(4, currentcard->tag_9F04, false); DUMP(currentcard->tag_9F05); Dbhexdump(currentcard->tag_9F05_len, currentcard->tag_9F05, false); DUMP(currentcard->tag_9F06); Dbhexdump(currentcard->tag_9F06_len, currentcard->tag_9F06, false); DUMP(currentcard->tag_9F07); Dbhexdump(2, currentcard->tag_9F07, false); DUMP(currentcard->tag_9F08); Dbhexdump(2, currentcard->tag_9F08, false); DUMP(currentcard->tag_9F09); Dbhexdump(2, currentcard->tag_9F09, false); DUMP(currentcard->tag_9F0B); Dbhexdump(currentcard->tag_9F0B_len, currentcard->tag_9F0B, false); DUMP(currentcard->tag_9F0D); Dbhexdump(5, currentcard->tag_9F0D, false); DUMP(currentcard->tag_9F0E); Dbhexdump(5, currentcard->tag_9F0E, false); DUMP(currentcard->tag_9F0F); Dbhexdump(5, currentcard->tag_9F0F, false); DUMP(currentcard->tag_9F10); Dbhexdump(currentcard->tag_9F10_len, currentcard->tag_9F10, false); DUMP(currentcard->tag_9F11); Dbhexdump(1, currentcard->tag_9F11, false); DUMP(currentcard->tag_9F12); Dbhexdump(currentcard->tag_9F12_len, currentcard->tag_9F12, false); DUMP(currentcard->tag_9F13); Dbhexdump(2, currentcard->tag_9F13, false); DUMP(currentcard->tag_9F14); Dbhexdump(1, currentcard->tag_9F14, false); DUMP(currentcard->tag_9F15); Dbhexdump(2, currentcard->tag_9F15, false); DUMP(currentcard->tag_9F16); Dbhexdump(15, currentcard->tag_9F16, false); DUMP(currentcard->tag_9F17); Dbhexdump(1, currentcard->tag_9F17, false); DUMP(currentcard->tag_9F18); Dbhexdump(4, currentcard->tag_9F18, false); DUMP(currentcard->tag_9F1A); Dbhexdump(2, currentcard->tag_9F1A, false); DUMP(currentcard->tag_9F1B); Dbhexdump(4, currentcard->tag_9F1B, false); DUMP(currentcard->tag_9F1C); Dbhexdump(8, currentcard->tag_9F1C, false); DUMP(currentcard->tag_9F1D); Dbhexdump(currentcard->tag_9F1D_len, currentcard->tag_9F1D, false); DUMP(currentcard->tag_9F1E); Dbhexdump(8, currentcard->tag_9F1E, false); DUMP(currentcard->tag_9F1F); Dbhexdump(currentcard->tag_9F1F_len, currentcard->tag_9F1F, false); DUMP(currentcard->tag_9F20); Dbhexdump(currentcard->tag_9F20_len, currentcard->tag_9F20, false); DUMP(currentcard->tag_9F21); Dbhexdump(3, currentcard->tag_9F1E, false); DUMP(currentcard->tag_9F22); Dbhexdump(1, currentcard->tag_9F22, false); DUMP(currentcard->tag_9F23); Dbhexdump(1, currentcard->tag_9F23, false); DUMP(currentcard->tag_9F26); Dbhexdump(8, currentcard->tag_9F26, false); DUMP(currentcard->tag_9F27); Dbhexdump(1, currentcard->tag_9F27, false); DUMP(currentcard->tag_9F2D); Dbhexdump(currentcard->tag_9F2D_len, currentcard->tag_9F2D, false); DUMP(currentcard->tag_9F2E); Dbhexdump(3, currentcard->tag_9F2E, false); DUMP(currentcard->tag_9F2F); Dbhexdump(currentcard->tag_9F2F_len, currentcard->tag_9F2F, false); DUMP(currentcard->tag_9F32); Dbhexdump(currentcard->tag_9F32_len, currentcard->tag_9F32, false); DUMP(currentcard->tag_9F33); Dbhexdump(3, currentcard->tag_9F33, false); DUMP(currentcard->tag_9F34); Dbhexdump(3, currentcard->tag_9F34, false); DUMP(currentcard->tag_9F35); Dbhexdump(1, currentcard->tag_9F35, false); DUMP(currentcard->tag_9F36); Dbhexdump(2, currentcard->tag_9F36, false); DUMP(currentcard->tag_9F37); Dbhexdump(4, currentcard->tag_9F37, false); DUMP(currentcard->tag_9F38); Dbhexdump(currentcard->tag_9F38_len, currentcard->tag_9F38, false); DUMP(currentcard->tag_9F39); Dbhexdump(1, currentcard->tag_9F39, false); DUMP(currentcard->tag_9F39); Dbhexdump(1, currentcard->tag_9F39, false); DUMP(currentcard->tag_9F40); Dbhexdump(5, currentcard->tag_9F40, false); DUMP(currentcard->tag_9F41); Dbhexdump(4, currentcard->tag_9F41, false); DUMP(currentcard->tag_9F42); Dbhexdump(2, currentcard->tag_9F42, false); DUMP(currentcard->tag_9F43); Dbhexdump(4, currentcard->tag_9F43, false); DUMP(currentcard->tag_9F44); Dbhexdump(1, currentcard->tag_9F44, false); DUMP(currentcard->tag_9F45); Dbhexdump(2, currentcard->tag_9F45, false); DUMP(currentcard->tag_9F46); Dbhexdump(currentcard->tag_9F46_len, currentcard->tag_9F46, false); DUMP(currentcard->tag_9F47); Dbhexdump(currentcard->tag_9F47_len, currentcard->tag_9F47, false); DUMP(currentcard->tag_9F48); Dbhexdump(currentcard->tag_9F48_len, currentcard->tag_9F48, false); DUMP(currentcard->tag_9F49); Dbhexdump(currentcard->tag_9F49_len, currentcard->tag_9F49, false); DUMP(currentcard->tag_9F4A); Dbhexdump(1, currentcard->tag_9F4A, false); DUMP(currentcard->tag_9F4B); Dbhexdump(currentcard->tag_9F4B_len, currentcard->tag_9F4B, false); DUMP(currentcard->tag_9F4C); Dbhexdump(8, currentcard->tag_9F4C, false); DUMP(currentcard->tag_9F4D); Dbhexdump(2, currentcard->tag_9F4D, false); DUMP(currentcard->tag_9F4E); Dbhexdump(255, currentcard->tag_9F4E, false); DUMP(currentcard->tag_9F60); Dbhexdump(2, currentcard->tag_9F60, false); DUMP(currentcard->tag_9F61); Dbhexdump(2, currentcard->tag_9F61, false); DUMP(currentcard->tag_9F62); Dbhexdump(6, currentcard->tag_9F62, false); DUMP(currentcard->tag_9F63); Dbhexdump(6, currentcard->tag_9F63, false); DUMP(currentcard->tag_9F64); Dbhexdump(1, currentcard->tag_9F64, false); DUMP(currentcard->tag_9F65); Dbhexdump(2, currentcard->tag_9F65, false); DUMP(currentcard->tag_9F66); Dbhexdump(2, currentcard->tag_9F66, false); DUMP(currentcard->tag_9F67); Dbhexdump(1, currentcard->tag_9F67, false); DUMP(currentcard->tag_9F68); Dbhexdump(currentcard->tag_9F68_len, currentcard->tag_9F68, false); DUMP(currentcard->tag_9F69); Dbhexdump(currentcard->tag_9F69_len, currentcard->tag_9F69, false); DUMP(currentcard->tag_9F6A); Dbhexdump(8, currentcard->tag_9F6A, false); DUMP(currentcard->tag_9F6B); Dbhexdump(currentcard->tag_9F6B_len, currentcard->tag_9F6B, false); DUMP(currentcard->tag_9F6C); Dbhexdump(2, currentcard->tag_9F6C, false); DUMP(currentcard->tag_61); Dbhexdump(currentcard->tag_61_len, currentcard->tag_61, false); DUMP(currentcard->tag_A5); Dbhexdump(currentcard->tag_A5_len, currentcard->tag_A5, false); DUMP(currentcard->tag_DFNAME); Dbhexdump(currentcard->tag_DFNAME_len, currentcard->tag_DFNAME, false); DUMP(currentcard->tag_70); Dbhexdump(currentcard->tag_70_len, currentcard->tag_70, false); DUMP(currentcard->tag_77); Dbhexdump(currentcard->tag_77_len, currentcard->tag_77, false); DUMP(currentcard->tag_80); Dbhexdump(currentcard->tag_80_len, currentcard->tag_80, false); DUMP(currentcard->tag_91); Dbhexdump(currentcard->tag_91_len, currentcard->tag_91, false); DUMP(currentcard->tag_BF0C); Dbhexdump(currentcard->tag_BF0C_len, currentcard->tag_BF0C, false); DUMP(currentcard->tag_DFName); Dbhexdump(currentcard->tag_DFName_len, currentcard->tag_DFName, false); }