Skip to content

Instantly share code, notes, and snippets.

@valkheim
Created March 19, 2023 15:11
Show Gist options
  • Save valkheim/cd91324729485c799718288dbb157639 to your computer and use it in GitHub Desktop.
Save valkheim/cd91324729485c799718288dbb157639 to your computer and use it in GitHub Desktop.
flipper zero - reenable evm
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