Support larger NDEF messages

This commit is contained in:
Willy-JL
2025-03-10 11:01:46 +00:00
parent d174fa9505
commit 2e77e878de
2 changed files with 9 additions and 11 deletions

View File

@@ -14,7 +14,8 @@
#define TYPE_4_TAG_ISO_READ_CMD 0x00, 0xB0
#define TYPE_4_TAG_ISO_READ_P1_EMPTY (0x00)
#define TYPE_4_TAG_ISO_READ_P1_ID_MASK (1 << 7)
#define TYPE_4_TAG_ISO_READ_P2_BEGINNING (0x00)
#define TYPE_4_TAG_ISO_READ_P_BEGINNING (0x00)
#define TYPE_4_TAG_ISO_READ_P_OFFSET_MAX (32767U)
#define TYPE_4_TAG_ISO_READ_LE_FULL (0x00)
// Common APDU parameters and values

View File

@@ -84,7 +84,7 @@ Type4TagError type_4_tag_poller_read_cc(Type4TagPoller* instance) {
const uint8_t type_4_tag_read_cc_apdu[] = {
TYPE_4_TAG_ISO_READ_CMD,
TYPE_4_TAG_ISO_READ_P1_EMPTY,
TYPE_4_TAG_ISO_READ_P2_BEGINNING,
TYPE_4_TAG_ISO_READ_P_BEGINNING,
TYPE_4_TAG_ISO_READ_LE_FULL,
};
@@ -180,7 +180,7 @@ Type4TagError type_4_tag_poller_read_ndef(Type4TagPoller* instance) {
const uint8_t type_4_tag_read_ndef_len_apdu[] = {
TYPE_4_TAG_ISO_READ_CMD,
TYPE_4_TAG_ISO_READ_P1_EMPTY,
TYPE_4_TAG_ISO_READ_P2_BEGINNING,
TYPE_4_TAG_ISO_READ_P_BEGINNING,
sizeof(ndef_len),
};
@@ -198,11 +198,8 @@ Type4TagError type_4_tag_poller_read_ndef(Type4TagPoller* instance) {
FURI_LOG_D(TAG, "NDEF file is empty");
break;
}
if(ndef_len > 510 - sizeof(ndef_len)) {
// Both size and offset for READ BINARY are 1 byte uint
// So the furthest we can read is 255 bytes at offset 255
// AKA 2 * 255 byte chunks = 510 bytes -2 byte NDEF len header
// TODO: Surely there has to be another way?
uint8_t chunk_max = MIN(instance->data->chunk_max_read, TYPE_4_TAG_ISO_RW_CHUNK_LEN);
if(ndef_len > TYPE_4_TAG_ISO_READ_P_OFFSET_MAX + chunk_max - sizeof(ndef_len)) {
FURI_LOG_E(TAG, "NDEF file too long: %zu bytes", ndef_len);
error = Type4TagErrorNotSupported;
break;
@@ -212,20 +209,20 @@ Type4TagError type_4_tag_poller_read_ndef(Type4TagPoller* instance) {
FURI_LOG_D(TAG, "Read NDEF");
const uint8_t type_4_tag_read_ndef_apdu_1[] = {
TYPE_4_TAG_ISO_READ_CMD,
TYPE_4_TAG_ISO_READ_P1_EMPTY,
};
uint16_t ndef_pos = 0;
uint8_t* ndef_data = simple_array_get_data(instance->data->ndef_data);
uint8_t chunk_max = MIN(instance->data->chunk_max_read, TYPE_4_TAG_ISO_RW_CHUNK_LEN);
while(ndef_len > 0) {
uint8_t chunk_len = MIN(ndef_len, chunk_max);
uint8_t ndef_pos_be[sizeof(ndef_pos)];
bit_lib_num_to_bytes_be(sizeof(ndef_len) + ndef_pos, sizeof(ndef_pos_be), ndef_pos_be);
bit_buffer_append_bytes(
instance->tx_buffer,
type_4_tag_read_ndef_apdu_1,
sizeof(type_4_tag_read_ndef_apdu_1));
bit_buffer_append_byte(instance->tx_buffer, (uint8_t)(sizeof(ndef_len) + ndef_pos));
bit_buffer_append_bytes(instance->tx_buffer, ndef_pos_be, sizeof(ndef_pos_be));
bit_buffer_append_byte(instance->tx_buffer, chunk_len);
error = type_4_tag_apdu_trx(instance, instance->tx_buffer, instance->rx_buffer);