From e5f746e018d0c2fa53d3cb47d0875dac850ef948 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Sat, 3 Oct 2020 19:08:27 +0200 Subject: [PATCH] fix 14b apdu --- armsrc/epa.c | 2 +- armsrc/iso14443b.c | 19 ++++++++++--------- armsrc/iso14443b.h | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/armsrc/epa.c b/armsrc/epa.c index 317f2ce7b..2a0025610 100644 --- a/armsrc/epa.c +++ b/armsrc/epa.c @@ -118,7 +118,7 @@ static int EPA_APDU(uint8_t *apdu, size_t length, uint8_t *response, uint16_t re case 'a': return iso14_apdu(apdu, (uint16_t) length, false, response, NULL); case 'b': - return iso14443b_apdu(apdu, length, false, response, respmaxlen); + return iso14443b_apdu(apdu, length, false, response, respmaxlen, NULL); default: return 0; } diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index ccbe06e5c..01d890d28 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -1168,7 +1168,7 @@ static void CodeAndTransmit14443bAsReader(const uint8_t *cmd, int len, uint32_t /* Sends an APDU to the tag * TODO: check CRC and preamble */ -int iso14443b_apdu(uint8_t const *msg, size_t msg_len, bool send_chaining, uint8_t *response, uint16_t respmaxlen) { +int iso14443b_apdu(uint8_t const *msg, size_t msg_len, bool send_chaining, void *rxdata, uint16_t rxmaxlen, uint8_t *res) { uint8_t real_cmd[msg_len + 4]; @@ -1195,10 +1195,10 @@ int iso14443b_apdu(uint8_t const *msg, size_t msg_len, bool send_chaining, uint8 CodeAndTransmit14443bAsReader(real_cmd, msg_len + 3, &start_time, &eof_time); eof_time += DELAY_ISO14443B_VCD_TO_VICC_READER; - int len = Get14443bAnswerFromTag(response, respmaxlen, ISO14443B_READER_TIMEOUT, &eof_time); + int len = Get14443bAnswerFromTag(rxdata, rxmaxlen, ISO14443B_READER_TIMEOUT, &eof_time); FpgaDisableTracing(); - uint8_t *data_bytes = (uint8_t *) response; + uint8_t *data_bytes = (uint8_t *) rxdata; if (len <= 0) { return 0; //DATA LINK ERROR @@ -1219,10 +1219,10 @@ int iso14443b_apdu(uint8_t const *msg, size_t msg_len, bool send_chaining, uint8 // retrieve the result again (with increased timeout) eof_time += DELAY_ISO14443B_VCD_TO_VICC_READER; - len = Get14443bAnswerFromTag(response, respmaxlen, ISO14443B_READER_TIMEOUT, &eof_time); + len = Get14443bAnswerFromTag(rxdata, rxmaxlen, ISO14443B_READER_TIMEOUT, &eof_time); FpgaDisableTracing(); - data_bytes = response; + data_bytes = rxdata; // restore timeout iso14b_set_timeout(save_iso14b_timeout); } @@ -1237,8 +1237,8 @@ int iso14443b_apdu(uint8_t const *msg, size_t msg_len, bool send_chaining, uint8 } // if we received I-block with chaining we need to send ACK and receive another block of data - if (response) - *response = data_bytes[0]; + if (res) + *res = data_bytes[0]; // crc check if (len >= 3 && !check_crc(CRC_14443_B, data_bytes, len)) { @@ -1877,9 +1877,10 @@ void SendRawCommand14443B_Ex(PacketCommandNG *c) { } if ((param & ISO14B_APDU) == ISO14B_APDU) { - status = iso14443b_apdu(cmd, len, (param & ISO14B_SEND_CHAINING), buf, sizeof(buf)); + uint8_t res; + status = iso14443b_apdu(cmd, len, (param & ISO14B_SEND_CHAINING), buf, sizeof(buf), &res); sendlen = MIN(Demod.len, PM3_CMD_DATA_SIZE); - reply_mix(CMD_HF_ISO14443B_COMMAND, status, status, 0, buf, sendlen); + reply_mix(CMD_HF_ISO14443B_COMMAND, status, res, 0, buf, sendlen); } if ((param & ISO14B_RAW) == ISO14B_RAW) { diff --git a/armsrc/iso14443b.h b/armsrc/iso14443b.h index 7e5023e1b..f770bbf8c 100644 --- a/armsrc/iso14443b.h +++ b/armsrc/iso14443b.h @@ -27,7 +27,7 @@ #endif void iso14443b_setup(void); -int iso14443b_apdu(uint8_t const *msg, size_t msg_len, bool send_chaining, uint8_t *response, uint16_t respmaxlen); +int iso14443b_apdu(uint8_t const *msg, size_t msg_len, bool send_chaining, void *rxdata, uint16_t rxmaxlen, uint8_t *res); int iso14443b_select_card(iso14b_card_select_t *card); int iso14443b_select_card_srx(iso14b_card_select_t *card);