From 51f6dcffa421e2d7784ac84c7aad3fa8fbf6af93 Mon Sep 17 00:00:00 2001 From: TollyH Date: Thu, 18 Jan 2024 21:47:38 +0000 Subject: [PATCH 1/2] NFC: Display unread Mifare Classic bytes as ?? --- .../mf_classic/mf_classic_render.c | 52 +++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/applications/main/nfc/helpers/protocol_support/mf_classic/mf_classic_render.c b/applications/main/nfc/helpers/protocol_support/mf_classic/mf_classic_render.c index 5bd4a6b6d..bbb96288b 100644 --- a/applications/main/nfc/helpers/protocol_support/mf_classic/mf_classic_render.c +++ b/applications/main/nfc/helpers/protocol_support/mf_classic/mf_classic_render.c @@ -22,9 +22,55 @@ void nfc_render_mf_classic_dump(const MfClassicData* data, FuriString* str) { uint16_t total_blocks = mf_classic_get_total_block_num(data->type); for(size_t i = 0; i < total_blocks; i++) { - for(size_t j = 0; j < sizeof(MfClassicBlock); j += 2) { - furi_string_cat_printf( - str, "%02X%02X ", data->block[i].data[j], data->block[i].data[j + 1]); + const uint8_t* block_data = data->block[i].data; + if(mf_classic_is_block_read(data, i)) { + if(mf_classic_is_sector_trailer(i)) { + uint8_t sector = mf_classic_get_sector_by_block(i); + // Key A + if(mf_classic_is_key_found(data, sector, MfClassicKeyTypeA)) { + furi_string_cat_printf( + str, + "%02X%02X %02X%02X %02X%02X ", + block_data[0], + block_data[1], + block_data[2], + block_data[3], + block_data[4], + block_data[5]); + } else { + furi_string_cat(str, "???? ???? ???? "); + } + // Access bits + furi_string_cat_printf( + str, + "%02X%02X %02X%02X ", + block_data[6], + block_data[7], + block_data[8], + block_data[9]); + // Key B + if(mf_classic_is_key_found(data, sector, MfClassicKeyTypeB)) { + furi_string_cat_printf( + str, + "%02X%02X %02X%02X %02X%02X ", + block_data[10], + block_data[11], + block_data[12], + block_data[13], + block_data[14], + block_data[15]); + } else { + furi_string_cat(str, "???? ???? ???? "); + } + } else { + for(size_t j = 0; j < sizeof(MfClassicBlock); j += 2) { + furi_string_cat_printf(str, "%02X%02X ", block_data[j], block_data[j + 1]); + } + } + } else { + for(size_t j = 0; j < sizeof(MfClassicBlock); j += 2) { + furi_string_cat(str, "???? "); + } } } } From 391c32654bd680a019b6dc1c755b2203f195ca77 Mon Sep 17 00:00:00 2001 From: TollyH Date: Tue, 23 Jan 2024 17:17:37 +0000 Subject: [PATCH 2/2] Apply patch from @gornekich --- .../mf_classic/mf_classic_render.c | 89 ++++++++----------- 1 file changed, 39 insertions(+), 50 deletions(-) diff --git a/applications/main/nfc/helpers/protocol_support/mf_classic/mf_classic_render.c b/applications/main/nfc/helpers/protocol_support/mf_classic/mf_classic_render.c index bbb96288b..0382b3333 100644 --- a/applications/main/nfc/helpers/protocol_support/mf_classic/mf_classic_render.c +++ b/applications/main/nfc/helpers/protocol_support/mf_classic/mf_classic_render.c @@ -18,59 +18,48 @@ void nfc_render_mf_classic_info( furi_string_cat_printf(str, "\nSectors Read: %u/%u", sectors_read, sectors_total); } +static void + mf_classic_render_raw_data(const uint8_t* data, size_t size, bool data_read, FuriString* str) { + furi_assert((size % 2) == 0); + + for(size_t i = 0; i < size; i += 2) { + if(data_read) { + furi_string_cat_printf(str, "%02X%02X ", data[i], data[i + 1]); + } else { + furi_string_cat_printf(str, "???? "); + } + } +} + +static void + mf_classic_render_block(const MfClassicData* data, uint8_t block_num, FuriString* str) { + if(mf_classic_is_sector_trailer(block_num)) { + uint8_t sec_num = mf_classic_get_sector_by_block(block_num); + MfClassicSectorTrailer* sec_tr = mf_classic_get_sector_trailer_by_sector(data, sec_num); + + // Render key A + bool key_read = mf_classic_is_key_found(data, sec_num, MfClassicKeyTypeA); + mf_classic_render_raw_data(sec_tr->key_a.data, sizeof(MfClassicKey), key_read, str); + + // Render access bits + bool access_bits_read = mf_classic_is_block_read(data, block_num); + mf_classic_render_raw_data( + sec_tr->access_bits.data, sizeof(MfClassicAccessBits), access_bits_read, str); + + // Render key B + key_read = mf_classic_is_key_found(data, sec_num, MfClassicKeyTypeB); + mf_classic_render_raw_data(sec_tr->key_b.data, sizeof(MfClassicKey), key_read, str); + } else { + const uint8_t* block_data = data->block[block_num].data; + bool block_read = mf_classic_is_block_read(data, block_num); + mf_classic_render_raw_data(block_data, sizeof(MfClassicBlock), block_read, str); + } +} + void nfc_render_mf_classic_dump(const MfClassicData* data, FuriString* str) { uint16_t total_blocks = mf_classic_get_total_block_num(data->type); for(size_t i = 0; i < total_blocks; i++) { - const uint8_t* block_data = data->block[i].data; - if(mf_classic_is_block_read(data, i)) { - if(mf_classic_is_sector_trailer(i)) { - uint8_t sector = mf_classic_get_sector_by_block(i); - // Key A - if(mf_classic_is_key_found(data, sector, MfClassicKeyTypeA)) { - furi_string_cat_printf( - str, - "%02X%02X %02X%02X %02X%02X ", - block_data[0], - block_data[1], - block_data[2], - block_data[3], - block_data[4], - block_data[5]); - } else { - furi_string_cat(str, "???? ???? ???? "); - } - // Access bits - furi_string_cat_printf( - str, - "%02X%02X %02X%02X ", - block_data[6], - block_data[7], - block_data[8], - block_data[9]); - // Key B - if(mf_classic_is_key_found(data, sector, MfClassicKeyTypeB)) { - furi_string_cat_printf( - str, - "%02X%02X %02X%02X %02X%02X ", - block_data[10], - block_data[11], - block_data[12], - block_data[13], - block_data[14], - block_data[15]); - } else { - furi_string_cat(str, "???? ???? ???? "); - } - } else { - for(size_t j = 0; j < sizeof(MfClassicBlock); j += 2) { - furi_string_cat_printf(str, "%02X%02X ", block_data[j], block_data[j + 1]); - } - } - } else { - for(size_t j = 0; j < sizeof(MfClassicBlock); j += 2) { - furi_string_cat(str, "???? "); - } - } + mf_classic_render_block(data, i, str); } }