Pārlūkot izejas kodu

Save as seader for iClass SR saved by NR-MAC

Eric Betts 11 mēneši atpakaļ
vecāks
revīzija
f916d87fdf
1 mainītis faili ar 19 papildinājumiem un 0 dzēšanām
  1. 19 0
      scenes/picopass_scene_saved_menu.c

+ 19 - 0
scenes/picopass_scene_saved_menu.c

@@ -8,6 +8,7 @@ enum SubmenuIndex {
     SubmenuIndexDelete,
     SubmenuIndexSaveAsLF,
     SubmenuIndexSaveLegacy,
+    SubmenuIndexSaveAsSeader,
 };
 
 void picopass_scene_saved_menu_submenu_callback(void* context, uint32_t index) {
@@ -26,8 +27,11 @@ void picopass_scene_saved_menu_on_enter(void* context) {
     bool secured = (card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[7] & PICOPASS_FUSE_CRYPT10) !=
                    PICOPASS_FUSE_CRYPT0;
     bool no_credential = picopass_is_memset(pacs->credential, 0x00, sizeof(pacs->credential));
+    bool SE = card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].valid &&
+              0x30 == card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].data[0];
     bool SR = card_data[PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX].data[0] == 0xA3 &&
               card_data[10].valid && 0x30 == card_data[10].data[0];
+    bool has_sio = SE || SR;
 
     submenu_add_item(
         submenu, "Info", SubmenuIndexInfo, picopass_scene_saved_menu_submenu_callback, picopass);
@@ -40,6 +44,15 @@ void picopass_scene_saved_menu_on_enter(void* context) {
         picopass_scene_saved_menu_submenu_callback,
         picopass);
 
+    if(secured && has_sio) {
+        submenu_add_item(
+            submenu,
+            "Save in Seader fmt",
+            SubmenuIndexSaveAsSeader,
+            picopass_scene_saved_menu_submenu_callback,
+            picopass);
+    }
+
     if(secured && !no_credential) {
         submenu_add_item(
             submenu,
@@ -113,6 +126,12 @@ bool picopass_scene_saved_menu_on_event(void* context, SceneManagerEvent event)
             picopass->dev->format = PicopassDeviceSaveFormatLegacy;
             scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveName);
             consumed = true;
+        } else if(event.event == SubmenuIndexSaveAsSeader) {
+            scene_manager_set_scene_state(
+                picopass->scene_manager, PicopassSceneSavedMenu, event.event);
+            scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveName);
+            picopass->dev->format = PicopassDeviceSaveFormatSeader;
+            consumed = true;
         }
     }