fix return codes for 14b, sorting out status checks in client

This commit is contained in:
iceman1001 2020-09-26 09:33:36 +02:00
commit b4728157fb
3 changed files with 76 additions and 73 deletions

View file

@ -1139,7 +1139,7 @@ static void CodeAndTransmit14443bAsReader(const uint8_t *cmd, int len, uint32_t
/* Sends an APDU to the tag /* Sends an APDU to the tag
* TODO: check CRC and preamble * TODO: check CRC and preamble
*/ */
uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *response, uint16_t respmaxlen) { int iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *response, uint16_t respmaxlen) {
LED_A_ON(); LED_A_ON();
uint8_t message_frame[message_length + 4]; uint8_t message_frame[message_length + 4];
@ -1158,7 +1158,7 @@ uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *r
uint32_t eof_time = 0; uint32_t eof_time = 0;
CodeAndTransmit14443bAsReader(message_frame, sizeof(message_frame), &start_time, &eof_time); CodeAndTransmit14443bAsReader(message_frame, sizeof(message_frame), &start_time, &eof_time);
// get response // Get response?
if (response == NULL) { if (response == NULL) {
LED_A_OFF(); LED_A_OFF();
return 0; return 0;
@ -1170,13 +1170,13 @@ uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *r
if (retlen < 3) { if (retlen < 3) {
LED_A_OFF(); LED_A_OFF();
return 0; return -1;
} }
// VALIDATE CRC // VALIDATE CRC
if (!check_crc(CRC_14443_B, response, retlen)) { if (!check_crc(CRC_14443_B, response, retlen)) {
if (DBGLEVEL > DBG_DEBUG) DbpString("CRC fail"); if (DBGLEVEL > DBG_DEBUG) DbpString("CRC fail");
return 0; return -2;
} }
return retlen; return retlen;
@ -1185,7 +1185,7 @@ uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *r
/** /**
* SRx Initialise. * SRx Initialise.
*/ */
static uint8_t iso14443b_select_srx_card(iso14b_card_select_t *card) { static int iso14443b_select_srx_card(iso14b_card_select_t *card) {
// INITIATE command: wake up the tag using the INITIATE // INITIATE command: wake up the tag using the INITIATE
static const uint8_t init_srx[] = { ISO14443B_INITIATE, 0x00, 0x97, 0x5b }; static const uint8_t init_srx[] = { ISO14443B_INITIATE, 0x00, 0x97, 0x5b };
uint8_t r_init[3] = {0x0}; uint8_t r_init[3] = {0x0};
@ -1201,7 +1201,7 @@ static uint8_t iso14443b_select_srx_card(iso14b_card_select_t *card) {
FpgaDisableTracing(); FpgaDisableTracing();
if (retlen <= 0) if (retlen <= 0)
return 2; return -1;
// Randomly generated Chip ID // Randomly generated Chip ID
if (card) { if (card) {
@ -1222,17 +1222,17 @@ static uint8_t iso14443b_select_srx_card(iso14b_card_select_t *card) {
FpgaDisableTracing(); FpgaDisableTracing();
if (retlen != 3) { if (retlen != 3) {
return 2; return -1;
} }
// Check the CRC of the answer: // Check the CRC of the answer:
if (!check_crc(CRC_14443_B, r_select, retlen)) { if (!check_crc(CRC_14443_B, r_select, retlen)) {
return 3; return -2;
} }
// Check response from the tag: should be the same UID as the command we just sent: // Check response from the tag: should be the same UID as the command we just sent:
if (select_srx[1] != r_select[0]) { if (select_srx[1] != r_select[0]) {
return 1; return -3;
} }
// First get the tag's UID: // First get the tag's UID:
@ -1248,12 +1248,12 @@ static uint8_t iso14443b_select_srx_card(iso14b_card_select_t *card) {
FpgaDisableTracing(); FpgaDisableTracing();
if (retlen != 10) { if (retlen != 10) {
return 2; return -1;
} }
// The check the CRC of the answer // The check the CRC of the answer
if (!check_crc(CRC_14443_B, r_papid, retlen)) { if (!check_crc(CRC_14443_B, r_papid, retlen)) {
return 3; return -2;
} }
if (card) { if (card) {
@ -1437,11 +1437,11 @@ void ReadSTMemoryIso14443b(uint16_t numofblocks) {
uint8_t *mem = BigBuf_malloc((numofblocks + 1) * 4); uint8_t *mem = BigBuf_malloc((numofblocks + 1) * 4);
iso14b_card_select_t card; iso14b_card_select_t card;
uint8_t res = iso14443b_select_srx_card(&card); int res = iso14443b_select_srx_card(&card);
int isOK = PM3_SUCCESS; int isOK = PM3_SUCCESS;
// 0: OK 2: attrib fail, 3:crc fail, // 0: OK 2: attrib fail, 3:crc fail,
if (res > 0) { if (res < 1) {
isOK = PM3_ETIMEOUT; isOK = PM3_ETIMEOUT;
goto out; goto out;
} }

View file

@ -27,10 +27,10 @@
#endif #endif
void iso14443b_setup(void); void iso14443b_setup(void);
uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *response, uint16_t respmaxlen); int iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *response, uint16_t respmaxlen);
int iso14443b_select_card(iso14b_card_select_t *card); int iso14443b_select_card(iso14b_card_select_t *card);
uint8_t iso14443b_select_card_srx(iso14b_card_select_t *card); int iso14443b_select_card_srx(iso14b_card_select_t *card);
void SimulateIso14443bTag(uint32_t pupi); void SimulateIso14443bTag(uint32_t pupi);
void AcquireRawAdcSamplesIso14443b(uint32_t parameter); void AcquireRawAdcSamplesIso14443b(uint32_t parameter);

View file

@ -32,7 +32,7 @@ static int usage_hf_14b_info(void) {
PrintAndLogEx(NORMAL, " s silently"); PrintAndLogEx(NORMAL, " s silently");
PrintAndLogEx(NORMAL, "Example:"); PrintAndLogEx(NORMAL, "Example:");
PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b info")); PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b info"));
return 0; return PM3_SUCCESS;
} }
static int usage_hf_14b_reader(void) { static int usage_hf_14b_reader(void) {
PrintAndLogEx(NORMAL, "Usage: hf 14b reader [h] [s]"); PrintAndLogEx(NORMAL, "Usage: hf 14b reader [h] [s]");
@ -41,7 +41,7 @@ static int usage_hf_14b_reader(void) {
PrintAndLogEx(NORMAL, " s silently"); PrintAndLogEx(NORMAL, " s silently");
PrintAndLogEx(NORMAL, "Example:"); PrintAndLogEx(NORMAL, "Example:");
PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b reader")); PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b reader"));
return 0; return PM3_SUCCESS;
} }
static int usage_hf_14b_raw(void) { static int usage_hf_14b_raw(void) {
PrintAndLogEx(NORMAL, "Usage: hf 14b raw [-h] [-r] [-c] [-p] [-s / -ss] [-t] <0A 0B 0C ... hex>"); PrintAndLogEx(NORMAL, "Usage: hf 14b raw [-h] [-r] [-c] [-p] [-s / -ss] [-t] <0A 0B 0C ... hex>");
@ -55,7 +55,7 @@ static int usage_hf_14b_raw(void) {
PrintAndLogEx(NORMAL, " -t timeout in ms"); PrintAndLogEx(NORMAL, " -t timeout in ms");
PrintAndLogEx(NORMAL, "Example:"); PrintAndLogEx(NORMAL, "Example:");
PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b raw -s -c -p 0200a40400")); PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b raw -s -c -p 0200a40400"));
return 0; return PM3_SUCCESS;
} }
static int usage_hf_14b_sniff(void) { static int usage_hf_14b_sniff(void) {
PrintAndLogEx(NORMAL, "It get data from the field and saves it into command buffer."); PrintAndLogEx(NORMAL, "It get data from the field and saves it into command buffer.");
@ -65,7 +65,7 @@ static int usage_hf_14b_sniff(void) {
PrintAndLogEx(NORMAL, " h this help"); PrintAndLogEx(NORMAL, " h this help");
PrintAndLogEx(NORMAL, "Example:"); PrintAndLogEx(NORMAL, "Example:");
PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sniff")); PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sniff"));
return 0; return PM3_SUCCESS;
} }
static int usage_hf_14b_sim(void) { static int usage_hf_14b_sim(void) {
PrintAndLogEx(NORMAL, "Emulating ISO/IEC 14443 type B tag with 4 UID / PUPI"); PrintAndLogEx(NORMAL, "Emulating ISO/IEC 14443 type B tag with 4 UID / PUPI");
@ -76,7 +76,7 @@ static int usage_hf_14b_sim(void) {
PrintAndLogEx(NORMAL, "Example:"); PrintAndLogEx(NORMAL, "Example:");
PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sim")); PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sim"));
PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sim u 11223344")); PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sim u 11223344"));
return 0; return PM3_SUCCESS;
} }
static int usage_hf_14b_read_srx(void) { static int usage_hf_14b_read_srx(void) {
PrintAndLogEx(NORMAL, "Usage: hf 14b sriread [h] <1|2>"); PrintAndLogEx(NORMAL, "Usage: hf 14b sriread [h] <1|2>");
@ -86,7 +86,7 @@ static int usage_hf_14b_read_srx(void) {
PrintAndLogEx(NORMAL, "Example:"); PrintAndLogEx(NORMAL, "Example:");
PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriread 1")); PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriread 1"));
PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriread 2")); PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriread 2"));
return 0; return PM3_SUCCESS;
} }
static int usage_hf_14b_write_srx(void) { static int usage_hf_14b_write_srx(void) {
PrintAndLogEx(NORMAL, "Usage: hf 14b [h] sriwrite <1|2> <BLOCK> <DATA>"); PrintAndLogEx(NORMAL, "Usage: hf 14b [h] sriwrite <1|2> <BLOCK> <DATA>");
@ -100,7 +100,7 @@ static int usage_hf_14b_write_srx(void) {
PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriwrite 1 FF 11223344")); PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriwrite 1 FF 11223344"));
PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriwrite 2 15 11223344")); PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriwrite 2 15 11223344"));
PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriwrite 2 FF 11223344")); PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriwrite 2 FF 11223344"));
return 0; return PM3_SUCCESS;
} }
static int usage_hf_14b_dump(void) { static int usage_hf_14b_dump(void) {
PrintAndLogEx(NORMAL, "This command dumps the contents of a ISO-14443-B tag and save it to file\n" PrintAndLogEx(NORMAL, "This command dumps the contents of a ISO-14443-B tag and save it to file\n"
@ -115,16 +115,9 @@ static int usage_hf_14b_dump(void) {
_YELLOW_("\thf 14b dump f\n") _YELLOW_("\thf 14b dump f\n")
_YELLOW_("\thf 14b dump 2 f mydump") _YELLOW_("\thf 14b dump 2 f mydump")
); );
return 0; return PM3_SUCCESS;
} }
/*
static void switch_on_field_14b(void) {
clearCommandBuffer();
SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT, 0, 0, NULL, 0);
}
*/
static int switch_off_field_14b(void) { static int switch_off_field_14b(void) {
clearCommandBuffer(); clearCommandBuffer();
SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_DISCONNECT, 0, 0, NULL, 0); SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_DISCONNECT, 0, 0, NULL, 0);
@ -311,12 +304,14 @@ static bool get_14b_UID(iso14b_card_select_t *card) {
if (card == NULL) if (card == NULL)
return false; return false;
int status = 0;
PacketResponseNG resp; PacketResponseNG resp;
clearCommandBuffer(); clearCommandBuffer();
SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_SR | ISO14B_DISCONNECT, 0, 0, NULL, 0); SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_SR | ISO14B_DISCONNECT, 0, 0, NULL, 0);
if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) { if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) {
uint8_t status = resp.oldarg[0]; status = resp.oldarg[0];
if (status == 0) { if (status == 0) {
memcpy(card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); memcpy(card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t));
return true; return true;
@ -328,7 +323,7 @@ static bool get_14b_UID(iso14b_card_select_t *card) {
SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_STD | ISO14B_DISCONNECT, 0, 0, NULL, 0); SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_STD | ISO14B_DISCONNECT, 0, 0, NULL, 0);
if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) { if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) {
uint8_t status = resp.oldarg[0]; status = resp.oldarg[0];
if (status == 0) { if (status == 0) {
memcpy(card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); memcpy(card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t));
return true; return true;
@ -345,7 +340,7 @@ static bool get_14b_UID(iso14b_card_select_t *card) {
// 4 = bit rate capacity // 4 = bit rate capacity
// 5 = max frame size / -4 info // 5 = max frame size / -4 info
// 6 = FWI / Coding options // 6 = FWI / Coding options
static void print_atqb_resp(uint8_t *data, uint8_t cid) { static int print_atqb_resp(uint8_t *data, uint8_t cid) {
//PrintAndLogEx(SUCCESS, " UID: %s", sprint_hex(data+1,4)); //PrintAndLogEx(SUCCESS, " UID: %s", sprint_hex(data+1,4));
PrintAndLogEx(SUCCESS, " App Data: %s", sprint_hex(data, 4)); PrintAndLogEx(SUCCESS, " App Data: %s", sprint_hex(data, 4));
PrintAndLogEx(SUCCESS, " Protocol: %s", sprint_hex(data + 4, 3)); PrintAndLogEx(SUCCESS, " Protocol: %s", sprint_hex(data + 4, 3));
@ -387,7 +382,7 @@ static void print_atqb_resp(uint8_t *data, uint8_t cid) {
PrintAndLogEx(SUCCESS, "Tag :"); PrintAndLogEx(SUCCESS, "Tag :");
PrintAndLogEx(SUCCESS, " Max Buf Length: %u (MBLI) %s", cid >> 4, (cid & 0xF0) ? "" : "chained frames not supported"); PrintAndLogEx(SUCCESS, " Max Buf Length: %u (MBLI) %s", cid >> 4, (cid & 0xF0) ? "" : "chained frames not supported");
PrintAndLogEx(SUCCESS, " CID : %u", cid & 0x0f); PrintAndLogEx(SUCCESS, " CID : %u", cid & 0x0f);
return; return PM3_SUCCESS;
} }
// get SRx chip model (from UID) // from ST Microelectronics // get SRx chip model (from UID) // from ST Microelectronics
@ -502,7 +497,7 @@ static void print_st_general_info(uint8_t *data, uint8_t len) {
// 14b get and print Full Info (as much as we know) // 14b get and print Full Info (as much as we know)
static bool HF14B_Std_Info(bool verbose) { static bool HF14B_Std_Info(bool verbose) {
bool isSuccess = false; bool is_success = false;
// 14b get and print UID only (general info) // 14b get and print UID only (general info)
clearCommandBuffer(); clearCommandBuffer();
@ -512,13 +507,13 @@ static bool HF14B_Std_Info(bool verbose) {
if (!WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) { if (!WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) {
if (verbose) PrintAndLogEx(WARNING, "command execution timeout"); if (verbose) PrintAndLogEx(WARNING, "command execution timeout");
switch_off_field_14b(); switch_off_field_14b();
return false; return is_success;
} }
iso14b_card_select_t card; iso14b_card_select_t card;
memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t));
uint64_t status = resp.oldarg[0]; int status = resp.oldarg[0];
switch (status) { switch (status) {
case 0: case 0:
@ -527,12 +522,12 @@ static bool HF14B_Std_Info(bool verbose) {
PrintAndLogEx(SUCCESS, " ATQB : %s", sprint_hex(card.atqb, sizeof(card.atqb))); PrintAndLogEx(SUCCESS, " ATQB : %s", sprint_hex(card.atqb, sizeof(card.atqb)));
PrintAndLogEx(SUCCESS, " CHIPID : %02X", card.chipid); PrintAndLogEx(SUCCESS, " CHIPID : %02X", card.chipid);
print_atqb_resp(card.atqb, card.cid); print_atqb_resp(card.atqb, card.cid);
isSuccess = true; is_success = true;
break; break;
case 2: case -1:
if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 ATTRIB fail"); if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 ATTRIB fail");
break; break;
case 3: case -2:
if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 CRC fail"); if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 CRC fail");
break; break;
default: default:
@ -540,7 +535,7 @@ static bool HF14B_Std_Info(bool verbose) {
break; break;
} }
return isSuccess; return is_success;
} }
// SRx get and print full info (needs more info...) // SRx get and print full info (needs more info...)
@ -558,8 +553,8 @@ static bool HF14B_ST_Info(bool verbose) {
iso14b_card_select_t card; iso14b_card_select_t card;
memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t));
uint64_t status = resp.oldarg[0]; int status = resp.oldarg[0];
if (status > 0) if (status < 0)
return false; return false;
print_st_general_info(card.uid, card.uidlen); print_st_general_info(card.uid, card.uidlen);
@ -599,7 +594,7 @@ static int CmdHF14Binfo(const char *Cmd) {
static bool HF14B_ST_Reader(bool verbose) { static bool HF14B_ST_Reader(bool verbose) {
bool isSuccess = false; bool is_success = false;
// SRx get and print general info about SRx chip from UID // SRx get and print general info about SRx chip from UID
clearCommandBuffer(); clearCommandBuffer();
@ -607,38 +602,38 @@ static bool HF14B_ST_Reader(bool verbose) {
PacketResponseNG resp; PacketResponseNG resp;
if (!WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) { if (!WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) {
if (verbose) PrintAndLogEx(WARNING, "command execution timeout"); if (verbose) PrintAndLogEx(WARNING, "command execution timeout");
return false; return is_success;
} }
iso14b_card_select_t card; iso14b_card_select_t card;
memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t));
uint64_t status = resp.oldarg[0]; int status = resp.oldarg[0];
switch (status) { switch (status) {
case 0: case 0:
print_st_general_info(card.uid, card.uidlen); print_st_general_info(card.uid, card.uidlen);
isSuccess = true; is_success = true;
break; break;
case 1: case -1:
if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 random chip id fail");
break;
case 2:
if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 ATTRIB fail"); if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 ATTRIB fail");
break; break;
case 3: case -2:
if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 CRC fail"); if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 CRC fail");
break; break;
case -3:
if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 random chip id fail");
break;
default: default:
if (verbose) PrintAndLogEx(FAILED, "ISO 14443-b card select SRx failed"); if (verbose) PrintAndLogEx(FAILED, "ISO 14443-b card select SRx failed");
break; break;
} }
return isSuccess; return is_success;
} }
static bool HF14B_Std_Reader(bool verbose) { static bool HF14B_Std_Reader(bool verbose) {
bool isSuccess = false; bool is_success = false;
// 14b get and print UID only (general info) // 14b get and print UID only (general info)
clearCommandBuffer(); clearCommandBuffer();
@ -653,7 +648,7 @@ static bool HF14B_Std_Reader(bool verbose) {
iso14b_card_select_t card; iso14b_card_select_t card;
memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); memcpy(&card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t));
uint64_t status = resp.oldarg[0]; int status = resp.oldarg[0];
switch (status) { switch (status) {
case 0: case 0:
@ -662,19 +657,19 @@ static bool HF14B_Std_Reader(bool verbose) {
PrintAndLogEx(SUCCESS, " ATQB : %s", sprint_hex(card.atqb, sizeof(card.atqb))); PrintAndLogEx(SUCCESS, " ATQB : %s", sprint_hex(card.atqb, sizeof(card.atqb)));
PrintAndLogEx(SUCCESS, " CHIPID : %02X", card.chipid); PrintAndLogEx(SUCCESS, " CHIPID : %02X", card.chipid);
print_atqb_resp(card.atqb, card.cid); print_atqb_resp(card.atqb, card.cid);
isSuccess = true; is_success = true;
break; break;
case 2: case -1:
if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 ATTRIB fail"); if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 ATTRIB fail");
break; break;
case 3: case -2:
if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 CRC fail"); if (verbose) PrintAndLogEx(FAILED, "ISO 14443-3 CRC fail");
break; break;
default: default:
if (verbose) PrintAndLogEx(FAILED, "ISO 14443-b card select failed"); if (verbose) PrintAndLogEx(FAILED, "ISO 14443-b card select failed");
break; break;
} }
return isSuccess; return is_success;
} }
// test for other 14b type tags (mimic another reader - don't have tags to identify) // test for other 14b type tags (mimic another reader - don't have tags to identify)
@ -880,17 +875,18 @@ static int CmdHF14BDump(const char *Cmd) {
if (fileNameLen < 1) { if (fileNameLen < 1) {
PrintAndLogEx(INFO, "Using UID as filename"); PrintAndLogEx(INFO, "Using UID as filename");
fptr += sprintf(fptr, "hf-14b-"); fptr += sprintf(fptr, "hf-14b-");
FillFileNameByUID(fptr, SwapEndian64(card.uid, 8, 8), "-dump", card.uidlen); FillFileNameByUID(fptr, SwapEndian64(card.uid, card.uidlen, 8), "-dump", card.uidlen);
} }
// detect blocksize from card :) // detect blocksize from card :)
PrintAndLogEx(NORMAL, "Reading memory from tag UID %s", sprint_hex(SwapEndian64(card.uid, 8, 8), card.uidlen)); PrintAndLogEx(NORMAL, "Reading memory from tag UID %s", sprint_hex(SwapEndian64(card.uid, card.uidlen, 8), card.uidlen));
uint8_t data[cardsize]; uint8_t data[cardsize];
memset(data, 0, sizeof(data)); memset(data, 0, sizeof(data));
int blocknum = 0; int blocknum = 0;
uint8_t *recv = NULL; uint8_t *recv = NULL;
int status = 0;
PacketResponseNG resp; PacketResponseNG resp;
clearCommandBuffer(); clearCommandBuffer();
@ -898,8 +894,9 @@ static int CmdHF14BDump(const char *Cmd) {
//select //select
if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, 2000)) { if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, 2000)) {
if (resp.oldarg[0]) { status = resp.oldarg[0];
PrintAndLogEx(INFO, "failed to select %" PRId64 " | %" PRId64, resp.oldarg[0], resp.oldarg[1]); if (status < 0) {
PrintAndLogEx(FAILED, "failed to select arg0[%" PRId64 "] arg1 [%" PRId64 "]", resp.oldarg[0], resp.oldarg[1]);
goto out; goto out;
} }
} }
@ -915,10 +912,11 @@ static int CmdHF14BDump(const char *Cmd) {
if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, 2000)) { if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, 2000)) {
//uint8_t status = resp.oldarg[0] & 0xFF; status = resp.oldarg[0];
//if (status > 0) { if (status < 0) {
// continue; PrintAndLogEx(FAILED, "retrying one more time");
//} continue;
}
uint16_t len = (resp.oldarg[1] & 0xFFFF); uint16_t len = (resp.oldarg[1] & 0xFFFF);
recv = resp.data.asBytes; recv = resp.data.asBytes;
@ -1112,10 +1110,12 @@ int CmdHF14B(const char *Cmd) {
int infoHF14B(bool verbose) { int infoHF14B(bool verbose) {
// try std 14b (atqb) // try std 14b (atqb)
if (HF14B_Std_Info(verbose)) return 1; if (HF14B_Std_Info(verbose))
return 1;
// try ST 14b // try ST 14b
if (HF14B_ST_Info(verbose)) return 1; if (HF14B_ST_Info(verbose))
return 1;
// try unknown 14b read commands (to be identified later) // try unknown 14b read commands (to be identified later)
// could be read of calypso, CEPAS, moneo, or pico pass. // could be read of calypso, CEPAS, moneo, or pico pass.
@ -1127,14 +1127,17 @@ int infoHF14B(bool verbose) {
int readHF14B(bool verbose) { int readHF14B(bool verbose) {
// try std 14b (atqb) // try std 14b (atqb)
if (HF14B_Std_Reader(verbose)) return 1; if (HF14B_Std_Reader(verbose))
return 1;
// try ST Microelectronics 14b // try ST Microelectronics 14b
if (HF14B_ST_Reader(verbose)) return 1; if (HF14B_ST_Reader(verbose))
return 1;
// try unknown 14b read commands (to be identified later) // try unknown 14b read commands (to be identified later)
// could be read of calypso, CEPAS, moneo, or pico pass. // could be read of calypso, CEPAS, moneo, or pico pass.
if (HF14B_Other_Reader()) return 1; if (HF14B_Other_Reader())
return 1;
if (verbose) PrintAndLogEx(FAILED, "no 14443-B tag found"); if (verbose) PrintAndLogEx(FAILED, "no 14443-B tag found");
return 0; return 0;