mifare_fuzzer_scene_start.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "../mifare_fuzzer_i.h"
  2. #include "../mifare_fuzzer_custom_events.h"
  3. enum SubmenuIndex {
  4. SubmenuIndexClassic1k,
  5. SubmenuIndexClassic4k,
  6. SubmenuIndexUltralight,
  7. SubmenuIndexFile,
  8. };
  9. /// @brief mifare_fuzzer_scene_start_submenu_callback()
  10. /// @param context
  11. /// @param index
  12. void mifare_fuzzer_scene_start_submenu_callback(void* context, uint32_t index) {
  13. //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_submenu_callback() :: index = %ld", index);
  14. MifareFuzzerApp* app = context;
  15. uint8_t custom_event = 255;
  16. switch(index) {
  17. case SubmenuIndexClassic1k:
  18. custom_event = MifareFuzzerEventClassic1k;
  19. break;
  20. case SubmenuIndexClassic4k:
  21. custom_event = MifareFuzzerEventClassic4k;
  22. break;
  23. case SubmenuIndexUltralight:
  24. custom_event = MifareFuzzerEventUltralight;
  25. break;
  26. case SubmenuIndexFile:
  27. custom_event = MifareFuzzerEventFile;
  28. break;
  29. default:
  30. return;
  31. }
  32. //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_submenu_callback() :: custom_event = %d", custom_event);
  33. view_dispatcher_send_custom_event(app->view_dispatcher, custom_event);
  34. }
  35. /// @brief mifare_fuzzer_scene_start_on_enter()
  36. /// @param context
  37. void mifare_fuzzer_scene_start_on_enter(void* context) {
  38. //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_on_enter()");
  39. MifareFuzzerApp* app = context;
  40. Submenu* submenu_card = app->submenu_card;
  41. submenu_set_header(submenu_card, "Mifare Fuzzer (card)");
  42. submenu_add_item(
  43. submenu_card,
  44. "Classic 1k",
  45. SubmenuIndexClassic1k,
  46. mifare_fuzzer_scene_start_submenu_callback,
  47. app);
  48. submenu_add_item(
  49. submenu_card,
  50. "Classic 4k",
  51. SubmenuIndexClassic4k,
  52. mifare_fuzzer_scene_start_submenu_callback,
  53. app);
  54. submenu_add_item(
  55. submenu_card,
  56. "Ultralight",
  57. SubmenuIndexUltralight,
  58. mifare_fuzzer_scene_start_submenu_callback,
  59. app);
  60. submenu_add_item(
  61. submenu_card,
  62. "From file",
  63. SubmenuIndexFile,
  64. mifare_fuzzer_scene_start_submenu_callback,
  65. app);
  66. // set selected menu
  67. submenu_set_selected_item(
  68. submenu_card, scene_manager_get_scene_state(app->scene_manager, MifareFuzzerSceneStart));
  69. view_dispatcher_switch_to_view(app->view_dispatcher, MifareFuzzerViewSelectCard);
  70. }
  71. /// @brief mifare_fuzzer_scene_start_on_event()
  72. /// @param context
  73. /// @param event
  74. /// @return
  75. /// @param context
  76. /// @param event
  77. /// @return
  78. bool mifare_fuzzer_scene_start_on_event(void* context, SceneManagerEvent event) {
  79. //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_on_event()");
  80. MifareFuzzerApp* app = context;
  81. bool consumed = false;
  82. if(event.type == SceneManagerEventTypeCustom) {
  83. //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_on_event() :: event.event = %ld", event.event);
  84. app->card_file_path = NULL;
  85. app->nfc_device_parsed = false;
  86. if(event.event == MifareFuzzerEventClassic1k) {
  87. // save selected item
  88. scene_manager_set_scene_state(
  89. app->scene_manager, MifareFuzzerSceneStart, SubmenuIndexClassic1k);
  90. // set emulator card
  91. app->card = MifareCardClassic1k;
  92. mifare_fuzzer_emulator_set_card(app->emulator_view, app->card, NULL);
  93. // open next scene
  94. scene_manager_next_scene(app->scene_manager, MifareFuzzerSceneAttack);
  95. consumed = true;
  96. } else if(event.event == MifareFuzzerEventClassic4k) {
  97. // save selected item
  98. scene_manager_set_scene_state(
  99. app->scene_manager, MifareFuzzerSceneStart, SubmenuIndexClassic4k);
  100. // set emulator card
  101. app->card = MifareCardClassic4k;
  102. mifare_fuzzer_emulator_set_card(app->emulator_view, app->card, NULL);
  103. // open next scene
  104. scene_manager_next_scene(app->scene_manager, MifareFuzzerSceneAttack);
  105. consumed = true;
  106. } else if(event.event == MifareFuzzerEventUltralight) {
  107. // save selected item
  108. scene_manager_set_scene_state(
  109. app->scene_manager, MifareFuzzerSceneStart, SubmenuIndexUltralight);
  110. // set emulator card
  111. app->card = MifareCardUltralight;
  112. mifare_fuzzer_emulator_set_card(app->emulator_view, app->card, NULL);
  113. // open next scene
  114. scene_manager_next_scene(app->scene_manager, MifareFuzzerSceneAttack);
  115. consumed = true;
  116. } else if(event.event == MifareFuzzerEventFile) {
  117. // save selected item
  118. scene_manager_set_scene_state(
  119. app->scene_manager, MifareFuzzerSceneStart, SubmenuIndexFile);
  120. // Don't set emulator card (yet), read file instead
  121. DialogsFileBrowserOptions browser_options;
  122. FuriString* initial_path = furi_string_alloc_set("/ext/nfc");
  123. dialog_file_browser_set_basic_options(
  124. &browser_options, MIFARE_FUZZER_CARD_FILE_EXT, NULL);
  125. browser_options.hide_ext = false;
  126. app->card_file_path = furi_string_alloc();
  127. bool wasFileSelected = dialog_file_browser_show(
  128. app->dialogs, app->card_file_path, initial_path, &browser_options);
  129. furi_string_free(initial_path);
  130. if(wasFileSelected) {
  131. MifareFuzzerEmulator* emulator = app->emulator_view;
  132. NfcDevice* nfc_device = app->worker->nfc_device;
  133. const char* path = furi_string_get_cstr(app->card_file_path);
  134. if(nfc_device_load(nfc_device, path)) {
  135. app->nfc_device_parsed = true;
  136. NfcProtocol protocol = nfc_device_get_protocol(nfc_device);
  137. if(protocol == NfcProtocolMfClassic) {
  138. const MfClassicData* mfc_data = nfc_device_get_data(nfc_device, protocol);
  139. if(mfc_data->type == MfClassicType1k) {
  140. app->card = MifareCardClassic1k;
  141. } else if(mfc_data->type == MfClassicType4k) {
  142. app->card = MifareCardClassic4k;
  143. } else {
  144. app->nfc_device_parsed = false;
  145. }
  146. } else if(protocol == NfcProtocolMfUltralight) {
  147. app->card = MifareCardUltralight;
  148. } else {
  149. app->nfc_device_parsed = false;
  150. }
  151. if(app->nfc_device_parsed) {
  152. mifare_fuzzer_emulator_set_card(emulator, app->card, app->card_file_path);
  153. scene_manager_next_scene(app->scene_manager, MifareFuzzerSceneAttack);
  154. } else {
  155. app->card = MifareCardUnsupported;
  156. mifare_fuzzer_emulator_set_card(emulator, MifareCardUnsupported, NULL);
  157. scene_manager_next_scene(app->scene_manager, MifareFuzzerSceneEmulator);
  158. }
  159. }
  160. consumed = true;
  161. }
  162. }
  163. } else if(event.type == SceneManagerEventTypeTick) {
  164. //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_on_event() :: SceneManagerEventTypeTick");
  165. //consumed = true;
  166. }
  167. return consumed;
  168. }
  169. /// @brief mifare_fuzzer_scene_start_on_exit()
  170. /// @param context
  171. void mifare_fuzzer_scene_start_on_exit(void* context) {
  172. //FURI_LOG_D(TAG, "mifare_fuzzer_scene_start_on_exit()");
  173. MifareFuzzerApp* app = context;
  174. submenu_reset(app->submenu_card);
  175. }