Eric Betts 9 месяцев назад
Родитель
Сommit
9ea747ecc9
7 измененных файлов с 37 добавлено и 16 удалено
  1. 0 2
      passy.c
  2. 1 0
      passy.h
  3. 6 0
      passy_common.h
  4. 2 0
      passy_i.h
  5. 0 2
      passy_reader.c
  6. 2 1
      scenes/passy_scene_doe_input.c
  7. 26 11
      scenes/passy_scene_main_menu.c

+ 0 - 2
passy.c

@@ -306,8 +306,6 @@ int32_t passy_app(void* p) {
     UNUSED(p);
     Passy* passy = passy_alloc();
 
-    passy_load_mrz_info(passy);
-
     scene_manager_next_scene(passy->scene_manager, PassySceneMainMenu);
 
     view_dispatcher_run(passy->view_dispatcher);

+ 1 - 0
passy.h

@@ -2,5 +2,6 @@
 
 typedef struct Passy Passy;
 
+bool passy_load_mrz_info(Passy* passy);
 bool passy_save_mrz_info(Passy* passy);
 bool passy_delete_mrz_info(Passy* passy);

+ 6 - 0
passy_common.h

@@ -4,6 +4,12 @@
 #include <furi.h>
 #include <toolbox/bit_buffer.h>
 
+typedef enum {
+    PassyReadNone = 0,
+    PassyReadDG1,
+    PassyReadDG2,
+} PassyReadType;
+
 void passy_log_bitbuffer(char* tag, char* prefix, BitBuffer* buffer);
 void passy_log_buffer(char* tag, char* prefix, uint8_t* buffer, size_t buffer_len);
 void passy_mac(uint8_t* key, uint8_t* data, size_t data_length, uint8_t* mac, bool prepadded);

+ 2 - 0
passy_i.h

@@ -88,6 +88,8 @@ struct Passy {
     char date_of_expiry[PASSY_DOE_MAX_LENGTH + 1];
 
     BitBuffer* DG1;
+
+    PassyReadType read_type;
 };
 
 typedef enum {

+ 0 - 2
passy_reader.c

@@ -48,8 +48,6 @@ PassyReader* passy_reader_alloc(Passy* passy, Iso14443_4bPoller* iso14443_4b_pol
     date_of_expiry[strlen(passy->date_of_expiry)] = passy_checksum(passy->date_of_expiry);
     FURI_LOG_I(TAG, "Date of expiry: %s", date_of_expiry);
 
-    passy_save_mrz_info(passy);
-
     passy_reader->secure_messaging = secure_messaging_alloc(
         (uint8_t*)passport_number, (uint8_t*)date_of_birth, (uint8_t*)date_of_expiry);
 

+ 2 - 1
scenes/passy_scene_doe_input.c

@@ -37,7 +37,8 @@ bool passy_scene_doe_input_on_event(void* context, SceneManagerEvent event) {
     if(event.type == SceneManagerEventTypeCustom) {
         if(event.event == PassyCustomEventTextInputDone) {
             strlcpy(passy->date_of_expiry, passy->text_store, strlen(passy->text_store) + 1);
-            scene_manager_next_scene(passy->scene_manager, PassySceneRead);
+            passy_save_mrz_info(passy);
+            scene_manager_next_scene(passy->scene_manager, PassySceneMainMenu);
             consumed = true;
         }
     }

+ 26 - 11
scenes/passy_scene_main_menu.c

@@ -3,8 +3,10 @@
 #define TAG "SceneMainMenu"
 
 enum SubmenuIndex {
-    SubmenuIndexRead,
+    SubmenuIndexEnterMRZInfo,
     SubmenuIndexDeleteMRZInfo,
+    SubmenuIndexReadDG1,
+    SubmenuIndexReadDG2,
 };
 
 void passy_scene_main_menu_submenu_callback(void* context, uint32_t index) {
@@ -17,8 +19,14 @@ void passy_scene_main_menu_on_enter(void* context) {
     Submenu* submenu = passy->submenu;
     submenu_reset(submenu);
 
+    passy_load_mrz_info(passy);
+
     submenu_add_item(
-        submenu, "Read", SubmenuIndexRead, passy_scene_main_menu_submenu_callback, passy);
+        submenu,
+        "Enter MRZ Info",
+        SubmenuIndexEnterMRZInfo,
+        passy_scene_main_menu_submenu_callback,
+        passy);
     if(strlen(passy->passport_number) > 0 && strlen(passy->date_of_birth) > 0 &&
        strlen(passy->date_of_expiry) > 0) {
         submenu_add_item(
@@ -27,6 +35,13 @@ void passy_scene_main_menu_on_enter(void* context) {
             SubmenuIndexDeleteMRZInfo,
             passy_scene_main_menu_submenu_callback,
             passy);
+
+        submenu_add_item(
+            submenu,
+            "Read DG1",
+            SubmenuIndexReadDG1,
+            passy_scene_main_menu_submenu_callback,
+            passy);
     }
 
     view_dispatcher_switch_to_view(passy->view_dispatcher, PassyViewMenu);
@@ -37,22 +52,22 @@ bool passy_scene_main_menu_on_event(void* context, SceneManagerEvent event) {
     bool consumed = false;
 
     if(event.type == SceneManagerEventTypeCustom) {
-        if(event.event == SubmenuIndexRead) {
+        if(event.event == SubmenuIndexEnterMRZInfo) {
             scene_manager_set_scene_state(
-                passy->scene_manager, PassySceneMainMenu, SubmenuIndexRead);
-
-            if(strlen(passy->passport_number) > 0 && strlen(passy->date_of_birth) > 0 &&
-               strlen(passy->date_of_expiry) > 0) {
-                scene_manager_next_scene(passy->scene_manager, PassySceneRead);
-            } else {
-                scene_manager_next_scene(passy->scene_manager, PassyScenePassportNumberInput);
-            }
+                passy->scene_manager, PassySceneMainMenu, SubmenuIndexEnterMRZInfo);
+            scene_manager_next_scene(passy->scene_manager, PassyScenePassportNumberInput);
             consumed = true;
         } else if(event.event == SubmenuIndexDeleteMRZInfo) {
             scene_manager_set_scene_state(
                 passy->scene_manager, PassySceneMainMenu, SubmenuIndexDeleteMRZInfo);
             scene_manager_next_scene(passy->scene_manager, PassySceneDelete);
             consumed = true;
+        } else if(event.event == SubmenuIndexReadDG1) {
+            passy->read_type = PassyReadDG1;
+            scene_manager_set_scene_state(
+                passy->scene_manager, PassySceneMainMenu, SubmenuIndexReadDG1);
+            scene_manager_next_scene(passy->scene_manager, PassySceneRead);
+            consumed = true;
         }
     }