Skip to content

Commit 5f02cc8

Browse files
committed
upd passy
1 parent 2386f67 commit 5f02cc8

6 files changed

Lines changed: 74 additions & 28 deletions

File tree

non_catalog_apps/passy/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
🇨🇷
4545
🇹🇷
4646
🇲🇽
47+
🇷🇸
4748

4849
*If it works for yours, submit a PR to add your country flag!*
4950

non_catalog_apps/passy/application.fam

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ App(
88
stack_size=2 * 1024,
99
fap_category="NFC",
1010
# Optional values
11-
fap_version="1.4",
11+
fap_version="1.5",
1212
fap_icon="passy.png", # 10x10 1-bit PNG
1313
fap_description="eMRTD Reader",
1414
fap_author="bettse",

non_catalog_apps/passy/passy_reader.c

Lines changed: 58 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
477531
NfcCommand 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

non_catalog_apps/passy/scenes/passy_scene_advanced_menu.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ void passy_scene_advanced_menu_on_enter(void* context) {
7777

7878
char payloadDebug[384] = {0};
7979
memset(payloadDebug, 0, sizeof(payloadDebug));
80-
(&asn_DEF_COM)->op->print_struct(&asn_DEF_COM, com, 1, passy_print_struct_callback, payloadDebug);
80+
(&asn_DEF_COM)
81+
->op->print_struct(&asn_DEF_COM, com, 1, passy_print_struct_callback, payloadDebug);
8182
if(strlen(payloadDebug) > 0) {
8283
FURI_LOG_D(TAG, "COM: %s", payloadDebug);
8384
} else {

non_catalog_apps/passy/scenes/passy_scene_read_success.c

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ void passy_scene_read_success_on_enter(void* context) {
3333
char payloadDebug[384] = {0};
3434
memset(payloadDebug, 0, sizeof(payloadDebug));
3535
(&asn_DEF_DG1)
36-
->op->print_struct(&asn_DEF_DG1, dg1, 1, passy_print_struct_callback, payloadDebug);
36+
->op->print_struct(
37+
&asn_DEF_DG1, dg1, 1, passy_print_struct_callback, payloadDebug);
3738
if(strlen(payloadDebug) > 0) {
3839
FURI_LOG_D(TAG, "DG1: %s", payloadDebug);
3940
} else {
@@ -125,19 +126,13 @@ void passy_scene_read_success_on_enter(void* context) {
125126
dg1 = 0;
126127

127128
} else if(passy->read_type == PassyReadDG2 || passy->read_type == PassyReadDG7) {
128-
furi_string_cat_printf(str, "Saved to disk in apps_data/passy/...\n");
129+
const char* dg_type = passy->read_type == PassyReadDG2 ? "DG2" : "DG7";
130+
furi_string_cat_printf(
131+
str, "Saved to apps_data/passy/%s-%s.*\n", passy->passport_number, dg_type);
129132
} else {
130-
char display[9]; // 4 byte header in hex + NULL
131-
memset(display, 0, sizeof(display));
132-
for(size_t i = 0; i < bit_buffer_get_size_bytes(passy->dg_header); i++) {
133-
snprintf(
134-
display + (i * 2),
135-
sizeof(display),
136-
"%02X",
137-
bit_buffer_get_data(passy->dg_header)[i]);
138-
}
139-
furi_string_cat_printf(str, "Unparsed file\n");
140-
furi_string_cat_printf(str, "File header: %s\n", display);
133+
int dg_number = passy->read_type & 0xFF;
134+
furi_string_cat_printf(
135+
str, "Saved to apps_data/passy/%s-DG%d.bin\n", passy->passport_number, dg_number);
141136
}
142137
text_box_set_font(passy->text_box, TextBoxFontText);
143138
text_box_set_text(passy->text_box, furi_string_get_cstr(passy->text_box_store));

non_catalog_apps/passy/secure_messaging.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ void passy_secure_messaging_adjust_parity(uint8_t key[16]) {
1717
}
1818
}
1919

20-
void passy_secure_messaging_key_diversification(uint8_t input[20], size_t input_len, uint8_t* output) {
20+
void passy_secure_messaging_key_diversification(
21+
uint8_t input[20],
22+
size_t input_len,
23+
uint8_t* output) {
2124
uint8_t sha[20];
2225
mbedtls_sha1_context ctx;
2326
mbedtls_sha1_init(&ctx);

0 commit comments

Comments
 (0)