Skip to content

Commit c4b7407

Browse files
Merge pull request #659 from Cypherock/develop
Develop
2 parents 465ec3f + 43b27de commit c4b7407

2 files changed

Lines changed: 20 additions & 18 deletions

File tree

common/interfaces/card_interface/nfc.c

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
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

8081
static void (*early_exit_handler)() = NULL;
8182
static 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) {
292293
ISO7816 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;

version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
firmware version=000:006:010:004
1+
firmware version=000:006:010:006
22
hardware version=000:001:000:000
33
magic number=45227A01

0 commit comments

Comments
 (0)