Просмотр исходного кода

fix card parsing by checking keys

Luu 1 год назад
Родитель
Сommit
1d9537cb19
2 измененных файлов с 32 добавлено и 2 удалено
  1. 14 1
      scenes/metroflip_scene_bip.c
  2. 18 1
      scenes/metroflip_scene_charliecard.c

+ 14 - 1
scenes/metroflip_scene_bip.c

@@ -153,6 +153,15 @@ static bool
     bool parsed = false;
 
     do {
+        // verify sector 0 key A
+        MfClassicSectorTrailer* sec_tr = mf_classic_get_sector_trailer_by_sector(data, 0);
+
+        if(data->type != MfClassicType1k) break;
+
+        uint64_t key = bit_lib_bytes_to_num_be(sec_tr->key_a.data, 6);
+        if(key != bip_1k_keys[0].a) {
+            break;
+        }
         // Get Card ID, little-endian 4 bytes at sector 0 block 1, bytes 4-7
         const uint8_t card_id_start_block_num =
             mf_classic_get_first_block_num_of_sector(BIP_CARD_ID_SECTOR_NUMBER);
@@ -314,7 +323,11 @@ static NfcCommand metroflip_scene_bip_poller_callback(NfcGenericEvent event, voi
 
         dolphin_deed(DolphinDeedNfcReadSuccess);
         furi_string_reset(app->text_box_store);
-        bip_parse(app->nfc_device, parsed_data, mfc_data);
+        if(!bip_parse(app->nfc_device, parsed_data, mfc_data)) {
+            furi_string_reset(app->text_box_store);
+            FURI_LOG_I(TAG, "Unknown card type");
+            furi_string_printf(parsed_data, "\e#Unknown card\n");
+        }
         metroflip_app_blink_stop(app);
         widget_add_text_scroll_element(widget, 0, 0, 128, 64, furi_string_get_cstr(parsed_data));
 

+ 18 - 1
scenes/metroflip_scene_charliecard.c

@@ -1119,6 +1119,19 @@ static bool charliecard_parse(FuriString* parsed_data, const MfClassicData* data
     bool parsed = false;
 
     do {
+        // Verify key
+        // arbitrary sector in the main data portion
+        const uint8_t verify_sector = 3;
+        const MfClassicSectorTrailer* sec_tr =
+            mf_classic_get_sector_trailer_by_sector(data, verify_sector);
+
+        const uint64_t key_a =
+            bit_lib_bytes_to_num_be(sec_tr->key_a.data, COUNT_OF(sec_tr->key_a.data));
+        const uint64_t key_b =
+            bit_lib_bytes_to_num_be(sec_tr->key_b.data, COUNT_OF(sec_tr->key_b.data));
+        if(key_a != charliecard_1k_keys[verify_sector].a) break;
+        if(key_b != charliecard_1k_keys[verify_sector].b) break;
+
         // parse card data
         const uint32_t card_number = mfg_sector_parse(data);
         const CounterSector counter_sector = counter_sector_parse(data);
@@ -1222,7 +1235,11 @@ static NfcCommand
 
         dolphin_deed(DolphinDeedNfcReadSuccess);
         furi_string_reset(app->text_box_store);
-        charliecard_parse(parsed_data, mfc_data);
+        if(!charliecard_parse(parsed_data, mfc_data)) {
+            furi_string_reset(app->text_box_store);
+            FURI_LOG_I(TAG, "Unknown card type");
+            furi_string_printf(parsed_data, "\e#Unknown card\n");
+        }
         widget_add_text_scroll_element(widget, 0, 0, 128, 64, furi_string_get_cstr(parsed_data));
 
         widget_add_button_element(