From 49ab1f99d1fa86420a77106c89ddacdc5325dccc Mon Sep 17 00:00:00 2001 From: Chris van Marle Date: Fri, 21 Oct 2022 11:23:11 +0200 Subject: [PATCH] MRTD Support NFC-B documents --- .../main/nfc/scenes/nfc_scene_passport_read.c | 18 +++++++-- lib/nfc/nfc_worker.c | 40 +++++++++++++++++-- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/applications/main/nfc/scenes/nfc_scene_passport_read.c b/applications/main/nfc/scenes/nfc_scene_passport_read.c index a934b06f3..3f5ce66f8 100644 --- a/applications/main/nfc/scenes/nfc_scene_passport_read.c +++ b/applications/main/nfc/scenes/nfc_scene_passport_read.c @@ -21,8 +21,20 @@ void nfc_scene_passport_read_on_enter(void* context) { temp_str = furi_string_alloc(); furi_string_set(temp_str, "\e#Passport\n"); char iso_type = FURI_BIT(data->sak, 5) ? '4' : '3'; - //TODO: NFC-B? - furi_string_cat_printf(temp_str, "ISO 14443-%c (NFC-A)\n", iso_type); + + char nfc_type; + switch(data->type) { + case FuriHalNfcTypeA: + nfc_type = 'A'; + break; + case FuriHalNfcTypeB: + nfc_type = 'B'; + break; + default: + nfc_type = '?'; + break; + } + furi_string_cat_printf(temp_str, "ISO 14443-%c (NFC-%c)\n", iso_type, nfc_type); furi_string_cat_printf(temp_str, "UID:"); for(size_t i = 0; i < data->uid_len; i++) { furi_string_cat_printf(temp_str, " %02X", data->uid[i]); @@ -70,4 +82,4 @@ void nfc_scene_passport_read_on_exit(void* context) { // Clear view widget_reset(nfc->widget); -} +} \ No newline at end of file diff --git a/lib/nfc/nfc_worker.c b/lib/nfc/nfc_worker.c index ac71224e0..b6269ea7e 100644 --- a/lib/nfc/nfc_worker.c +++ b/lib/nfc/nfc_worker.c @@ -351,6 +351,33 @@ static bool nfc_worker_read_nfca(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* t return card_read; } +static bool nfc_worker_read_nfcb(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; + + bool card_read = false; + furi_hal_nfc_sleep(); + if(nfc_data->interface == FuriHalNfcInterfaceIsoDep) { + FURI_LOG_I(TAG, "ISO14443-4B card detected"); + //TODO: thoughts on improving logic/readability here? + do { + FURI_LOG_D(TAG, "Try reading MRTD"); + if(nfc_worker_read_mrtd(nfc_worker, tx_rx)) { + nfc_worker->dev_data->protocol = NfcDeviceProtocolMRTD; + break; + } + + FURI_LOG_I(TAG, "Unknown card. Save UID"); + nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; + } while(false); + card_read = true; + } else { + nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; + card_read = true; + } + + return card_read; +} + void nfc_worker_read(NfcWorker* nfc_worker) { furi_assert(nfc_worker); furi_assert(nfc_worker->callback); @@ -395,8 +422,15 @@ void nfc_worker_read(NfcWorker* nfc_worker) { } } } else if(nfc_data->type == FuriHalNfcTypeB) { - event = NfcWorkerEventReadUidNfcB; - break; + if(nfc_worker_read_nfcb(nfc_worker, &tx_rx)) { + if(dev_data->protocol == NfcDeviceProtocolMRTD) { + event = NfcWorkerEventReadPassport; + break; + } + } + + event = NfcWorkerEventReadUidNfcB; + break; } else if(nfc_data->type == FuriHalNfcTypeF) { event = NfcWorkerEventReadUidNfcF; break; @@ -816,4 +850,4 @@ void nfc_worker_analyze_reader(NfcWorker* nfc_worker) { reader_analyzer_stop(nfc_worker->reader_analyzer); nfca_signal_free(nfca_signal); -} +} \ No newline at end of file