From 2a837eca2f4b1f3bed6ba965b2b18f2e73cd43e1 Mon Sep 17 00:00:00 2001 From: Eric Betts Date: Sun, 29 Oct 2023 17:59:11 -0700 Subject: [PATCH] respond to seos --- scenes/seader_scene_read_14a.c | 14 +++++------ seader_i.h | 4 ++-- seader_worker.c | 43 ++++++++++++++++++++++++++++++++++ seader_worker.h | 4 ++++ 4 files changed, 56 insertions(+), 9 deletions(-) diff --git a/scenes/seader_scene_read_14a.c b/scenes/seader_scene_read_14a.c index 2bdb5a4..076dc08 100644 --- a/scenes/seader_scene_read_14a.c +++ b/scenes/seader_scene_read_14a.c @@ -20,6 +20,7 @@ void seader_scene_read_14a_on_enter(void* context) { view_dispatcher_switch_to_view(seader->view_dispatcher, SeaderViewPopup); seader->poller = nfc_poller_alloc(seader->nfc, NfcProtocolIso14443_4a); + nfc_poller_start(seader->poller, seader_worker_poller_callback_iso14443_4a, seader); seader_blink_start(seader); } @@ -30,18 +31,12 @@ bool seader_scene_read_14a_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == SeaderCustomEventWorkerExit) { - nfc_poller_stop(seader->poller); - nfc_poller_free(seader->poller); seader->credential->type = SeaderCredentialType14A; scene_manager_next_scene(seader->scene_manager, SeaderSceneReadCardSuccess); consumed = true; } } else if(event.type == SceneManagerEventTypeBack) { - nfc_poller_stop(seader->poller); - nfc_poller_free(seader->poller); - static const uint32_t possible_scenes[] = {SeaderSceneStart}; - scene_manager_search_and_switch_to_previous_scene_one_of( - seader->scene_manager, possible_scenes, COUNT_OF(possible_scenes)); + scene_manager_search_and_switch_to_previous_scene(seader->scene_manager, SeaderSceneStart); consumed = true; } @@ -51,6 +46,11 @@ bool seader_scene_read_14a_on_event(void* context, SceneManagerEvent event) { void seader_scene_read_14a_on_exit(void* context) { Seader* seader = context; + if (seader->poller) { + nfc_poller_stop(seader->poller); + nfc_poller_free(seader->poller); + } + // Clear view popup_reset(seader->popup); diff --git a/seader_i.h b/seader_i.h index b2b7e1c..53bb761 100644 --- a/seader_i.h +++ b/seader_i.h @@ -24,8 +24,6 @@ #include #include -#include -#include #include #include @@ -67,6 +65,8 @@ enum SeaderCustomEvent { SeaderCustomEventWorkerExit, SeaderCustomEventByteInputDone, SeaderCustomEventTextInputDone, + + SeaderCustomEventPollerSuccess, }; typedef enum { diff --git a/seader_worker.c b/seader_worker.c index 64a0ea8..21c3cc7 100644 --- a/seader_worker.c +++ b/seader_worker.c @@ -649,3 +649,46 @@ int32_t seader_worker_task(void* context) { return 0; } + +NfcCommand seader_worker_poller_callback_iso14443_4a(NfcGenericEvent event, void* context) { + furi_assert(event.protocol == NfcProtocolIso14443_4a); + + Seader* seader = context; + SeaderUartBridge* seader_uart = seader->uart; + const Iso14443_4aPollerEvent* iso14443_4a_event = event.event_data; + + if(iso14443_4a_event->type == Iso14443_4aPollerEventTypeReady) { + nfc_device_set_data(seader->nfc_device, NfcProtocolIso14443_4a, nfc_poller_get_data(seader->poller)); + FURI_LOG_D(TAG, "poller 14a ready"); + + size_t uid_len; + const uint8_t* uid = nfc_device_get_uid(seader->nfc_device, &uid_len); + + // const Iso14443_4aData* iso14443_4a_data = nfc_device_get_data(seader->nfc_device, NfcProtocolIso14443_4a); + //const Iso14443_3aData* iso14443_3a_data = iso14443_4a_data->iso14443_3a_data; + const Iso14443_3aData* iso14443_3a_data = nfc_device_get_data(seader->nfc_device, NfcProtocolIso14443_3a); + uint8_t sak_val = iso14443_3a_get_sak(iso14443_3a_data); + + CardDetails_t* cardDetails = 0; + cardDetails = calloc(1, sizeof *cardDetails); + assert(cardDetails); + + OCTET_STRING_fromBuf(&cardDetails->csn, (const char*)uid, uid_len); + uint8_t protocolBytes[] = {0x00, FrameProtocol_nfc}; + OCTET_STRING_fromBuf(&cardDetails->protocol, (const char*)protocolBytes, sizeof(protocolBytes)); + + OCTET_STRING_t sak = {.buf = &sak_val, .size = 1}; + cardDetails->sak = &sak; + + OCTET_STRING_t atqa = {.buf = (uint8_t*)iso14443_3a_data->atqa, .size = 2}; + cardDetails->atqa = &atqa; + + seader_send_card_detected(seader_uart, cardDetails); + + ASN_STRUCT_FREE(asn_DEF_CardDetails, cardDetails); + + return NfcCommandStop; + } + + return NfcCommandContinue; +} diff --git a/seader_worker.h b/seader_worker.h index a4c371c..73197e1 100644 --- a/seader_worker.h +++ b/seader_worker.h @@ -1,5 +1,6 @@ #pragma once +#include #include "seader_credential.h" #include "seader_bridge.h" @@ -52,3 +53,6 @@ void seader_worker_start( void seader_worker_stop(SeaderWorker* seader_worker); void seader_worker_process_sam_message(SeaderWorker* seader_worker, CCID_Message* message); void seader_worker_send_version(SeaderWorker* seader_worker); + + +NfcCommand seader_worker_poller_callback_iso14443_4a(NfcGenericEvent event, void* context);