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

look up to 120 bytes for image header in DG2

Eric Betts 8 месяцев назад
Родитель
Сommit
75100c7fc3
1 измененных файлов с 15 добавлено и 4 удалено
  1. 15 4
      passy_reader.c

+ 15 - 4
passy_reader.c

@@ -1,11 +1,13 @@
 #include "passy_reader.h"
 
+#define ASN_EMIT_DEBUG 0
+#include <lib/asn1/COM.h>
+
 #define TAG                         "PassyReader"
 #define PASSY_READER_DG1_CHUNK_SIZE 0x20
 #define PASSY_READER_DG2_CHUNK_SIZE 0x20
 
-#define ASN_EMIT_DEBUG 0
-#include <lib/asn1/COM.h>
+#define PASSY_DG2_LOOKAHEAD 120
 
 static uint8_t passport_aid[] = {0xA0, 0x00, 0x00, 0x02, 0x47, 0x10, 0x01};
 static uint8_t select_header[] = {0x00, 0xA4, 0x04, 0x0C};
@@ -393,13 +395,22 @@ NfcCommand passy_reader_state_machine(PassyReader* passy_reader) {
             } while(body_offset < body_size);
             passy_log_bitbuffer(TAG, "DG1", passy_reader->DG1);
         } else if(passy->read_type == PassyReadDG2 || passy->read_type == PassyReadDG7) {
-            uint8_t header[100];
-            ret = passy_reader_read_binary(passy_reader, 0x00, sizeof(header), header);
+            uint8_t header[PASSY_DG2_LOOKAHEAD];
+            ret = passy_reader_read_binary(passy_reader, 0x00, sizeof(header) / 2, header);
             if(ret != NfcCommandContinue) {
                 view_dispatcher_send_custom_event(
                     passy->view_dispatcher, PassyCustomEventReaderError);
                 break;
             }
+            // Issue with reading whole 120 bytes at once, so we read 60 bytes and then
+            ret = passy_reader_read_binary(
+                passy_reader, sizeof(header) / 2, sizeof(header) / 2, header + sizeof(header) / 2);
+            if(ret != NfcCommandContinue) {
+                view_dispatcher_send_custom_event(
+                    passy->view_dispatcher, PassyCustomEventReaderError);
+                break;
+            }
+
             view_dispatcher_send_custom_event(
                 passy->view_dispatcher, PassyCustomEventReaderReading);