7676#define SEND_PACKET_MAX_LEN 236
7777#define RECV_PACKET_MAX_ENC_LEN 242
7878#define RECV_PACKET_MAX_LEN 225
79+ #define MAX_EXPECTED_RECV_LEN 600
7980
8081static void (* early_exit_handler )() = NULL ;
8182static uint8_t nfc_device_key_id [4 ];
@@ -193,7 +194,7 @@ ISO7816 nfc_select_applet(uint8_t expected_family_id[],
193194 ISO7816 status_word ;
194195 uint8_t send_apdu [255 ], recv_apdu [255 ] = {0 },
195196 _version [CARD_VERSION_SIZE ] = {0 };
196- uint16_t send_len = 5 , recv_len = 236 ;
197+ uint16_t send_len = 5 , recv_len = 255 ;
197198
198199 send_len = create_apdu_select_applet (send_apdu );
199200
@@ -261,7 +262,7 @@ ISO7816 nfc_pair(uint8_t *data_inOut, uint8_t *length_inOut) {
261262
262263 ISO7816 status_word = CLA_ISO7816 ;
263264 uint8_t send_apdu [255 ], recv_apdu [255 ] = {0 };
264- uint16_t send_len = 5 , recv_len = 236 ;
265+ uint16_t send_len = 5 , recv_len = 255 ;
265266
266267 send_len = create_apdu_pair (data_inOut , * length_inOut , send_apdu );
267268
@@ -292,7 +293,7 @@ ISO7816 nfc_pair(uint8_t *data_inOut, uint8_t *length_inOut) {
292293ISO7816 nfc_unpair () {
293294 ISO7816 status_word = CLA_ISO7816 ;
294295 uint8_t send_apdu [255 ], recv_apdu [255 ] = {0 };
295- uint16_t send_len = 5 , recv_len = 236 ;
296+ uint16_t send_len = 5 , recv_len = 255 ;
296297
297298 hex_string_to_byte_array ("00130000" , 8 , send_apdu );
298299 nfc_secure_comm = true;
@@ -320,7 +321,7 @@ ISO7816 nfc_list_all_wallet(wallet_list_t *wallet_list) {
320321
321322 // recv_len receives the length of response APDU. It also
322323 // acts as expected length of response APDU.
323- uint16_t recv_len = 236 ;
324+ uint16_t recv_len = 300 ;
324325
325326 send_len = create_apdu_list_wallet (send_apdu );
326327
@@ -366,7 +367,7 @@ ISO7816 nfc_add_wallet(const struct Wallet *wallet) {
366367 // Call nfc_select_card() before
367368 ISO7816 status_word = CLA_ISO7816 ;
368369 uint8_t send_apdu [600 ] = {0 }, * recv_apdu = send_apdu ;
369- uint16_t send_len = 0 , recv_len = 236 ;
370+ uint16_t send_len = 0 , recv_len = 600 ;
370371
371372 calculate_checksum (wallet , (uint8_t * )wallet -> checksum );
372373 if (WALLET_IS_ARBITRARY_DATA (wallet -> wallet_info ))
@@ -436,7 +437,7 @@ ISO7816 nfc_delete_wallet(const struct Wallet *wallet) {
436437
437438 ISO7816 status_word = CLA_ISO7816 ;
438439 uint8_t send_apdu [600 ] = {0 }, * recv_apdu = send_apdu ;
439- uint16_t send_len = 0 , recv_len = 236 ;
440+ uint16_t send_len = 0 , recv_len = 600 ;
440441
441442 send_len = create_apdu_delete_wallet (wallet , send_apdu );
442443
@@ -465,7 +466,7 @@ ISO7816 nfc_ecdsa(uint8_t data_inOut[ECDSA_SIGNATURE_SIZE],
465466
466467 ISO7816 status_word = CLA_ISO7816 ;
467468 uint8_t send_apdu [600 ] = {0 }, * recv_apdu = send_apdu ;
468- uint16_t send_len = 0 , recv_len = 236 ;
469+ uint16_t send_len = 0 , recv_len = 600 ;
469470
470471 send_len = create_apdu_ecdsa (data_inOut , * length_inOut , send_apdu );
471472
@@ -506,7 +507,7 @@ ISO7816 nfc_verify_challenge(const uint8_t name[NAME_SIZE],
506507
507508 ISO7816 status_word = CLA_ISO7816 ;
508509 uint8_t send_apdu [600 ] = {0 }, * recv_apdu = send_apdu ;
509- uint16_t send_len = 0 , recv_len = 236 ;
510+ uint16_t send_len = 0 , recv_len = 600 ;
510511
511512 send_len = create_apdu_verify_challenge (name , nonce , password , send_apdu );
512513
@@ -536,7 +537,7 @@ ISO7816 nfc_get_challenge(const uint8_t name[NAME_SIZE],
536537
537538 ISO7816 status_word = CLA_ISO7816 ;
538539 uint8_t send_apdu [600 ] = {0 }, * recv_apdu = send_apdu ;
539- uint16_t send_len = 0 , recv_len = 236 ;
540+ uint16_t send_len = 0 , recv_len = 600 ;
540541
541542 send_len = create_apdu_get_challenge (name , send_apdu );
542543
@@ -574,7 +575,7 @@ ISO7816 nfc_encrypt_data(const uint8_t name[NAME_SIZE],
574575#if USE_SIMULATOR == 0
575576 ISO7816 status_word = CLA_ISO7816 ;
576577 uint8_t send_apdu [600 ] = {0 }, * recv_apdu = send_apdu ;
577- uint16_t send_len = 0 , recv_len = 236 ;
578+ uint16_t send_len = 0 , recv_len = 600 ;
578579
579580 send_len = create_apdu_inheritance (name ,
580581 plain_data ,
@@ -627,7 +628,7 @@ ISO7816 nfc_decrypt_data(const uint8_t name[NAME_SIZE],
627628
628629 ISO7816 status_word = CLA_ISO7816 ;
629630 uint8_t send_apdu [600 ] = {0 }, * recv_apdu = send_apdu ;
630- uint16_t send_len = 0 , recv_len = 236 ;
631+ uint16_t send_len = 0 , recv_len = 600 ;
631632
632633 send_len = create_apdu_inheritance (name ,
633634 encrypted_data ,
@@ -669,7 +670,7 @@ ret_code_t nfc_exchange_apdu(uint8_t *send_apdu,
669670 ASSERT (recv_len != NULL );
670671 ASSERT (send_len != 0 );
671672
672- uint8_t expected_recv_len = * recv_len ;
673+ uint16_t expected_recv_len = * recv_len ;
673674 * recv_len = 0 ;
674675
675676 ret_code_t err_code = adafruit_diagnose_card_presence ();
@@ -696,10 +697,11 @@ ret_code_t nfc_exchange_apdu(uint8_t *send_apdu,
696697
697698 total_packets = ceil (send_len / (1.0 * SEND_PACKET_MAX_LEN ));
698699 for (int packet = 1 ; packet <= total_packets ;) {
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 */
700+ recv_pkt_len =
701+ RECV_PACKET_MAX_ENC_LEN <= expected_recv_len
702+ ? RECV_PACKET_MAX_ENC_LEN
703+ : expected_recv_len ; /* On every request set acceptable
704+ packet length */
703705
704706 /**
705707 * Sets appropriate CLA byte for each packet. CLA byte (first byte of
@@ -762,7 +764,7 @@ ret_code_t nfc_exchange_apdu(uint8_t *send_apdu,
762764
763765 /** Prepare to request next packet from the card */
764766 * recv_len = recv_pkt_len ;
765- uint8_t remaining_recv_len = expected_recv_len - * recv_len + 2 ;
767+ uint16_t remaining_recv_len = expected_recv_len - * recv_len + 2 ;
766768 recv_pkt_len = RECV_PACKET_MAX_ENC_LEN <= remaining_recv_len
767769 ? RECV_PACKET_MAX_ENC_LEN
768770 : remaining_recv_len ;
0 commit comments