From b1f95c5c54d6b0af9735f318352b56f832b4f0fb Mon Sep 17 00:00:00 2001 From: Chris van Marle Date: Tue, 11 Oct 2022 22:13:17 +0200 Subject: [PATCH] MRTD add worker method for auhtenticated read --- lib/nfc/nfc_worker.c | 21 ++++++++++++++++++++- lib/nfc/nfc_worker.h | 1 + lib/nfc/nfc_worker_i.h | 2 ++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/nfc/nfc_worker.c b/lib/nfc/nfc_worker.c index 1c61a192c..f72767144 100644 --- a/lib/nfc/nfc_worker.c +++ b/lib/nfc/nfc_worker.c @@ -91,6 +91,8 @@ int32_t nfc_worker_task(void* context) { if(nfc_worker->state == NfcWorkerStateRead) { nfc_worker_read(nfc_worker); + } else if(nfc_worker->state == NfcWorkerStateReadMrtdAuth) { + nfc_worker_read_mrtd_auth(nfc_worker); } else if(nfc_worker->state == NfcWorkerStateUidEmulate) { nfc_worker_emulate_uid(nfc_worker); } else if(nfc_worker->state == NfcWorkerStateEmulateApdu) { @@ -283,9 +285,10 @@ static bool nfc_worker_read_mrtd(NfcWorker* nfc_worker, MrtdData* mrtd_data, Fur //mrtd_select(mrtd_app, EF.DIR); //mrtd_select_efcardaccess(mrtd_app); //mrtd_select_efdir(mrtd_app); - mrtd_test(mrtd_app, mrtd_data); if(!mrtd_select_app(mrtd_app, AID.eMRTDApplication)) break; + mrtd_test(mrtd_app, mrtd_data); + //TODO: read general informatie //TODO: after auth scene, do auth (BAC / PACE) @@ -316,6 +319,22 @@ static bool nfc_worker_read_mrtd(NfcWorker* nfc_worker, MrtdData* mrtd_data, Fur return read_success; } +bool nfc_worker_read_mrtd_auth(NfcWorker* nfc_worker) { + MrtdData* mrtd_data = &nfc_worker->dev_data->mrtd_data; + FuriHalNfcTxRxContext tx_rx = {}; + MrtdApplication* mrtd_app = mrtd_alloc_init(&tx_rx); + + do { + if(!furi_hal_nfc_detect(&nfc_worker->dev_data->nfc_data, 300)) break; + + if(!mrtd_select_app(mrtd_app, AID.eMRTDApplication)) break; + + if(!mrtd_bac(mrtd_app, &mrtd_data->auth)) break; + } while(false); + + return false; +} + static bool nfc_worker_read_nfca(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; diff --git a/lib/nfc/nfc_worker.h b/lib/nfc/nfc_worker.h index df0f53176..044e30875 100644 --- a/lib/nfc/nfc_worker.h +++ b/lib/nfc/nfc_worker.h @@ -11,6 +11,7 @@ typedef enum { NfcWorkerStateReady, // Main worker states NfcWorkerStateRead, + NfcWorkerStateReadMrtdAuth, NfcWorkerStateUidEmulate, NfcWorkerStateMfUltralightEmulate, NfcWorkerStateMfClassicEmulate, diff --git a/lib/nfc/nfc_worker_i.h b/lib/nfc/nfc_worker_i.h index b3f11d9eb..193fc04bb 100644 --- a/lib/nfc/nfc_worker_i.h +++ b/lib/nfc/nfc_worker_i.h @@ -36,6 +36,8 @@ int32_t nfc_worker_task(void* context); void nfc_worker_read(NfcWorker* nfc_worker); +bool nfc_worker_read_mrtd_auth(NfcWorker* nfc_worker); + void nfc_worker_emulate_uid(NfcWorker* nfc_worker); void nfc_worker_emulate_mf_ultralight(NfcWorker* nfc_worker);