7
7
static const char * nfc_file_header = "Flipper NFC device" ;
8
8
static const uint32_t nfc_file_version = 2 ;
9
9
10
+ // Protocols format versions
11
+ static const uint32_t nfc_mifare_classic_data_format_version = 1 ;
12
+
10
13
NfcDevice * nfc_device_alloc () {
11
14
NfcDevice * nfc_dev = malloc (sizeof (NfcDevice ));
12
15
nfc_dev -> storage = furi_record_open ("storage" );
@@ -624,15 +627,25 @@ static bool nfc_device_save_mifare_classic_data(FlipperFormat* file, NfcDevice*
624
627
// Save Mifare Classic specific data
625
628
do {
626
629
if (!flipper_format_write_comment_cstr (file , "Mifare Classic specific data" )) break ;
630
+
627
631
if (data -> type == MfClassicType1k ) {
628
632
if (!flipper_format_write_string_cstr (file , "Mifare Classic type" , "1K" )) break ;
629
633
blocks = 64 ;
630
634
} else if (data -> type == MfClassicType4k ) {
631
635
if (!flipper_format_write_string_cstr (file , "Mifare Classic type" , "4K" )) break ;
632
636
blocks = 256 ;
633
637
}
634
- if (!flipper_format_write_comment_cstr (file , "Mifare Classic blocks" )) break ;
638
+ if (!flipper_format_write_uint32 (
639
+ file , "Data format version" , & nfc_mifare_classic_data_format_version , 1 ))
640
+ break ;
641
+
642
+ if (!flipper_format_write_comment_cstr (
643
+ file , "Key map is the bit mask indicating valid key in each sector" ))
644
+ break ;
645
+ if (!flipper_format_write_hex_uint64 (file , "Key A map" , & data -> key_a_mask , 1 )) break ;
646
+ if (!flipper_format_write_hex_uint64 (file , "Key B map" , & data -> key_b_mask , 1 )) break ;
635
647
648
+ if (!flipper_format_write_comment_cstr (file , "Mifare Classic blocks" )) break ;
636
649
bool block_saved = true;
637
650
for (size_t i = 0 ; i < blocks ; i ++ ) {
638
651
string_printf (temp_str , "Block %d" , i );
@@ -654,6 +667,7 @@ static bool nfc_device_load_mifare_classic_data(FlipperFormat* file, NfcDevice*
654
667
bool parsed = false;
655
668
MfClassicData * data = & dev -> dev_data .mf_classic_data ;
656
669
string_t temp_str ;
670
+ uint32_t data_format_version = 0 ;
657
671
string_init (temp_str );
658
672
uint16_t data_blocks = 0 ;
659
673
@@ -669,6 +683,19 @@ static bool nfc_device_load_mifare_classic_data(FlipperFormat* file, NfcDevice*
669
683
} else {
670
684
break ;
671
685
}
686
+
687
+ // Read Mifare Classic format version
688
+ if (!flipper_format_read_uint32 (file , "Data format version" , & data_format_version , 1 )) {
689
+ // Load unread sectors with zero keys access for backward compatability
690
+ if (!flipper_format_rewind (file )) break ;
691
+ data -> key_a_mask = 0xffffffffffffffff ;
692
+ data -> key_b_mask = 0xffffffffffffffff ;
693
+ } else {
694
+ if (data_format_version != nfc_mifare_classic_data_format_version ) break ;
695
+ if (!flipper_format_read_hex_uint64 (file , "Key A map" , & data -> key_a_mask , 1 )) break ;
696
+ if (!flipper_format_read_hex_uint64 (file , "Key B map" , & data -> key_b_mask , 1 )) break ;
697
+ }
698
+
672
699
// Read Mifare Classic blocks
673
700
bool block_read = true;
674
701
for (size_t i = 0 ; i < data_blocks ; i ++ ) {
0 commit comments