@@ -154,7 +154,8 @@ NfcCommand passy_reader_send(PassyReader* passy_reader) {
154154 }
155155
156156 if (use_secure_messaging ) {
157- passy_secure_messaging_unwrap_rapdu (passy_reader -> secure_messaging , passy_reader -> rx_buffer );
157+ passy_secure_messaging_unwrap_rapdu (
158+ passy_reader -> secure_messaging , passy_reader -> rx_buffer );
158159 }
159160
160161 return ret ;
@@ -474,6 +475,59 @@ NfcCommand passy_reader_read_dg2_or_dg7(PassyReader* passy_reader) {
474475 return ret ;
475476}
476477
478+ NfcCommand passy_reader_read_dg_generic (PassyReader * passy_reader ) {
479+ NfcCommand ret = NfcCommandContinue ;
480+ Passy * passy = passy_reader -> passy ;
481+
482+ uint8_t header [4 ];
483+ ret = passy_reader_read_binary (passy_reader , 0x00 , sizeof (header ), header );
484+ if (ret != NfcCommandContinue ) {
485+ view_dispatcher_send_custom_event (passy -> view_dispatcher , PassyCustomEventReaderError );
486+ return ret ;
487+ }
488+
489+ view_dispatcher_send_custom_event (passy -> view_dispatcher , PassyCustomEventReaderReading );
490+
491+ size_t body_size = 1 + passy_asn1_length_length (header + 1 ) + passy_asn1_length (header + 1 );
492+ int dg_number = passy -> read_type & 0xFF ;
493+ FURI_LOG_I (TAG , "DG%d length: %d" , dg_number , body_size );
494+
495+ FuriString * path = furi_string_alloc ();
496+ furi_string_printf (
497+ path , "%s/%s-DG%d.bin" , STORAGE_APP_DATA_PATH_PREFIX , passy -> passport_number , dg_number );
498+ passy_furi_string_filename_safe (path );
499+ FURI_LOG_I (TAG , "Writing to %s" , furi_string_get_cstr (path ));
500+
501+ Storage * storage = furi_record_open (RECORD_STORAGE );
502+ Stream * stream = file_stream_alloc (storage );
503+ file_stream_open (stream , furi_string_get_cstr (path ), FSAM_WRITE , FSOM_OPEN_ALWAYS );
504+
505+ stream_write (stream , header , sizeof (header ));
506+
507+ uint8_t chunk [PASSY_READER_DG1_CHUNK_SIZE ];
508+ passy -> offset = sizeof (header );
509+ passy -> bytes_total = body_size ;
510+ do {
511+ memset (chunk , 0 , sizeof (chunk ));
512+ uint8_t Le = MIN (sizeof (chunk ), (size_t )(body_size - passy -> offset ));
513+
514+ ret = passy_reader_read_binary (passy_reader , passy -> offset , Le , chunk );
515+ if (ret != NfcCommandContinue ) {
516+ view_dispatcher_send_custom_event (passy -> view_dispatcher , PassyCustomEventReaderError );
517+ break ;
518+ }
519+ passy -> offset += Le ;
520+ stream_write (stream , chunk , Le );
521+ view_dispatcher_send_custom_event (passy -> view_dispatcher , PassyCustomEventReaderReading );
522+ } while (passy -> offset < body_size );
523+
524+ file_stream_close (stream );
525+ furi_record_close (RECORD_STORAGE );
526+ furi_string_free (path );
527+
528+ return ret ;
529+ }
530+
477531NfcCommand passy_reader_state_machine (PassyReader * passy_reader ) {
478532 furi_assert (passy_reader );
479533 Passy * passy = passy_reader -> passy ;
@@ -522,17 +576,9 @@ NfcCommand passy_reader_state_machine(PassyReader* passy_reader) {
522576 ret = passy_reader_read_dg2_or_dg7 (passy_reader );
523577 print_logs = true;
524578 } else {
525- // Until file specific handling is implemented, we just read the header
526- bit_buffer_reset (passy_reader -> dg_header );
527- uint8_t header [4 ];
528- ret = passy_reader_read_binary (passy_reader , 0x00 , sizeof (header ), header );
529- if (ret != NfcCommandContinue ) {
530- view_dispatcher_send_custom_event (
531- passy -> view_dispatcher , PassyCustomEventReaderError );
532-
533- break ;
534- }
535- bit_buffer_append_bytes (passy_reader -> dg_header , header , sizeof (header ));
579+ print_logs = false;
580+ ret = passy_reader_read_dg_generic (passy_reader );
581+ print_logs = true;
536582 }
537583
538584 // Everything done
0 commit comments