Parcourir la source

Add Read DG7 File (Signature)

Esteban Fuentealba il y a 9 mois
Parent
commit
ff33b99d38
4 fichiers modifiés avec 82 ajouts et 1 suppressions
  1. 1 0
      passy_common.h
  2. 67 0
      passy_reader.c
  3. 13 0
      scenes/passy_scene_main_menu.c
  4. 1 1
      scenes/passy_scene_read_success.c

+ 1 - 0
passy_common.h

@@ -8,6 +8,7 @@ typedef enum {
     PassyReadNone = 0,
     PassyReadDG1,
     PassyReadDG2,
+    PassyReadDG7,
 } PassyReadType;
 
 void passy_log_bitbuffer(char* tag, char* prefix, BitBuffer* buffer);

+ 67 - 0
passy_reader.c

@@ -399,7 +399,74 @@ NfcCommand passy_reader_state_machine(Passy* passy, PassyReader* passy_reader) {
                 body_offset += sizeof(chunk);
             } while(body_offset < body_size);
             passy_log_bitbuffer(TAG, "DG1", passy_reader->DG1);
+        } else if(passy->read_type == PassyReadDG7) {
+            ret = passy_reader_select_file(passy_reader, 0x0107);
+            if(ret != NfcCommandContinue) {
+                view_dispatcher_send_custom_event(
+                    passy->view_dispatcher, PassyCustomEventReaderError);
+                break;
+            }
+
+            uint8_t header[100];
+            ret = passy_reader_read_binary(passy_reader, 0x00, sizeof(header), header);
+            if(ret != NfcCommandContinue) {
+                view_dispatcher_send_custom_event(
+                    passy->view_dispatcher, PassyCustomEventReaderError);
+                break;
+            }
+            view_dispatcher_send_custom_event(
+                passy->view_dispatcher, PassyCustomEventReaderReading);
+
+            size_t body_size = asn1_length(header + 1);
+            FURI_LOG_I(TAG, "DG7 length: %d", body_size);
+
+            void* jpeg2k = memmem(header, sizeof(header), jpeg2k_header, sizeof(jpeg2k_header));
+            void* jpeg2k_cs =
+                memmem(header, sizeof(header), jpeg2k_cs_header, sizeof(jpeg2k_cs_header));
+
+            FuriString* path = furi_string_alloc();
+            uint8_t start = 0;
+
+            if(jpeg2k) {
+                furi_string_printf(path, "%s/%s%s", STORAGE_APP_DATA_PATH_PREFIX, "DG7", ".jp2");
+                start = (uint8_t*)jpeg2k - header;
+            } else if(jpeg2k_cs) {
+                furi_string_printf(path, "%s/%s%s", STORAGE_APP_DATA_PATH_PREFIX, "DG7", ".jpc");
+                start = (uint8_t*)jpeg2k_cs - header;
+            } else {
+                furi_string_printf(path, "%s/%s%s", STORAGE_APP_DATA_PATH_PREFIX, "DG7", ".bin");
+                start = 0;
+                passy_log_buffer(TAG, "header", header, sizeof(header));
+            }
+            FURI_LOG_I(TAG, "Writing offset %d to %s", start, furi_string_get_cstr(path));
+
+            Storage* storage = furi_record_open(RECORD_STORAGE);
+            Stream* stream = file_stream_alloc(storage);
+            file_stream_open(stream, furi_string_get_cstr(path), FSAM_WRITE, FSOM_OPEN_ALWAYS);
+
+            uint8_t chunk[PASSY_READER_DG2_CHUNK_SIZE];
+            passy->offset = start;
+            passy->bytes_total = body_size;
+            do {
+                memset(chunk, 0, sizeof(chunk));
+                uint8_t Le = MIN(sizeof(chunk), (size_t)(body_size - passy->offset));
+
+                ret = passy_reader_read_binary(passy_reader, passy->offset, Le, chunk);
+                if(ret != NfcCommandContinue) {
+                    view_dispatcher_send_custom_event(
+                        passy->view_dispatcher, PassyCustomEventReaderError);
+                    break;
+                }
+                passy->offset += sizeof(chunk);
+                // passy_log_buffer(TAG, "chunk", chunk, sizeof(chunk));
+                stream_write(stream, chunk, Le);
+                view_dispatcher_send_custom_event(
+                    passy->view_dispatcher, PassyCustomEventReaderReading);
+            } while(passy->offset < body_size);
 
+            file_stream_close(stream);
+            furi_record_close(RECORD_STORAGE);
+            furi_string_free(path);
         } else if(passy->read_type == PassyReadDG2) {
             ret = passy_reader_select_file(passy_reader, 0x0102);
             if(ret != NfcCommandContinue) {

+ 13 - 0
scenes/passy_scene_main_menu.c

@@ -7,6 +7,7 @@ enum SubmenuIndex {
     SubmenuIndexDeleteMRZInfo,
     SubmenuIndexReadDG1,
     SubmenuIndexReadDG2,
+    SubmenuIndexReadDG7,
 };
 
 void passy_scene_main_menu_submenu_callback(void* context, uint32_t index) {
@@ -48,6 +49,12 @@ void passy_scene_main_menu_on_enter(void* context) {
             SubmenuIndexReadDG2,
             passy_scene_main_menu_submenu_callback,
             passy);
+        submenu_add_item(
+            submenu,
+            "Read DG7",
+            SubmenuIndexReadDG7,
+            passy_scene_main_menu_submenu_callback,
+            passy);
     }
 
     view_dispatcher_switch_to_view(passy->view_dispatcher, PassyViewMenu);
@@ -80,6 +87,12 @@ bool passy_scene_main_menu_on_event(void* context, SceneManagerEvent event) {
                 passy->scene_manager, PassySceneMainMenu, SubmenuIndexReadDG2);
             scene_manager_next_scene(passy->scene_manager, PassySceneRead);
             consumed = true;
+        } else if(event.event == SubmenuIndexReadDG7) {
+            passy->read_type = PassyReadDG7;
+            scene_manager_set_scene_state(
+                passy->scene_manager, PassySceneMainMenu, SubmenuIndexReadDG7);
+            scene_manager_next_scene(passy->scene_manager, PassySceneRead);
+            consumed = true;
         }
     }
 

+ 1 - 1
scenes/passy_scene_read_success.c

@@ -122,7 +122,7 @@ void passy_scene_read_success_on_enter(void* context) {
         free(dg1);
         dg1 = 0;
 
-    } else if(passy->read_type == PassyReadDG2) {
+    } else if(passy->read_type == PassyReadDG2 || passy->read_type == PassyReadDG7) {
         furi_string_cat_printf(str, "Saved to disk in apps_data/passy/\n");
     }
     text_box_set_font(passy->text_box, TextBoxFontText);