Просмотр исходного кода

Fix calculation of file length

Eric Betts 9 месяцев назад
Родитель
Сommit
68c87dcbe2
4 измененных файлов с 19 добавлено и 7 удалено
  1. 1 1
      README.md
  2. 1 0
      passy_common.h
  3. 16 6
      passy_reader.c
  4. 1 0
      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:
 

+ 1 - 0
passy_common.h

@@ -6,6 +6,7 @@
 
 typedef enum {
     PassyReadNone = 0,
+    PassyReadCOM = 0x011E,
     PassyReadDG1 = 0x0101,
     PassyReadDG2 = 0x0102,
     PassyReadDG3 = 0x0103,

+ 16 - 6
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));
@@ -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,11 +406,10 @@ 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 == PassyReadDG2) {
             uint8_t header[100];
             ret = passy_reader_read_binary(passy_reader, 0x00, sizeof(header), header);
@@ -411,7 +421,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));
@@ -455,7 +465,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(

+ 1 - 0
scenes/passy_scene_main_menu.c

@@ -5,6 +5,7 @@
 enum SubmenuIndex {
     SubmenuIndexEnterMRZInfo,
     SubmenuIndexDeleteMRZInfo,
+    SubmenuIndexReadCOM,
     SubmenuIndexReadDG1,
     SubmenuIndexReadDG2,
     SubmenuIndexReadDG7,