Browse Source

code to read DG2

Eric Betts 9 months ago
parent
commit
ebc7adba34
2 changed files with 32 additions and 3 deletions
  1. 26 3
      passy_reader.c
  2. 6 0
      scenes/passy_scene_main_menu.c

+ 26 - 3
passy_reader.c

@@ -1,6 +1,8 @@
 #include "passy_reader.h"
 #include "passy_reader.h"
 
 
-#define TAG "PassyReader"
+#define TAG                         "PassyReader"
+#define PASSY_READER_DG1_CHUNK_SIZE 0x20
+#define PASSY_READER_DG2_CHUNK_SIZE 0x20
 
 
 static uint8_t passport_aid[] = {0xA0, 0x00, 0x00, 0x02, 0x47, 0x10, 0x01};
 static uint8_t passport_aid[] = {0xA0, 0x00, 0x00, 0x02, 0x47, 0x10, 0x01};
 static uint8_t select_header[] = {0x00, 0xA4, 0x04, 0x0C};
 static uint8_t select_header[] = {0x00, 0xA4, 0x04, 0x0C};
@@ -377,12 +379,12 @@ NfcCommand passy_reader_state_machine(Passy* passy, PassyReader* passy_reader) {
                 break;
                 break;
             }
             }
             size_t body_size = asn1_length(header + 1);
             size_t body_size = asn1_length(header + 1);
-            uint8_t body_offset = 0x04;
+            uint8_t body_offset = sizeof(header);
             bit_buffer_append_bytes(passy_reader->DG1, header, sizeof(header));
             bit_buffer_append_bytes(passy_reader->DG1, header, sizeof(header));
             do {
             do {
                 view_dispatcher_send_custom_event(
                 view_dispatcher_send_custom_event(
                     passy->view_dispatcher, PassyCustomEventReaderReading);
                     passy->view_dispatcher, PassyCustomEventReaderReading);
-                uint8_t chunk[0x20];
+                uint8_t chunk[PASSY_READER_DG1_CHUNK_SIZE];
                 uint8_t Le = MIN(sizeof(chunk), (size_t)(body_size - body_offset));
                 uint8_t Le = MIN(sizeof(chunk), (size_t)(body_size - body_offset));
 
 
                 ret = passy_reader_read_binary(passy_reader, body_offset, Le, chunk);
                 ret = passy_reader_read_binary(passy_reader, body_offset, Le, chunk);
@@ -412,6 +414,27 @@ NfcCommand passy_reader_state_machine(Passy* passy, PassyReader* passy_reader) {
             }
             }
             size_t body_size = asn1_length(header + 1);
             size_t body_size = asn1_length(header + 1);
             FURI_LOG_I(TAG, "DG2 length: %d", body_size);
             FURI_LOG_I(TAG, "DG2 length: %d", body_size);
+
+            uint8_t chunk[PASSY_READER_DG2_CHUNK_SIZE];
+            size_t body_offset = sizeof(header);
+            size_t chunk_count = (body_size + sizeof(chunk) - 1) / sizeof(chunk);
+            size_t i = 0;
+            do {
+                memset(chunk, 0, sizeof(chunk));
+                view_dispatcher_send_custom_event(
+                    passy->view_dispatcher, PassyCustomEventReaderReading);
+                uint8_t Le = MIN(sizeof(chunk), (size_t)(body_size - body_offset));
+
+                ret = passy_reader_read_binary(passy_reader, body_offset, Le, chunk);
+                if(ret != NfcCommandContinue) {
+                    view_dispatcher_send_custom_event(
+                        passy->view_dispatcher, PassyCustomEventReaderError);
+                    break;
+                }
+                body_offset += sizeof(chunk);
+                FURI_LOG_I(TAG, "chunk %02x/%02x offset %d", ++i, chunk_count, body_offset);
+                passy_log_buffer(TAG, "chunk", chunk, sizeof(chunk));
+            } while(body_offset < body_size);
         }
         }
 
 
         // Everything done
         // Everything done

+ 6 - 0
scenes/passy_scene_main_menu.c

@@ -68,6 +68,12 @@ bool passy_scene_main_menu_on_event(void* context, SceneManagerEvent event) {
                 passy->scene_manager, PassySceneMainMenu, SubmenuIndexReadDG1);
                 passy->scene_manager, PassySceneMainMenu, SubmenuIndexReadDG1);
             scene_manager_next_scene(passy->scene_manager, PassySceneRead);
             scene_manager_next_scene(passy->scene_manager, PassySceneRead);
             consumed = true;
             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;
         }
         }
     }
     }