X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/a501c82b196b614295a6e3bf7481da84affb0d8e..b6901e17c8a44e2f5b062e640df238d14ab4eadc:/armsrc/epa.c diff --git a/armsrc/epa.c b/armsrc/epa.c index a3c6669e..9012bf11 100644 --- a/armsrc/epa.c +++ b/armsrc/epa.c @@ -15,6 +15,7 @@ #include "epa.h" #include "../common/cmd.h" + // Protocol and Parameter Selection Request // use regular (1x) speed in both directions // CRC is already included @@ -108,9 +109,9 @@ size_t EPA_Parse_CardAccess(uint8_t *data, if (data[index] == 0x31 || data[index] == 0x30) { // enter the set (skip tag + length) index += 2; - // extended length + // check for extended length if ((data[index - 1] & 0x80) != 0) { - index += (data[index] & 0x7F); + index += (data[index-1] & 0x7F); } } // OID @@ -258,10 +259,6 @@ void EPA_PACE_Collect_Nonce(UsbCommand *c) return; } - // increase the timeout (at least some cards really do need this!) - iso14a_set_timeout(0x0002FFFF); - Dbprintf("epa: Epic!"); - // read the CardAccess file // this array will hold the CardAccess file uint8_t card_access[256] = {0}; @@ -423,89 +420,29 @@ int EPA_PACE_MSE_Set_AT(pace_version_info_t pace_version_info, uint8_t password) //----------------------------------------------------------------------------- int EPA_Setup() { - // return code - //int return_code = 0; - - // card UID - //uint8_t uid[10] = {0x00}; - + + int return_code = 0; + uint8_t uid[10]; + uint8_t pps_response[3]; + uint8_t pps_response_par[1]; + iso14a_card_select_t card_select_info; + // power up the field iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD); - iso14a_clear_trace(); - iso14a_set_tracing(TRUE); - iso14a_set_timeout(10500); - - // card select information - byte_t cardbuf[USB_CMD_DATA_SIZE]; - memset(cardbuf,0,USB_CMD_DATA_SIZE); - iso14a_card_select_t *card = (iso14a_card_select_t*)cardbuf; // select the card - // if (!iso14443a_select_card(uid, &card_info, NULL)) { - // Dbprintf("Epa: Can't select card"); - // return -1; - // } - - uint8_t wupa[] = { 0x26 }; // 0x26 - REQA 0x52 - WAKE-UP - uint8_t sel_all[] = { 0x93,0x20 }; - uint8_t sel_uid[] = { 0x93,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; - uint8_t rats[] = { 0xE0,0x81,0x00,0x00 }; // FSD=256, FSDI=8, CID=1 - - uint8_t *resp = ((uint8_t *)BigBuf) + RECV_RESP_OFFSET; - uint8_t *resp_par = ((uint8_t *)BigBuf) + RECV_RESP_PAR_OFFSET; - - byte_t uid_resp[4]; - size_t uid_resp_len = 4; - - uint8_t sak = 0x04; // cascade uid - int len; - - // Broadcast for a card, WUPA (0x52) will force response from all cards in the field - ReaderTransmitBitsPar(wupa,7,0, NULL); - - // Receive the ATQA - if(!ReaderReceive(resp, resp_par)) return -1; - - // SELECT_ALL - ReaderTransmit(sel_all,sizeof(sel_all), NULL); - if (!ReaderReceive(resp, resp_par)) return -1; - - // uid response from tag - memcpy(uid_resp,resp,uid_resp_len); - - // Construct SELECT UID command - // transmitting a full UID (1 Byte cmd, 1 Byte NVB, 4 Byte UID, 1 Byte BCC, 2 Bytes CRC) - memcpy(sel_uid+2,uid_resp,4); // the UID - sel_uid[6] = sel_uid[2] ^ sel_uid[3] ^ sel_uid[4] ^ sel_uid[5]; // calculate and add BCC - AppendCrc14443a(sel_uid,7); // calculate and add CRC - ReaderTransmit(sel_uid,sizeof(sel_uid), NULL); - - // Receive the SAK - if (!ReaderReceive(resp, resp_par)) return -1; - sak = resp[0]; - - // Request for answer to select - AppendCrc14443a(rats, 2); - ReaderTransmit(rats, sizeof(rats), NULL); - - if ( !(len = ReaderReceive(resp, resp_par) )) return -1; + return_code = iso14443a_select_card(uid, &card_select_info, NULL); + if (return_code != 1) { + Dbprintf("Epa: Can't select card"); + return 1; + } - // populate the collected data. - memcpy( card->uid, uid_resp, uid_resp_len); - card->uidlen += uid_resp_len; - card->sak = sak; - card->ats_len = len; - memcpy(card->ats, resp, sizeof(card->ats)); - - // send the PPS request - // ReaderTransmit((uint8_t *)pps, sizeof(pps), NULL); - // uint8_t pps_response[3]; - // uint8_t pps_response_par[1]; - // return_code = ReaderReceive(pps_response,pps_response_par); - // if (return_code != 3 || pps_response[0] != 0xD0) { - // return return_code == 0 ? 2 : return_code; - // } + ReaderTransmit((uint8_t *)pps, sizeof(pps), NULL); + return_code = ReaderReceive(pps_response, pps_response_par); + if (return_code != 3 || pps_response[0] != 0xD0) { + return return_code == 0 ? 2 : return_code; + } - return -1; + return 0; } \ No newline at end of file