Przeglądaj źródła

Merge remote-tracking branch 'upstream/main'

Esteban Fuentealba 9 miesięcy temu
rodzic
commit
0204f82f46
4 zmienionych plików z 40 dodań i 25 usunięć
  1. 1 1
      README.md
  2. 16 3
      passy_common.h
  3. 17 13
      passy_reader.c
  4. 6 8
      scenes/passy_scene_main_menu.c

+ 1 - 1
README.md

@@ -14,7 +14,7 @@
 
 ## To do
  - Support other country passports
- - Support DG2, the photo
+ - Add event for file not found when selecting file, and UI
 
 ## Generate asn:
 

+ 16 - 3
passy_common.h

@@ -6,9 +6,22 @@
 
 typedef enum {
     PassyReadNone = 0,
-    PassyReadDG1,
-    PassyReadDG2,
-    PassyReadDG7,
+    PassyReadCOM = 0x011E,
+    PassyReadDG1 = 0x0101,
+    PassyReadDG2 = 0x0102,
+    PassyReadDG3 = 0x0103,
+    PassyReadDG4 = 0x0104,
+    PassyReadDG5 = 0x0105,
+    PassyReadDG6 = 0x0106,
+    PassyReadDG7 = 0x0107,
+    PassyReadDG8 = 0x0108,
+    PassyReadDG9 = 0x0109,
+    PassyReadDG10 = 0x010A,
+    PassyReadDG11 = 0x010B,
+    PassyReadDG12 = 0x010C,
+    PassyReadDG13 = 0x010D,
+    PassyReadDG14 = 0x010E,
+    PassyReadDG15 = 0x010F,
 } PassyReadType;
 
 void passy_log_bitbuffer(char* tag, char* prefix, BitBuffer* buffer);

+ 17 - 13
passy_reader.c

@@ -26,6 +26,17 @@ size_t asn1_length(uint8_t data[3]) {
     return 0;
 }
 
+size_t asn1_length_length(uint8_t data[3]) {
+    if(data[0] <= 0x7F) {
+        return 1;
+    } else if(data[0] == 0x81) {
+        return 2;
+    } else if(data[0] == 0x82) {
+        return 3;
+    }
+    return 0;
+}
+
 PassyReader* passy_reader_alloc(Passy* passy, Iso14443_4bPoller* iso14443_4b_poller) {
     PassyReader* passy_reader = malloc(sizeof(PassyReader));
     memset(passy_reader, 0, sizeof(PassyReader));
@@ -364,7 +375,7 @@ NfcCommand passy_reader_state_machine(Passy* passy, PassyReader* passy_reader) {
         view_dispatcher_send_custom_event(
             passy->view_dispatcher, PassyCustomEventReaderAuthenticated);
 
-        ret = passy_reader_select_file(passy_reader, 0x0101);
+        ret = passy_reader_select_file(passy_reader, passy->read_type);
         if(ret != NfcCommandContinue) {
             view_dispatcher_send_custom_event(passy->view_dispatcher, PassyCustomEventReaderError);
             break;
@@ -380,7 +391,7 @@ NfcCommand passy_reader_state_machine(Passy* passy, PassyReader* passy_reader) {
 
                 break;
             }
-            size_t body_size = asn1_length(header + 1);
+            size_t body_size = 1 + asn1_length_length(header + 1) + asn1_length(header + 1);
             uint8_t body_offset = sizeof(header);
             bit_buffer_append_bytes(passy_reader->DG1, header, sizeof(header));
             do {
@@ -395,8 +406,8 @@ NfcCommand passy_reader_state_machine(Passy* passy, PassyReader* passy_reader) {
                         passy->view_dispatcher, PassyCustomEventReaderError);
                     break;
                 }
-                bit_buffer_append_bytes(passy_reader->DG1, chunk, sizeof(chunk));
-                body_offset += sizeof(chunk);
+                bit_buffer_append_bytes(passy_reader->DG1, chunk, Le);
+                body_offset += Le;
             } while(body_offset < body_size);
             passy_log_bitbuffer(TAG, "DG1", passy_reader->DG1);
         } else if(passy->read_type == PassyReadDG7) {
@@ -475,13 +486,6 @@ NfcCommand passy_reader_state_machine(Passy* passy, PassyReader* passy_reader) {
             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) {
-                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) {
@@ -492,7 +496,7 @@ NfcCommand passy_reader_state_machine(Passy* passy, PassyReader* passy_reader) {
             view_dispatcher_send_custom_event(
                 passy->view_dispatcher, PassyCustomEventReaderReading);
 
-            size_t body_size = asn1_length(header + 1);
+            size_t body_size = 1 + asn1_length_length(header + 1) + asn1_length(header + 1);
             FURI_LOG_I(TAG, "DG2 length: %d", body_size);
 
             void* jpeg = memmem(header, sizeof(header), jpeg_header, sizeof(jpeg_header));
@@ -536,7 +540,7 @@ NfcCommand passy_reader_state_machine(Passy* passy, PassyReader* passy_reader) {
                         passy->view_dispatcher, PassyCustomEventReaderError);
                     break;
                 }
-                passy->offset += sizeof(chunk);
+                passy->offset += Le;
                 // passy_log_buffer(TAG, "chunk", chunk, sizeof(chunk));
                 stream_write(stream, chunk, Le);
                 view_dispatcher_send_custom_event(

+ 6 - 8
scenes/passy_scene_main_menu.c

@@ -5,6 +5,7 @@
 enum SubmenuIndex {
     SubmenuIndexEnterMRZInfo,
     SubmenuIndexDeleteMRZInfo,
+    SubmenuIndexReadCOM,
     SubmenuIndexReadDG1,
     SubmenuIndexReadDG2,
     SubmenuIndexReadDG7,
@@ -65,26 +66,23 @@ bool passy_scene_main_menu_on_event(void* context, SceneManagerEvent event) {
     bool consumed = false;
 
     if(event.type == SceneManagerEventTypeCustom) {
+        scene_manager_set_scene_state(passy->scene_manager, PassySceneMainMenu, event.event);
         if(event.event == SubmenuIndexEnterMRZInfo) {
-            scene_manager_set_scene_state(
-                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;
         } else if(event.event == SubmenuIndexReadDG2) {
             passy->read_type = PassyReadDG2;
-            scene_manager_set_scene_state(
-                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_next_scene(passy->scene_manager, PassySceneRead);
             consumed = true;
         } else if(event.event == SubmenuIndexReadDG7) {