#include "epa.h"
#include "../common/cmd.h"
+
// Protocol and Parameter Selection Request
// use regular (1x) speed in both directions
// CRC is already included
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
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};
//-----------------------------------------------------------------------------
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