ソースを参照

Merge picopass from https://gitlab.com/bettse/picopass

Willy-JL 1 年間 前
コミット
002502741c

+ 3 - 0
picopass/.catalog/changelog.md

@@ -1,3 +1,6 @@
+## 1.14
+ - Add plugin to parse some wiegand formats
+ - Store unknown blocks in picopass file with '??'
 ## 1.13
  - Rework loclass writer with datetime lib
 ## 1.12

+ 1 - 1
picopass/application.fam

@@ -14,7 +14,7 @@ App(
     ],
     stack_size=4 * 1024,
     fap_description="App to communicate with NFC tags using the PicoPass(iClass) format",
-    fap_version="1.13",
+    fap_version="1.14",
     fap_icon="125_10px.png",
     fap_category="NFC",
     fap_libs=["mbedtls"],

BIN
picopass/icons/Nfc_10px.png


BIN
picopass/icons/RFIDDolphinReceive_97x61.png


BIN
picopass/icons/RFIDDolphinSend_97x61.png


+ 16 - 6
picopass/picopass_device.c

@@ -4,8 +4,6 @@
 #include <flipper_format/flipper_format.h>
 #include <picopass_icons.h>
 
-#include <assets_icons.h>
-
 #include <toolbox/protocols/protocol_dict.h>
 #include <toolbox/hex.h>
 #include <lfrfid/protocols/lfrfid_protocols.h>
@@ -195,7 +193,8 @@ static bool picopass_device_save_file(
             furi_string_printf(temp_str, "%s/%s%s", folder, dev_name, extension);
         }
 
-        if(dev->format == PicopassDeviceSaveFormatHF ||
+        if(dev->format == PicopassDeviceSaveFormatOriginal ||
+           dev->format == PicopassDeviceSaveFormatLegacy ||
            dev->format == PicopassDeviceSaveFormatPartial) {
             // Open file
             if(!flipper_format_file_open_always(file, furi_string_get_cstr(temp_str))) break;
@@ -217,6 +216,12 @@ static bool picopass_device_save_file(
             for(size_t i = 0; i < app_limit; i++) {
                 furi_string_printf(temp_str, "Block %d", i);
                 if(card_data[i].valid) {
+                    if(dev->format == PicopassDeviceSaveFormatLegacy) {
+                        if(i == PICOPASS_ICLASS_PACS_CFG_BLOCK_INDEX) {
+                            card_data[i].data[0] = 0x03;
+                        }
+                    }
+
                     if(!flipper_format_write_hex(
                            file,
                            furi_string_get_cstr(temp_str),
@@ -251,7 +256,7 @@ static bool picopass_device_save_file(
 }
 
 bool picopass_device_save(PicopassDevice* dev, const char* dev_name) {
-    if(dev->format == PicopassDeviceSaveFormatHF) {
+    if(dev->format == PicopassDeviceSaveFormatOriginal) {
         return picopass_device_save_file(
             dev, dev_name, STORAGE_APP_DATA_PATH_PREFIX, PICOPASS_APP_EXTENSION, true);
     } else if(dev->format == PicopassDeviceSaveFormatLF) {
@@ -262,6 +267,11 @@ bool picopass_device_save(PicopassDevice* dev, const char* dev_name) {
     } else if(dev->format == PicopassDeviceSaveFormatPartial) {
         return picopass_device_save_file(
             dev, dev_name, STORAGE_APP_DATA_PATH_PREFIX, PICOPASS_APP_EXTENSION, true);
+    } else if(dev->format == PicopassDeviceSaveFormatLegacy) {
+        return picopass_device_save_file(
+            dev, dev_name, STORAGE_APP_DATA_PATH_PREFIX, PICOPASS_APP_EXTENSION, true);
+    } else {
+        FURI_LOG_E(TAG, "Unknown format");
     }
 
     return false;
@@ -384,7 +394,7 @@ void picopass_device_clear(PicopassDevice* dev) {
 
     picopass_device_data_clear(&dev->dev_data);
     memset(&dev->dev_data, 0, sizeof(dev->dev_data));
-    dev->format = PicopassDeviceSaveFormatHF;
+    dev->format = PicopassDeviceSaveFormatOriginal;
     furi_string_reset(dev->load_path);
 }
 
@@ -443,7 +453,7 @@ void picopass_device_data_clear(PicopassDeviceData* dev_data) {
 
 bool picopass_device_delete(PicopassDevice* dev, bool use_load_path) {
     furi_assert(dev);
-    if(dev->format != PicopassDeviceSaveFormatHF) {
+    if(dev->format != PicopassDeviceSaveFormatOriginal) {
         // Never delete other formats (LF, Seader, etc)
         return false;
     }

+ 2 - 1
picopass/picopass_device.h

@@ -68,7 +68,8 @@ typedef enum {
 } PicopassEncryption;
 
 typedef enum {
-    PicopassDeviceSaveFormatHF,
+    PicopassDeviceSaveFormatOriginal,
+    PicopassDeviceSaveFormatLegacy,
     PicopassDeviceSaveFormatLF,
     PicopassDeviceSaveFormatSeader,
     PicopassDeviceSaveFormatPartial,

+ 0 - 2
picopass/picopass_i.h

@@ -29,8 +29,6 @@
 #include <lib/toolbox/path.h>
 #include <picopass_icons.h>
 
-#include <assets_icons.h>
-
 #include <nfc/nfc.h>
 #include <toolbox/keys_dict.h>
 #include "protocol/picopass_poller.h"

+ 19 - 2
picopass/scenes/picopass_scene_card_menu.c

@@ -9,6 +9,7 @@ enum SubmenuIndex {
     SubmenuIndexWrite,
     SubmenuIndexEmulate,
     SubmenuIndexSavePartial,
+    SubmenuIndexSaveLegacy,
 };
 
 void picopass_scene_card_menu_submenu_callback(void* context, uint32_t index) {
@@ -27,7 +28,8 @@ void picopass_scene_card_menu_on_enter(void* context) {
 
     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[10].valid && 0x30 == card_data[10].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;
     bool secured = (card_data[PICOPASS_CONFIG_BLOCK_INDEX].data[7] & PICOPASS_FUSE_CRYPT10) !=
                    PICOPASS_FUSE_CRYPT0;
@@ -62,6 +64,15 @@ void picopass_scene_card_menu_on_enter(void* context) {
             picopass_scene_card_menu_submenu_callback,
             picopass);
 
+        if(SR) {
+            submenu_add_item(
+                submenu,
+                "Save as Legacy",
+                SubmenuIndexSaveLegacy,
+                picopass_scene_card_menu_submenu_callback,
+                picopass);
+        }
+
         if(plugin) {
             // Convert from byte array to uint64_t
             uint64_t credential = 0;
@@ -119,7 +130,7 @@ bool picopass_scene_card_menu_on_event(void* context, SceneManagerEvent event) {
             scene_manager_set_scene_state(
                 picopass->scene_manager, PicopassSceneCardMenu, SubmenuIndexSave);
             scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveName);
-            picopass->dev->format = PicopassDeviceSaveFormatHF;
+            picopass->dev->format = PicopassDeviceSaveFormatOriginal;
             consumed = true;
         } else if(event.event == SubmenuIndexSavePartial) {
             scene_manager_set_scene_state(
@@ -155,6 +166,12 @@ bool picopass_scene_card_menu_on_event(void* context, SceneManagerEvent event) {
                 picopass->scene_manager, PicopassSceneCardMenu, SubmenuIndexParse);
             scene_manager_next_scene(picopass->scene_manager, PicopassSceneFormats);
             consumed = true;
+        } else if(event.event == SubmenuIndexSaveLegacy) {
+            scene_manager_set_scene_state(
+                picopass->scene_manager, PicopassSceneCardMenu, SubmenuIndexSaveLegacy);
+            picopass->dev->format = PicopassDeviceSaveFormatLegacy;
+            scene_manager_next_scene(picopass->scene_manager, PicopassSceneSaveName);
+            consumed = true;
         }
     } else if(event.type == SceneManagerEventTypeBack) {
         consumed = scene_manager_search_and_switch_to_previous_scene(

+ 0 - 2
picopass/views/dict_attack.h

@@ -4,8 +4,6 @@
 #include <gui/modules/widget.h>
 #include <picopass_icons.h>
 
-#include <assets_icons.h>
-
 typedef struct DictAttack DictAttack;
 
 typedef void (*DictAttackCallback)(void* context);