Skip to content

Commit 7ae4909

Browse files
fix: Added length validation in fragment apdu exchange process
1 parent 45b492e commit 7ae4909

File tree

1 file changed

+16
-5
lines changed
  • common/interfaces/card_interface

1 file changed

+16
-5
lines changed

common/interfaces/card_interface/nfc.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,9 @@ ret_code_t nfc_exchange_apdu(uint8_t *send_apdu,
669669
ASSERT(recv_len != NULL);
670670
ASSERT(send_len != 0);
671671

672+
uint8_t expected_recv_len = *recv_len;
673+
*recv_len = 0;
674+
672675
ret_code_t err_code = adafruit_diagnose_card_presence();
673676
if (err_code != 0)
674677
return NFC_CARD_ABSENT;
@@ -693,8 +696,10 @@ ret_code_t nfc_exchange_apdu(uint8_t *send_apdu,
693696

694697
total_packets = ceil(send_len / (1.0 * SEND_PACKET_MAX_LEN));
695698
for (int packet = 1; packet <= total_packets;) {
696-
recv_pkt_len = RECV_PACKET_MAX_ENC_LEN; /* On every request set acceptable
697-
packet length */
699+
recv_pkt_len = RECV_PACKET_MAX_ENC_LEN <= expected_recv_len
700+
? RECV_PACKET_MAX_ENC_LEN
701+
: expected_recv_len; /* On every request set acceptable
702+
packet length */
698703

699704
/**
700705
* Sets appropriate CLA byte for each packet. CLA byte (first byte of
@@ -757,11 +762,14 @@ ret_code_t nfc_exchange_apdu(uint8_t *send_apdu,
757762

758763
/** Prepare to request next packet from the card */
759764
*recv_len = recv_pkt_len;
760-
recv_pkt_len = RECV_PACKET_MAX_ENC_LEN;
765+
uint8_t remaining_recv_len = expected_recv_len - *recv_len + 2;
766+
recv_pkt_len = RECV_PACKET_MAX_ENC_LEN <= remaining_recv_len
767+
? RECV_PACKET_MAX_ENC_LEN
768+
: remaining_recv_len;
761769
request_chain_pkt[2] = ceil(*recv_len * 1.0 / RECV_PACKET_MAX_LEN);
762770

763771
/** Request all the remaining packets of multi-packet response */
764-
while (recv_apdu[*recv_len - 2] == 0x61) {
772+
while (recv_apdu[*recv_len - 2] == 0x61 && recv_pkt_len > 0) {
765773
*recv_len -= 2;
766774
err_code = adafruit_pn532_in_data_exchange(request_chain_pkt,
767775
sizeof(request_chain_pkt),
@@ -787,7 +795,10 @@ ret_code_t nfc_exchange_apdu(uint8_t *send_apdu,
787795

788796
/** Prepare to request next packet from the card */
789797
*recv_len += recv_pkt_len;
790-
recv_pkt_len = RECV_PACKET_MAX_ENC_LEN;
798+
remaining_recv_len = expected_recv_len - *recv_len + 2;
799+
recv_pkt_len = RECV_PACKET_MAX_ENC_LEN <= remaining_recv_len
800+
? RECV_PACKET_MAX_ENC_LEN
801+
: remaining_recv_len;
791802
request_chain_pkt[2] = *recv_len / RECV_PACKET_MAX_LEN + 1;
792803
}
793804

0 commit comments

Comments
 (0)