Created
March 19, 2023 15:11
-
-
Save valkheim/cd91324729485c799718288dbb157639 to your computer and use it in GitHub Desktop.
flipper zero - reenable evm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git applications/main/nfc/nfc.c applications/main/nfc/nfc.c | |
index 4540f5d9..16d5837e 100644 | |
--- applications/main/nfc/nfc.c | |
+++ applications/main/nfc/nfc.c | |
@@ -290,8 +290,6 @@ int32_t nfc_app(void* p) { | |
} else if(nfc->dev->format == NfcDeviceSaveFormatMifareClassic) { | |
scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate); | |
DOLPHIN_DEED(DolphinDeedNfcEmulate); | |
- } else if(nfc->dev->format == NfcDeviceSaveFormatBankCard) { | |
- scene_manager_next_scene(nfc->scene_manager, NfcSceneDeviceInfo); | |
} else { | |
scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid); | |
DOLPHIN_DEED(DolphinDeedNfcEmulate); | |
diff --git applications/main/nfc/scenes/nfc_scene_emv_menu.c applications/main/nfc/scenes/nfc_scene_emv_menu.c | |
index eb1e1004..3e0f1df4 100644 | |
--- applications/main/nfc/scenes/nfc_scene_emv_menu.c | |
+++ applications/main/nfc/scenes/nfc_scene_emv_menu.c | |
@@ -1,7 +1,10 @@ | |
#include "../nfc_i.h" | |
+#include <dolphin/dolphin.h> | |
enum SubmenuIndex { | |
SubmenuIndexInfo, | |
+ SubmenuIndexSave, | |
+ SubmenuIndexEmulate, | |
}; | |
void nfc_scene_emv_menu_submenu_callback(void* context, uint32_t index) { | |
@@ -14,9 +17,17 @@ void nfc_scene_emv_menu_on_enter(void* context) { | |
Nfc* nfc = context; | |
Submenu* submenu = nfc->submenu; | |
- submenu_add_item(submenu, "Info", SubmenuIndexInfo, nfc_scene_emv_menu_submenu_callback, nfc); | |
+ submenu_add_item( | |
+ submenu, "Save", SubmenuIndexSave, nfc_scene_emv_menu_submenu_callback, nfc); | |
+ submenu_add_item( | |
+ submenu, | |
+ "Emulate", | |
+ SubmenuIndexEmulate, | |
+ nfc_scene_emv_menu_submenu_callback, | |
+ nfc); | |
submenu_set_selected_item( | |
nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneEmvMenu)); | |
+ submenu_add_item(submenu, "Info", SubmenuIndexInfo, nfc_scene_emv_menu_submenu_callback, nfc); | |
view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu); | |
} | |
@@ -26,7 +37,21 @@ bool nfc_scene_emv_menu_on_event(void* context, SceneManagerEvent event) { | |
bool consumed = false; | |
if(event.type == SceneManagerEventTypeCustom) { | |
- if(event.event == SubmenuIndexInfo) { | |
+ if(event.event == SubmenuIndexSave) { | |
+ nfc->dev->format = NfcDeviceSaveFormatBankCard; | |
+ // Clear device name | |
+ nfc_device_set_name(nfc->dev, ""); | |
+ scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName); | |
+ consumed = true; | |
+ } else if(event.event == SubmenuIndexEmulate) { | |
+ scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate); | |
+ if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSetType)) { | |
+ DOLPHIN_DEED(DolphinDeedNfcAddEmulate); | |
+ } else { | |
+ DOLPHIN_DEED(DolphinDeedNfcEmulate); | |
+ } | |
+ consumed = true; | |
+ } else if(event.event == SubmenuIndexInfo) { | |
scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcDataInfo); | |
consumed = true; | |
} | |
diff --git applications/main/nfc/scenes/nfc_scene_saved_menu.c applications/main/nfc/scenes/nfc_scene_saved_menu.c | |
index ba1f9653..5405ceb3 100644 | |
--- applications/main/nfc/scenes/nfc_scene_saved_menu.c | |
+++ applications/main/nfc/scenes/nfc_scene_saved_menu.c | |
@@ -26,6 +26,7 @@ void nfc_scene_saved_menu_on_enter(void* context) { | |
Submenu* submenu = nfc->submenu; | |
if(nfc->dev->format == NfcDeviceSaveFormatUid || | |
+ nfc->dev->format == NfcDeviceSaveFormatBankCard || | |
nfc->dev->format == NfcDeviceSaveFormatMifareDesfire) { | |
submenu_add_item( | |
submenu, | |
diff --git lib/nfc/nfc_device.c lib/nfc/nfc_device.c | |
index 51791307..d8eb773f 100644 | |
--- lib/nfc/nfc_device.c | |
+++ lib/nfc/nfc_device.c | |
@@ -650,6 +650,35 @@ bool nfc_device_load_mifare_df_data(FlipperFormat* file, NfcDevice* dev) { | |
return parsed; | |
} | |
+static bool nfc_device_save_bank_card_data(FlipperFormat* file, NfcDevice* dev) { | |
+ bool saved = false; | |
+ EmvData* data = &dev->dev_data.emv_data; | |
+ uint32_t data_temp = 0; | |
+ | |
+ do { | |
+ // Write Bank card specific data | |
+ if(!flipper_format_write_comment_cstr(file, "Bank card specific data")) break; | |
+ if(!flipper_format_write_hex(file, "AID", data->aid, data->aid_len)) break; | |
+ if(!flipper_format_write_string_cstr(file, "Name", data->name)) break; | |
+ if(!flipper_format_write_hex(file, "Number", data->number, data->number_len)) break; | |
+ if(data->exp_mon) { | |
+ uint8_t exp_data[2] = {data->exp_mon, data->exp_year}; | |
+ if(!flipper_format_write_hex(file, "Exp data", exp_data, sizeof(exp_data))) break; | |
+ } | |
+ if(data->country_code) { | |
+ data_temp = data->country_code; | |
+ if(!flipper_format_write_uint32(file, "Country code", &data_temp, 1)) break; | |
+ } | |
+ if(data->currency_code) { | |
+ data_temp = data->currency_code; | |
+ if(!flipper_format_write_uint32(file, "Currency code", &data_temp, 1)) break; | |
+ } | |
+ saved = true; | |
+ } while(false); | |
+ | |
+ return saved; | |
+} | |
+ | |
// Leave for backward compatibility | |
bool nfc_device_load_bank_card_data(FlipperFormat* file, NfcDevice* dev) { | |
bool parsed = false; | |
@@ -1069,7 +1098,7 @@ bool nfc_device_save(NfcDevice* dev, const char* dev_name) { | |
if(!flipper_format_write_header_cstr(file, nfc_file_header, nfc_file_version)) break; | |
// Write nfc device type | |
if(!flipper_format_write_comment_cstr( | |
- file, "Nfc device type can be UID, Mifare Ultralight, Mifare Classic")) | |
+ file, "Nfc device type can be UID, Mifare Ultralight, Mifare Classic, Bank card")) | |
break; | |
nfc_device_prepare_format_string(dev, temp_str); | |
if(!flipper_format_write_string(file, "Device type", temp_str)) break; | |
@@ -1086,6 +1115,8 @@ bool nfc_device_save(NfcDevice* dev, const char* dev_name) { | |
if(!nfc_device_save_mifare_ul_data(file, dev)) break; | |
} else if(dev->format == NfcDeviceSaveFormatMifareDesfire) { | |
if(!nfc_device_save_mifare_df_data(file, dev)) break; | |
+ } else if(dev->format == NfcDeviceSaveFormatBankCard) { | |
+ if(!nfc_device_save_bank_card_data(file, dev)) break; | |
} else if(dev->format == NfcDeviceSaveFormatMifareClassic) { | |
// Save data | |
if(!nfc_device_save_mifare_classic_data(file, dev)) break; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment