diff --git a/lib/nfc/nfc_worker.c b/lib/nfc/nfc_worker.c index b6269ea7e..412d5229d 100644 --- a/lib/nfc/nfc_worker.c +++ b/lib/nfc/nfc_worker.c @@ -280,13 +280,17 @@ static bool nfc_worker_read_mrtd(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* t // Read passport if(!furi_hal_nfc_detect(&nfc_worker->dev_data->nfc_data, 300)) break; - //TODO: if(!mrtd_select_app(mrtd_app, AID.eMRTDApplication)) break; - - mrtd_test(mrtd_app, mrtd_data); // Some EFs are only available before Select App //TODO: try select eMRTDApp first, but when PACE, read CardAccess first! + if(!mrtd_select_app(mrtd_app, AID.eMRTDApplication)) break; // Passport app not selected - //TODO: read general informatie - //TODO: after auth scene, do auth (BAC / PACE) + // At least we're dealing with a passport. So return true. + read_success = true; + + if(!mrtd_authenticate(mrtd_app, mrtd_data)) break; // Authentication failed + //TODO: show auth failure screen + + mrtd_read_parse_file(mrtd_app, mrtd_data, EF.COM); + mrtd_read_parse_file(mrtd_app, mrtd_data, EF.DG1); read_success = true; } while(false); @@ -850,4 +854,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 +} diff --git a/lib/nfc/protocols/mrtd.c b/lib/nfc/protocols/mrtd.c index 2f10584ce..ce4fa9177 100644 --- a/lib/nfc/protocols/mrtd.c +++ b/lib/nfc/protocols/mrtd.c @@ -422,48 +422,6 @@ bool mrtd_read_parse_file(MrtdApplication* app, MrtdData* mrtd_data, EFFile file return result; } -//TODO: remove testing function -void mrtd_test(MrtdApplication* app, MrtdData* mrtd_data) { - FURI_LOG_D(TAG, "Mrtd Test"); - //mrtd_read_dump(app, EF.ATR); - //mrtd_read_dump(app, EF.COM); - //mrtd_read_dump(app, EF.DIR); - //mrtd_read_dump(app, EF.CardAccess); - //mrtd_read_dump(app, EF.CardSecurity); - - mrtd_select_app(app, AID.eMRTDApplication); - - MrtdAuthMethod method = mrtd_data->auth.method; - mrtd_data->auth_success = false; - FURI_LOG_D(TAG, "Auth method: %d", method); - switch(method) { - case MrtdAuthMethodAny: - //TODO: try PACE, then BAC - case MrtdAuthMethodBac: - mrtd_data->auth_success = mrtd_bac(app, &mrtd_data->auth); - break; - case MrtdAuthMethodPace: - FURI_LOG_E(TAG, "Auth method PACE not implemented"); - break; - case MrtdAuthMethodNone: - default: - break; - } - - if(!mrtd_data->auth_success) { - return; - } - - mrtd_read_parse_file(app, mrtd_data, EF.COM); - //mrtd_read_parse_file(app, mrtd_data, EF.DIR); - - mrtd_read_parse_file(app, mrtd_data, EF.DG1); - - //mrtd_read_dump(app, EF.DG2); - //mrtd_read_dump(app, EF.DG14); - //mrtd_read_dump(app, EF.DG15); -} - MrtdApplication* mrtd_alloc_init(FuriHalNfcTxRxContext* tx_rx) { MrtdApplication* app = malloc(sizeof(MrtdApplication)); @@ -570,3 +528,70 @@ bool mrtd_bac(MrtdApplication* app, MrtdAuthData* auth) { return true; } + +bool mrtd_authenticate(MrtdApplication* app, MrtdData* mrtd_data) { + MrtdAuthMethod method = mrtd_data->auth.method; + mrtd_data->auth_success = false; + FURI_LOG_D(TAG, "Auth method: %d", method); + switch(method) { + case MrtdAuthMethodAny: + //TODO: try PACE, then BAC. For now, fall through to just BAC + case MrtdAuthMethodBac: + mrtd_data->auth_success = mrtd_bac(app, &mrtd_data->auth); + break; + case MrtdAuthMethodPace: + FURI_LOG_E(TAG, "Auth method PACE not implemented"); + break; + case MrtdAuthMethodNone: + default: + break; + } + + if(!mrtd_data->auth_success) { + return false; + } + + return true; +} + +//TODO: remove testing function +void mrtd_test(MrtdApplication* app, MrtdData* mrtd_data) { + FURI_LOG_D(TAG, "Mrtd Test"); + //mrtd_read_dump(app, EF.ATR); + //mrtd_read_dump(app, EF.COM); + //mrtd_read_dump(app, EF.DIR); + //mrtd_read_dump(app, EF.CardAccess); + //mrtd_read_dump(app, EF.CardSecurity); + + mrtd_select_app(app, AID.eMRTDApplication); + + MrtdAuthMethod method = mrtd_data->auth.method; + mrtd_data->auth_success = false; + FURI_LOG_D(TAG, "Auth method: %d", method); + switch(method) { + case MrtdAuthMethodAny: + //TODO: try PACE, then BAC + case MrtdAuthMethodBac: + mrtd_data->auth_success = mrtd_bac(app, &mrtd_data->auth); + break; + case MrtdAuthMethodPace: + FURI_LOG_E(TAG, "Auth method PACE not implemented"); + break; + case MrtdAuthMethodNone: + default: + break; + } + + if(!mrtd_data->auth_success) { + return; + } + + mrtd_read_parse_file(app, mrtd_data, EF.COM); + //mrtd_read_parse_file(app, mrtd_data, EF.DIR); + + mrtd_read_parse_file(app, mrtd_data, EF.DG1); + + //mrtd_read_dump(app, EF.DG2); + //mrtd_read_dump(app, EF.DG14); + //mrtd_read_dump(app, EF.DG15); +} diff --git a/lib/nfc/protocols/mrtd.h b/lib/nfc/protocols/mrtd.h index c51f4f660..e4d032f88 100644 --- a/lib/nfc/protocols/mrtd.h +++ b/lib/nfc/protocols/mrtd.h @@ -27,7 +27,7 @@ typedef struct { //TODO: description MrtdApplication* mrtd_alloc_init(FuriHalNfcTxRxContext* tx_rx); +void mrtd_test(MrtdApplication* app, MrtdData* mrtd_data); //TODO: remove bool mrtd_select_app(MrtdApplication* app, AIDValue aid); -bool mrtd_select_file(MrtdApplication* app, EFFile file); -void mrtd_test(MrtdApplication* app, MrtdData* mrtd_data); -bool mrtd_bac(MrtdApplication* app, MrtdAuthData* auth); +bool mrtd_authenticate(MrtdApplication* app, MrtdData* mrtd_data); +bool mrtd_read_parse_file(MrtdApplication* app, MrtdData* mrtd_data, EFFile file);