9static const char *
const TAG =
"nfc";
19#pragma GCC diagnostic push
20#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
28#pragma GCC diagnostic pop
31 if (uid_length == 4) {
32 return TAG_TYPE_MIFARE_CLASSIC;
39 for (uint8_t i = 0; i < MIFARE_CLASSIC_BLOCK_SIZE; i++) {
40 if (data[i] == 0x00) {
42 }
else if (data[i] == 0x03) {
53 if (data[i] != 0x03) {
54 ESP_LOGE(TAG,
"Error, Can't decode message length.");
57 if (data[i + 1] == 0xFF) {
58 message_length = ((0xFF & data[i + 2]) << 8) | (0xFF & data[i + 3]);
59 message_start_index = i + MIFARE_CLASSIC_LONG_TLV_SIZE;
61 message_length = data[i + 1];
62 message_start_index = i + MIFARE_CLASSIC_SHORT_TLV_SIZE;
68 uint32_t buffer_size = message_length + 2 + 1;
69 if (buffer_size % MIFARE_ULTRALIGHT_READ_SIZE != 0)
70 buffer_size = ((buffer_size / MIFARE_ULTRALIGHT_READ_SIZE) + 1) * MIFARE_ULTRALIGHT_READ_SIZE;
75 uint32_t buffer_size = message_length;
76 if (message_length < 255) {
77 buffer_size += MIFARE_CLASSIC_SHORT_TLV_SIZE + 1;
79 buffer_size += MIFARE_CLASSIC_LONG_TLV_SIZE + 1;
81 if (buffer_size % MIFARE_CLASSIC_BLOCK_SIZE != 0) {
82 buffer_size = ((buffer_size / MIFARE_CLASSIC_BLOCK_SIZE) + 1) * MIFARE_CLASSIC_BLOCK_SIZE;
88 if (block_num < MIFARE_CLASSIC_BLOCKS_PER_SECT_LOW * MIFARE_CLASSIC_16BLOCK_SECT_START) {
89 return (block_num % MIFARE_CLASSIC_BLOCKS_PER_SECT_LOW == 0);
91 return (block_num % MIFARE_CLASSIC_BLOCKS_PER_SECT_HIGH == 0);
96 if (block_num < MIFARE_CLASSIC_BLOCKS_PER_SECT_LOW * MIFARE_CLASSIC_16BLOCK_SECT_START) {
97 return ((block_num + 1) % MIFARE_CLASSIC_BLOCKS_PER_SECT_LOW == 0);
99 return ((block_num + 1) % MIFARE_CLASSIC_BLOCKS_PER_SECT_HIGH == 0);
bool decode_mifare_classic_tlv(std::vector< uint8_t > &data, uint32_t &message_length, uint8_t &message_start_index)
char * format_bytes_to(char *buffer, std::span< const uint8_t > bytes)
Format bytes to buffer with ' ' separator (e.g., "04 11 22 33"). Returns buffer for inline use.
uint32_t get_mifare_ultralight_buffer_size(uint32_t message_length)
std::string format_uid(std::span< const uint8_t > uid)
uint8_t get_mifare_classic_ndef_start_index(std::vector< uint8_t > &data)
std::string format_bytes(std::span< const uint8_t > bytes)
char * format_uid_to(char *buffer, std::span< const uint8_t > uid)
Format UID to buffer with '-' separator (e.g., "04-11-22-33"). Returns buffer for inline use.
uint8_t guess_tag_type(uint8_t uid_length)
bool mifare_classic_is_trailer_block(uint8_t block_num)
uint32_t get_mifare_classic_buffer_size(uint32_t message_length)
bool mifare_classic_is_first_block(uint8_t block_num)
Providing packet encoding functions for exchanging data with a remote host.
char * format_hex_pretty_to(char *buffer, size_t buffer_size, const uint8_t *data, size_t length, char separator)
Format byte array as uppercase hex to buffer (base implementation).
std::string format_hex_pretty(const uint8_t *data, size_t length, char separator, bool show_length)
Format a byte array in pretty-printed, human-readable hex format.