return 0;
}
+int Hf14443_4aGetCardData(iso14a_card_select_t * card) {
+ UsbCommand c = {CMD_READER_ISO_14443a, {ISO14A_CONNECT, 0, 0}};
+ SendCommand(&c);
+
+ UsbCommand resp;
+ WaitForResponse(CMD_ACK,&resp);
+
+ memcpy(card, (iso14a_card_select_t *)resp.d.asBytes, sizeof(iso14a_card_select_t));
+
+ uint64_t select_status = resp.arg[0]; // 0: couldn't read, 1: OK, with ATS, 2: OK, no ATS, 3: proprietary Anticollision
+
+ if(select_status == 0) {
+ PrintAndLog("E->iso14443a card select failed");
+ return 1;
+ }
+
+ if(select_status == 2) {
+ PrintAndLog("E->Card doesn't support iso14443-4 mode");
+ return 1;
+ }
+
+ if(select_status == 3) {
+ PrintAndLog("E->Card doesn't support standard iso14443-3 anticollision");
+ PrintAndLog("\tATQA : %02x %02x", card->atqa[1], card->atqa[0]);
+ return 1;
+ }
+
+ PrintAndLog(" UID: %s", sprint_hex(card->uid, card->uidlen));
+ PrintAndLog("ATQA: %02x %02x", card->atqa[1], card->atqa[0]);
+ PrintAndLog(" SAK: %02x [%" PRIu64 "]", card->sak, resp.arg[0]);
+ if(card->ats_len < 3) { // a valid ATS consists of at least the length byte (TL) and 2 CRC bytes
+ PrintAndLog("E-> Error ATS length(%d) : %s", card->ats_len, sprint_hex(card->ats, card->ats_len));
+ return 1;
+ }
+ PrintAndLog(" ATS: %s", sprint_hex(card->ats, card->ats_len));
+
+ return 0;
+}
+
int CmdHF14AReader(const char *Cmd) {
uint32_t cm = ISO14A_CONNECT;
bool leaveSignalON = false;
recv = resp.d.asBytes;
int iLen = resp.arg[0];
+ if(!iLen) {
+ PrintAndLog("14aRAW ERROR: No card response.");
+ return 1;
+ }
+
*dataoutlen = iLen - 2;
if (*dataoutlen < 0)
*dataoutlen = 0;
memcpy(dataout, &recv[2], *dataoutlen);
- if(!iLen) {
- PrintAndLog("14aRAW ERROR: No card response.");
- return 1;
- }
-
// CRC Check
if (iLen == -1) {
PrintAndLog("14aRAW ERROR: ISO 14443A CRC error.");
leaveSignalON = arg_get_lit(2);
decodeTLV = arg_get_lit(3);
// len = data + PCB(1b) + CRC(2b)
- CLIGetStrBLessWithReturn(4, data, &datalen, 1 + 2);
+ CLIGetHexBLessWithReturn(4, data, &datalen, 1 + 2);
CLIParserFree();