Forráskód Böngészése

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

Willy-JL 8 hónapja
szülő
commit
2cf941be62

BIN
picopass/.catalog/screenshots/1.png


BIN
picopass/.catalog/screenshots/3.png


BIN
picopass/.catalog/screenshots/menu.png


+ 0 - 0
picopass/.catalog/screenshots/2.png → picopass/.catalog/screenshots/pacs.png


BIN
picopass/.catalog/screenshots/saved menu.png


+ 2 - 0
picopass/picopass.c

@@ -117,6 +117,8 @@ Picopass* picopass_alloc() {
         }
     }
 
+    picopass->auto_nr_mac = false;
+
     return picopass;
 }
 

+ 2 - 0
picopass/picopass_i.h

@@ -118,6 +118,8 @@ struct Picopass {
     PicopassDictAttackContext dict_attack_ctx;
     PicopassWriteKeyContext write_key_context;
     PicopassLoclassContext loclass_context;
+
+    bool auto_nr_mac;
 };
 
 typedef enum {

+ 37 - 1
picopass/scenes/picopass_scene_elite_dict_attack.c

@@ -4,6 +4,8 @@
 
 #define PICOPASS_SCENE_DICT_ATTACK_KEYS_BATCH_UPDATE (10)
 
+#define TAG "PicopassSceneEliteDictAttack"
+
 enum {
     PicopassSceneEliteDictAttackDictEliteUser,
     PicopassSceneEliteDictAttackDictStandard,
@@ -175,6 +177,7 @@ void picopass_scene_elite_dict_attack_on_enter(void* context) {
 bool picopass_scene_elite_dict_attack_on_event(void* context, SceneManagerEvent event) {
     Picopass* picopass = context;
     bool consumed = false;
+    PicopassDeviceAuthMethod auth = picopass->dev->dev_data.auth;
 
     if(event.type == SceneManagerEventTypeCustom) {
         if(event.event == PicopassCustomEventPollerSuccess) {
@@ -184,7 +187,40 @@ bool picopass_scene_elite_dict_attack_on_event(void* context, SceneManagerEvent
                    PICOPASS_BLOCK_LEN) == 0) {
                 scene_manager_next_scene(picopass->scene_manager, PicopassSceneReadFactorySuccess);
             } else {
-                scene_manager_next_scene(picopass->scene_manager, PicopassSceneReadCardSuccess);
+                if(auth == PicopassDeviceAuthMethodFailed && picopass->auto_nr_mac) {
+                    // save partial as <CSN>-partial
+                    picopass->dev->format = PicopassDeviceSaveFormatPartial;
+                    uint8_t* csn =
+                        picopass->dev->dev_data.card_data[PICOPASS_CSN_BLOCK_INDEX].data;
+                    for(size_t i = 0; i < PICOPASS_BLOCK_LEN; i++) {
+                        snprintf(
+                            picopass->text_store + 2 * i,
+                            sizeof(picopass->text_store),
+                            "%02X",
+                            csn[i]);
+                    }
+                    snprintf(
+                        picopass->text_store + 2 * PICOPASS_BLOCK_LEN,
+                        sizeof(picopass->text_store),
+                        "-partial");
+                    strlcpy(
+                        picopass->dev->dev_name,
+                        picopass->text_store,
+                        strlen(picopass->text_store) + 1);
+                    FURI_LOG_D(TAG, "Saving name: %s", picopass->text_store);
+
+                    picopass_device_delete(picopass->dev, true);
+                    if(picopass_device_save(picopass->dev, picopass->text_store)) {
+                        scene_manager_next_scene(picopass->scene_manager, PicopassSceneEmulate);
+                    } else {
+                        FURI_LOG_W(TAG, "Failed to save partial file");
+                        scene_manager_next_scene(
+                            picopass->scene_manager, PicopassSceneReadCardSuccess);
+                    }
+                } else {
+                    scene_manager_next_scene(
+                        picopass->scene_manager, PicopassSceneReadCardSuccess);
+                }
             }
             consumed = true;
         } else if(event.event == PicopassCustomEventDictAttackUpdateView) {

+ 4 - 2
picopass/scenes/picopass_scene_emulate.c

@@ -15,8 +15,10 @@ void picopass_scene_emulate_on_enter(void* context) {
     Widget* widget = picopass->widget;
     widget_reset(widget);
     widget_add_icon_element(widget, 0, 3, &I_RFIDDolphinSend_97x61);
-    widget_add_string_element(widget, 89, 32, AlignCenter, AlignTop, FontPrimary, "Emulating");
-    widget_add_string_element(widget, 89, 42, AlignCenter, AlignTop, FontPrimary, "PicoPass");
+    widget_add_string_element(widget, 92, 30, AlignCenter, AlignTop, FontPrimary, "Emulating");
+    widget_add_string_element(widget, 92, 40, AlignCenter, AlignTop, FontPrimary, "PicoPass");
+    widget_add_string_element(
+        widget, 34, 55, AlignLeft, AlignTop, FontSecondary, "Touch flipper to reader");
 
     view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewWidget);
     picopass_blink_emulate_start(picopass);

+ 10 - 4
picopass/scenes/picopass_scene_nr_mac_saved.c

@@ -27,10 +27,16 @@ bool picopass_scene_nr_mac_saved_on_event(void* context, SceneManagerEvent event
 
     if(event.type == SceneManagerEventTypeCustom) {
         if(event.event == PicopassCustomEventViewExit) {
-            scene_manager_set_scene_state(
-                picopass->scene_manager, PicopassSceneStart, 0); // Set back to "read card"
-            consumed = scene_manager_search_and_switch_to_previous_scene(
-                picopass->scene_manager, PicopassSceneStart);
+            if(picopass->auto_nr_mac) {
+                consumed = scene_manager_search_and_switch_to_previous_scene(
+                    picopass->scene_manager, PicopassSceneEliteDictAttack);
+                picopass->auto_nr_mac = false;
+            } else {
+                scene_manager_set_scene_state(
+                    picopass->scene_manager, PicopassSceneStart, 0); // Set back to "read card"
+                consumed = scene_manager_search_and_switch_to_previous_scene(
+                    picopass->scene_manager, PicopassSceneStart);
+            }
         }
     }
     return consumed;

+ 17 - 2
picopass/scenes/picopass_scene_start.c

@@ -1,8 +1,11 @@
 #include "../picopass_i.h"
+#include <furi_hal.h>
+
 enum SubmenuIndex {
     SubmenuIndexRead,
     SubmenuIndexSaved,
     SubmenuIndexLoclass,
+    SubmenuIndexNRMAC,
     SubmenuIndexAcknowledgements,
     SubmenuIndexKeygenAttack,
 };
@@ -13,6 +16,8 @@ void picopass_scene_start_submenu_callback(void* context, uint32_t index) {
 }
 void picopass_scene_start_on_enter(void* context) {
     Picopass* picopass = context;
+    // Reset on enter
+    picopass->auto_nr_mac = false;
 
     Submenu* submenu = picopass->submenu;
     submenu_add_item(
@@ -21,6 +26,10 @@ void picopass_scene_start_on_enter(void* context) {
         submenu, "Saved", SubmenuIndexSaved, picopass_scene_start_submenu_callback, picopass);
     submenu_add_item(
         submenu, "Loclass", SubmenuIndexLoclass, picopass_scene_start_submenu_callback, picopass);
+    if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
+        submenu_add_item(
+            submenu, "NR-MAC", SubmenuIndexNRMAC, picopass_scene_start_submenu_callback, picopass);
+    }
     submenu_add_item(
         submenu,
         "Acknowledgements",
@@ -59,12 +68,18 @@ bool picopass_scene_start_on_event(void* context, SceneManagerEvent event) {
             consumed = true;
         } else if(event.event == SubmenuIndexLoclass) {
             scene_manager_set_scene_state(
-                picopass->scene_manager, PicopassSceneStart, PicopassSceneLoclass);
+                picopass->scene_manager, PicopassSceneStart, SubmenuIndexLoclass);
             scene_manager_next_scene(picopass->scene_manager, PicopassSceneLoclass);
             consumed = true;
+        } else if(event.event == SubmenuIndexNRMAC) {
+            picopass->auto_nr_mac = true;
+            scene_manager_set_scene_state(
+                picopass->scene_manager, PicopassSceneStart, SubmenuIndexNRMAC);
+            scene_manager_next_scene(picopass->scene_manager, PicopassSceneEliteDictAttack);
+            consumed = true;
         } else if(event.event == SubmenuIndexAcknowledgements) {
             scene_manager_set_scene_state(
-                picopass->scene_manager, PicopassSceneStart, PicopassSceneAcknowledgements);
+                picopass->scene_manager, PicopassSceneStart, SubmenuIndexAcknowledgements);
             scene_manager_next_scene(picopass->scene_manager, PicopassSceneAcknowledgements);
             consumed = true;
         } else if(event.event == SubmenuIndexKeygenAttack) {