 9c59bcd776
			
		
	
	
		9c59bcd776
		
			
		
	
	
	
	
		
			
			* nfc: add new read scene * lib: refactore nfc library * mifare desfire: add read card fuction * lib nfc: add auto read worker * nfc: add supported cards * nfc: add mifare classic read success scene * nfc: add troyka support * submodule: update protobuf * nfc: mifare classic keys cache * nfc: rework mifare classic key cache * Correct spelling * nfc: add user dictionary * nfc: introduce block read map in fff * nfc: rework dict attack * nfc: improve dict attack * nfc: rework mifare classic format * nfc: rework MFC read with Reader * nfc: add gui for MFC read success scene * nfc: fix dict attack view gui * nfc: add retry and exit confirm scenes * nfc: add retry and exit scenes navigation * nfc: check user dictionary * nfc: remove unused scenes * nfc: rename functions in nfc worker * nfc: rename mf_classic_dict_attack -> dict_attack * nfc: change scenes names * nfc: remove scene tick events * nfc: rework dict calls with buffer streams * nfc: fix notifications * nfc: fix mf desfire navigation * nfc: remove notification from mf classic read success * nfc: fix read sectors calculation * nfc: add fallback for unknown card * nfc: show file name while emulating * nfc: fix build * nfc: fix memory leak * nfc: fix desfire read * nfc: add no dict found navigation * nfc: add read views * nfc: update card fix * nfc: fix access bytes save * nfc: add exit and retry confirm to mf ultralight read success * nfc: introduce detect reader * nfc: change record open arg to macros * nfc: fix start from archive Co-authored-by: Astra <astra@astrra.space> Co-authored-by: あく <alleteam@gmail.com>
		
			
				
	
	
		
			105 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "../nfc_i.h"
 | |
| #include <dolphin/dolphin.h>
 | |
| 
 | |
| #define NFC_SCENE_READ_SUCCESS_SHIFT "              "
 | |
| 
 | |
| enum {
 | |
|     MfDesfireReadSuccessStateShowUID,
 | |
|     MfDesfireReadSuccessStateShowData,
 | |
| };
 | |
| 
 | |
| void nfc_scene_mf_desfire_read_success_dialog_callback(DialogExResult result, void* context) {
 | |
|     Nfc* nfc = context;
 | |
| 
 | |
|     view_dispatcher_send_custom_event(nfc->view_dispatcher, result);
 | |
| }
 | |
| 
 | |
| void nfc_scene_mf_desfire_read_success_on_enter(void* context) {
 | |
|     Nfc* nfc = context;
 | |
| 
 | |
|     MifareDesfireData* data = &nfc->dev->dev_data.mf_df_data;
 | |
|     DialogEx* dialog_ex = nfc->dialog_ex;
 | |
|     dialog_ex_set_left_button_text(dialog_ex, "Retry");
 | |
|     dialog_ex_set_center_button_text(dialog_ex, "Data");
 | |
|     dialog_ex_set_right_button_text(dialog_ex, "More");
 | |
|     dialog_ex_set_icon(dialog_ex, 8, 16, &I_Medium_chip_22x21);
 | |
| 
 | |
|     uint16_t n_apps = 0;
 | |
|     uint16_t n_files = 0;
 | |
| 
 | |
|     for(MifareDesfireApplication* app = data->app_head; app; app = app->next) {
 | |
|         n_apps++;
 | |
|         for(MifareDesfireFile* file = app->file_head; file; file = file->next) {
 | |
|             n_files++;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     nfc_text_store_set(
 | |
|         nfc,
 | |
|         "UID: %02X %02X %02X %02X %02X %02X %02X\n" NFC_SCENE_READ_SUCCESS_SHIFT
 | |
|         "%d%s bytes\n" NFC_SCENE_READ_SUCCESS_SHIFT "%d bytes free\n"
 | |
|         "%d application%s, %d file%s",
 | |
|         data->version.uid[0],
 | |
|         data->version.uid[1],
 | |
|         data->version.uid[2],
 | |
|         data->version.uid[3],
 | |
|         data->version.uid[4],
 | |
|         data->version.uid[5],
 | |
|         data->version.uid[6],
 | |
|         1 << (data->version.sw_storage >> 1),
 | |
|         (data->version.sw_storage & 1) ? "+" : "",
 | |
|         data->free_memory ? data->free_memory->bytes : 0,
 | |
|         n_apps,
 | |
|         n_apps == 1 ? "" : "s",
 | |
|         n_files,
 | |
|         n_files == 1 ? "" : "s");
 | |
|     dialog_ex_set_text(dialog_ex, nfc->text_store, 8, 6, AlignLeft, AlignTop);
 | |
|     dialog_ex_set_context(dialog_ex, nfc);
 | |
|     dialog_ex_set_result_callback(dialog_ex, nfc_scene_mf_desfire_read_success_dialog_callback);
 | |
| 
 | |
|     scene_manager_set_scene_state(
 | |
|         nfc->scene_manager, NfcSceneMfDesfireReadSuccess, MfDesfireReadSuccessStateShowUID);
 | |
|     view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewDialogEx);
 | |
| }
 | |
| 
 | |
| bool nfc_scene_mf_desfire_read_success_on_event(void* context, SceneManagerEvent event) {
 | |
|     Nfc* nfc = context;
 | |
|     bool consumed = false;
 | |
|     uint32_t state =
 | |
|         scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfDesfireReadSuccess);
 | |
| 
 | |
|     if(event.type == SceneManagerEventTypeCustom) {
 | |
|         if(state == MfDesfireReadSuccessStateShowUID && event.event == DialogExResultLeft) {
 | |
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneRetryConfirm);
 | |
|             consumed = true;
 | |
|         } else if(state == MfDesfireReadSuccessStateShowUID && event.event == DialogExResultCenter) {
 | |
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneMfDesfireData);
 | |
|             consumed = true;
 | |
|         } else if(state == MfDesfireReadSuccessStateShowUID && event.event == DialogExResultRight) {
 | |
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneMfDesfireMenu);
 | |
|             consumed = true;
 | |
|         }
 | |
|     } else if(event.type == SceneManagerEventTypeBack) {
 | |
|         if(state == MfDesfireReadSuccessStateShowData) {
 | |
|             view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewDialogEx);
 | |
|             scene_manager_set_scene_state(
 | |
|                 nfc->scene_manager,
 | |
|                 NfcSceneMfDesfireReadSuccess,
 | |
|                 MfDesfireReadSuccessStateShowUID);
 | |
|             consumed = true;
 | |
|         } else {
 | |
|             scene_manager_next_scene(nfc->scene_manager, NfcSceneExitConfirm);
 | |
|             consumed = true;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return consumed;
 | |
| }
 | |
| 
 | |
| void nfc_scene_mf_desfire_read_success_on_exit(void* context) {
 | |
|     Nfc* nfc = context;
 | |
| 
 | |
|     // Clean dialog
 | |
|     dialog_ex_reset(nfc->dialog_ex);
 | |
| }
 |