#include "../mifare_fuzzer_i.h" #include "../mifare_fuzzer_custom_events.h" enum SubmenuIndex { SubmenuIndexClassic1k, SubmenuIndexClassic4k, SubmenuIndexUltralight, SubmenuIndexFile, }; /// @brief mifare_fuzzer_scene_start_submenu_callback() /// @param context /// @param index void mifare_fuzzer_scene_start_submenu_callback(void* context, uint32_t index) { //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_submenu_callback() :: index = %ld", index); MifareFuzzerApp* app = context; uint8_t custom_event = 255; switch(index) { case SubmenuIndexClassic1k: custom_event = MifareFuzzerEventClassic1k; break; case SubmenuIndexClassic4k: custom_event = MifareFuzzerEventClassic4k; break; case SubmenuIndexUltralight: custom_event = MifareFuzzerEventUltralight; break; case SubmenuIndexFile: custom_event = MifareFuzzerEventFile; break; default: return; } //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_submenu_callback() :: custom_event = %d", custom_event); view_dispatcher_send_custom_event(app->view_dispatcher, custom_event); } /// @brief mifare_fuzzer_scene_start_on_enter() /// @param context void mifare_fuzzer_scene_start_on_enter(void* context) { //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_on_enter()"); MifareFuzzerApp* app = context; Submenu* submenu_card = app->submenu_card; submenu_set_header(submenu_card, "Mifare Fuzzer (card)"); submenu_add_item( submenu_card, "Classic 1k", SubmenuIndexClassic1k, mifare_fuzzer_scene_start_submenu_callback, app); submenu_add_item( submenu_card, "Classic 4k", SubmenuIndexClassic4k, mifare_fuzzer_scene_start_submenu_callback, app); submenu_add_item( submenu_card, "Ultralight", SubmenuIndexUltralight, mifare_fuzzer_scene_start_submenu_callback, app); submenu_add_item( submenu_card, "From file", SubmenuIndexFile, mifare_fuzzer_scene_start_submenu_callback, app); // set selected menu submenu_set_selected_item( submenu_card, scene_manager_get_scene_state(app->scene_manager, MifareFuzzerSceneStart)); view_dispatcher_switch_to_view(app->view_dispatcher, MifareFuzzerViewSelectCard); } /// @brief mifare_fuzzer_scene_start_on_event() /// @param context /// @param event /// @return /// @param context /// @param event /// @return bool mifare_fuzzer_scene_start_on_event(void* context, SceneManagerEvent event) { //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_on_event()"); MifareFuzzerApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_on_event() :: event.event = %ld", event.event); app->card_file_path = NULL; app->nfc_device_parsed = false; if(event.event == MifareFuzzerEventClassic1k) { // save selected item scene_manager_set_scene_state( app->scene_manager, MifareFuzzerSceneStart, SubmenuIndexClassic1k); // set emulator card app->card = MifareCardClassic1k; mifare_fuzzer_emulator_set_card(app->emulator_view, app->card, NULL); // open next scene scene_manager_next_scene(app->scene_manager, MifareFuzzerSceneAttack); consumed = true; } else if(event.event == MifareFuzzerEventClassic4k) { // save selected item scene_manager_set_scene_state( app->scene_manager, MifareFuzzerSceneStart, SubmenuIndexClassic4k); // set emulator card app->card = MifareCardClassic4k; mifare_fuzzer_emulator_set_card(app->emulator_view, app->card, NULL); // open next scene scene_manager_next_scene(app->scene_manager, MifareFuzzerSceneAttack); consumed = true; } else if(event.event == MifareFuzzerEventUltralight) { // save selected item scene_manager_set_scene_state( app->scene_manager, MifareFuzzerSceneStart, SubmenuIndexUltralight); // set emulator card app->card = MifareCardUltralight; mifare_fuzzer_emulator_set_card(app->emulator_view, app->card, NULL); // open next scene scene_manager_next_scene(app->scene_manager, MifareFuzzerSceneAttack); consumed = true; } else if(event.event == MifareFuzzerEventFile) { // save selected item scene_manager_set_scene_state( app->scene_manager, MifareFuzzerSceneStart, SubmenuIndexFile); // Don't set emulator card (yet), read file instead DialogsFileBrowserOptions browser_options; FuriString* initial_path = furi_string_alloc_set("/ext/nfc"); dialog_file_browser_set_basic_options( &browser_options, MIFARE_FUZZER_CARD_FILE_EXT, NULL); browser_options.hide_ext = false; app->card_file_path = furi_string_alloc(); bool wasFileSelected = dialog_file_browser_show( app->dialogs, app->card_file_path, initial_path, &browser_options); furi_string_free(initial_path); if(wasFileSelected) { MifareFuzzerEmulator* emulator = app->emulator_view; NfcDevice* nfc_device = app->worker->nfc_device; const char* path = furi_string_get_cstr(app->card_file_path); if(nfc_device_load(nfc_device, path)) { app->nfc_device_parsed = true; NfcProtocol protocol = nfc_device_get_protocol(nfc_device); if(protocol == NfcProtocolMfClassic) { const MfClassicData* mfc_data = nfc_device_get_data(nfc_device, protocol); if(mfc_data->type == MfClassicType1k) { app->card = MifareCardClassic1k; } else if(mfc_data->type == MfClassicType4k) { app->card = MifareCardClassic4k; } else { app->nfc_device_parsed = false; } } else if(protocol == NfcProtocolMfUltralight) { app->card = MifareCardUltralight; } else { app->nfc_device_parsed = false; } if(app->nfc_device_parsed) { mifare_fuzzer_emulator_set_card(emulator, app->card, app->card_file_path); scene_manager_next_scene(app->scene_manager, MifareFuzzerSceneAttack); } else { app->card = MifareCardUnsupported; mifare_fuzzer_emulator_set_card(emulator, MifareCardUnsupported, NULL); scene_manager_next_scene(app->scene_manager, MifareFuzzerSceneEmulator); } } consumed = true; } } } else if(event.type == SceneManagerEventTypeTick) { //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_on_event() :: SceneManagerEventTypeTick"); //consumed = true; } return consumed; } /// @brief mifare_fuzzer_scene_start_on_exit() /// @param context void mifare_fuzzer_scene_start_on_exit(void* context) { //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_on_exit()"); MifareFuzzerApp* app = context; submenu_reset(app->submenu_card); }