ISO15693: further cleanup

This commit is contained in:
g3gg0.de
2022-12-30 02:16:44 +01:00
parent 1360cf1f0a
commit 5013692288
7 changed files with 62 additions and 47 deletions

View File

@@ -12,4 +12,6 @@ enum NfcCustomEvent {
NfcCustomEventDictAttackSkip, NfcCustomEventDictAttackSkip,
NfcCustomEventRpcLoad, NfcCustomEventRpcLoad,
NfcCustomEventRpcSessionClose, NfcCustomEventRpcSessionClose,
NfcCustomEventUpdateLog,
NfcCustomEventSaveShadow,
}; };

View File

@@ -1,6 +1,6 @@
#include "../nfc_i.h" #include "../nfc_i.h"
#define NFC_SCENE_EMULATE_NFCV_LOG_SIZE_MAX (100) #define NFC_SCENE_EMULATE_NFCV_LOG_SIZE_MAX (200)
enum { enum {
NfcSceneNfcVEmulateStateWidget, NfcSceneNfcVEmulateStateWidget,
@@ -11,7 +11,17 @@ bool nfc_scene_nfcv_emulate_worker_callback(NfcWorkerEvent event, void* context)
UNUSED(event); UNUSED(event);
furi_assert(context); furi_assert(context);
Nfc* nfc = context; Nfc* nfc = context;
view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventWorkerExit);
switch(event) {
case NfcWorkerEventNfcVCommandExecuted:
view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventUpdateLog);
break;
case NfcWorkerEventNfcVContentChanged:
view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventSaveShadow);
break;
default:
break;
}
return true; return true;
} }
@@ -29,7 +39,6 @@ void nfc_scene_nfcv_emulate_textbox_callback(void* context) {
view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventViewExit); view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventViewExit);
} }
// Add widget with device name or inform that data received
static void nfc_scene_nfcv_emulate_widget_config(Nfc* nfc, bool data_received) { static void nfc_scene_nfcv_emulate_widget_config(Nfc* nfc, bool data_received) {
FuriHalNfcDevData* data = &nfc->dev->dev_data.nfc_data; FuriHalNfcDevData* data = &nfc->dev->dev_data.nfc_data;
Widget* widget = nfc->widget; Widget* widget = nfc->widget;
@@ -91,7 +100,7 @@ bool nfc_scene_nfcv_emulate_on_event(void* context, SceneManagerEvent event) {
bool consumed = false; bool consumed = false;
if(event.type == SceneManagerEventTypeCustom) { if(event.type == SceneManagerEventTypeCustom) {
if(event.event == NfcCustomEventWorkerExit) { if(event.event == NfcCustomEventUpdateLog) {
// Add data button to widget if data is received for the first time // Add data button to widget if data is received for the first time
if(!furi_string_size(nfc->text_box_store)) { if(!furi_string_size(nfc->text_box_store)) {
nfc_scene_nfcv_emulate_widget_config(nfc, true); nfc_scene_nfcv_emulate_widget_config(nfc, true);
@@ -111,6 +120,11 @@ bool nfc_scene_nfcv_emulate_on_event(void* context, SceneManagerEvent event) {
strcpy(nfcv_data->last_command, ""); strcpy(nfcv_data->last_command, "");
} }
consumed = true; consumed = true;
} else if(event.event == NfcCustomEventSaveShadow) {
if(furi_string_size(nfc->dev->load_path)) {
nfc_device_save_shadow(nfc->dev, furi_string_get_cstr(nfc->dev->load_path));
}
consumed = true;
} else if(event.event == GuiButtonTypeCenter && state == NfcSceneNfcVEmulateStateWidget) { } else if(event.event == GuiButtonTypeCenter && state == NfcSceneNfcVEmulateStateWidget) {
view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextBox); view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextBox);
scene_manager_set_scene_state( scene_manager_set_scene_state(

View File

@@ -110,7 +110,7 @@ int32_t nfc_worker_task(void* context) {
} else if(nfc_worker->state == NfcWorkerStateAnalyzeReader) { } else if(nfc_worker->state == NfcWorkerStateAnalyzeReader) {
nfc_worker_analyze_reader(nfc_worker); nfc_worker_analyze_reader(nfc_worker);
} else if(nfc_worker->state == NfcWorkerStateNfcVEmulate) { } else if(nfc_worker->state == NfcWorkerStateNfcVEmulate) {
nfc_worker_emulate_nfcv(nfc_worker); nfc_worker_nfcv_emulate(nfc_worker);
} else if(nfc_worker->state == NfcWorkerStateNfcVUnlock) { } else if(nfc_worker->state == NfcWorkerStateNfcVUnlock) {
nfc_worker_nfcv_unlock(nfc_worker); nfc_worker_nfcv_unlock(nfc_worker);
} else if(nfc_worker->state == NfcWorkerStateNfcVUnlockAndSave) { } else if(nfc_worker->state == NfcWorkerStateNfcVUnlockAndSave) {
@@ -122,13 +122,15 @@ int32_t nfc_worker_task(void* context) {
return 0; return 0;
} }
static bool nfc_worker_read_nfcv_content(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { static bool nfc_worker_read_nfcv(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) {
bool read_success = false; bool read_success = false;
NfcVReader reader = {}; NfcVReader reader = {};
FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data;
NfcVData* nfcv_data = &nfc_worker->dev_data->nfcv_data; NfcVData* nfcv_data = &nfc_worker->dev_data->nfcv_data;
furi_hal_nfc_sleep();
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
reader_analyzer_prepare_tx_rx(nfc_worker->reader_analyzer, tx_rx, false); reader_analyzer_prepare_tx_rx(nfc_worker->reader_analyzer, tx_rx, false);
reader_analyzer_start(nfc_worker->reader_analyzer, ReaderAnalyzerModeDebugLog); reader_analyzer_start(nfc_worker->reader_analyzer, ReaderAnalyzerModeDebugLog);
@@ -148,6 +150,36 @@ static bool nfc_worker_read_nfcv_content(NfcWorker* nfc_worker, FuriHalNfcTxRxCo
return read_success; return read_success;
} }
void nfc_worker_nfcv_emulate(NfcWorker* nfc_worker) {
FuriHalNfcTxRxContext tx_rx = {};
FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data;
NfcVData* nfcv_data = &nfc_worker->dev_data->nfcv_data;
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
reader_analyzer_prepare_tx_rx(nfc_worker->reader_analyzer, &tx_rx, true);
reader_analyzer_start(nfc_worker->reader_analyzer, ReaderAnalyzerModeDebugLog);
}
nfcv_emu_init(nfc_data, nfcv_data);
while(nfc_worker->state == NfcWorkerStateNfcVEmulate) {
if(nfcv_emu_loop(&tx_rx, nfc_data, nfcv_data, 50)) {
if(nfc_worker->callback) {
nfc_worker->callback(NfcWorkerEventNfcVCommandExecuted, nfc_worker->context);
if(nfcv_data->modified) {
nfc_worker->callback(NfcWorkerEventNfcVContentChanged, nfc_worker->context);
nfcv_data->modified = false;
}
}
}
furi_delay_ms(0);
}
nfcv_emu_deinit(nfcv_data);
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
reader_analyzer_stop(nfc_worker->reader_analyzer);
}
}
void nfc_worker_nfcv_unlock(NfcWorker* nfc_worker) { void nfc_worker_nfcv_unlock(NfcWorker* nfc_worker) {
furi_assert(nfc_worker); furi_assert(nfc_worker);
furi_assert(nfc_worker->callback); furi_assert(nfc_worker->callback);
@@ -508,20 +540,6 @@ static bool nfc_worker_read_nfca(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* t
return card_read; return card_read;
} }
static bool nfc_worker_read_nfcv(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) {
furi_assert(nfc_worker);
furi_assert(tx_rx);
bool card_read = false;
furi_hal_nfc_sleep();
/* until here the UID field is reversed from the reader IC.
we will read it here again and it will get placed in the right order. */
card_read = nfc_worker_read_nfcv_content(nfc_worker, tx_rx);
return card_read;
}
void nfc_worker_read(NfcWorker* nfc_worker) { void nfc_worker_read(NfcWorker* nfc_worker) {
furi_assert(nfc_worker); furi_assert(nfc_worker);
furi_assert(nfc_worker->callback); furi_assert(nfc_worker->callback);
@@ -692,32 +710,6 @@ void nfc_worker_emulate_uid(NfcWorker* nfc_worker) {
} }
} }
void nfc_worker_emulate_nfcv(NfcWorker* nfc_worker) {
FuriHalNfcTxRxContext tx_rx = {};
FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data;
NfcVData* nfcv_data = &nfc_worker->dev_data->nfcv_data;
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
reader_analyzer_prepare_tx_rx(nfc_worker->reader_analyzer, &tx_rx, true);
reader_analyzer_start(nfc_worker->reader_analyzer, ReaderAnalyzerModeDebugLog);
}
nfcv_emu_init(nfc_data, nfcv_data);
while(nfc_worker->state == NfcWorkerStateNfcVEmulate) {
if(nfcv_emu_loop(&tx_rx, nfc_data, nfcv_data, 50)) {
if(nfc_worker->callback) {
nfc_worker->callback(NfcWorkerEventSuccess, nfc_worker->context);
}
}
furi_delay_ms(0);
}
nfcv_emu_deinit(nfcv_data);
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
reader_analyzer_stop(nfc_worker->reader_analyzer);
}
}
void nfc_worker_emulate_apdu(NfcWorker* nfc_worker) { void nfc_worker_emulate_apdu(NfcWorker* nfc_worker) {
FuriHalNfcTxRxContext tx_rx = {}; FuriHalNfcTxRxContext tx_rx = {};
FuriHalNfcDevData params = { FuriHalNfcDevData params = {

View File

@@ -75,6 +75,8 @@ typedef enum {
NfcWorkerEventMfUltralightPassKey, // NFC worker requesting manual key NfcWorkerEventMfUltralightPassKey, // NFC worker requesting manual key
NfcWorkerEventMfUltralightPwdAuth, // Reader sent auth command NfcWorkerEventMfUltralightPwdAuth, // Reader sent auth command
NfcWorkerEventNfcVPassKey, // NFC worker requesting manual key NfcWorkerEventNfcVPassKey, // NFC worker requesting manual key
NfcWorkerEventNfcVCommandExecuted,
NfcWorkerEventNfcVContentChanged,
} NfcWorkerEvent; } NfcWorkerEvent;
typedef bool (*NfcWorkerCallback)(NfcWorkerEvent event, void* context); typedef bool (*NfcWorkerCallback)(NfcWorkerEvent event, void* context);
@@ -94,4 +96,4 @@ void nfc_worker_start(
void nfc_worker_stop(NfcWorker* nfc_worker); void nfc_worker_stop(NfcWorker* nfc_worker);
void nfc_worker_nfcv_unlock(NfcWorker* nfc_worker); void nfc_worker_nfcv_unlock(NfcWorker* nfc_worker);
void nfc_worker_emulate_nfcv(NfcWorker* nfc_worker); void nfc_worker_nfcv_emulate(NfcWorker* nfc_worker);

View File

@@ -561,6 +561,7 @@ void nfcv_emu_handle_packet(
&nfcv_data->data[nfcv_data->block_size * block], &nfcv_data->data[nfcv_data->block_size * block],
&nfcv_data->frame[ctx->payload_offset + data_pos], &nfcv_data->frame[ctx->payload_offset + data_pos],
data_len); data_len);
nfcv_data->modified = true;
} }
nfcv_emu_send( nfcv_emu_send(
tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time);
@@ -719,7 +720,9 @@ bool nfcv_emu_loop(
pulse_reader_receive(nfcv_data->emu_air.reader_signal, timeout_ms * 1000); pulse_reader_receive(nfcv_data->emu_air.reader_signal, timeout_ms * 1000);
uint32_t timestamp = DWT->CYCCNT; uint32_t timestamp = DWT->CYCCNT;
/* when timed out, reset to SOF state */
if(periods == PULSE_READER_NO_EDGE) { if(periods == PULSE_READER_NO_EDGE) {
frame_state = NFCV_FRAME_STATE_SOF1;
break; break;
} }
if(periods == PULSE_READER_LOST_EDGE) { if(periods == PULSE_READER_LOST_EDGE) {

View File

@@ -161,6 +161,7 @@ typedef struct {
uint16_t block_num; uint16_t block_num;
uint8_t block_size; uint8_t block_size;
uint8_t data[NFCV_MAX_DUMP_SIZE]; uint8_t data[NFCV_MAX_DUMP_SIZE];
bool modified;
/* specfic variant infos */ /* specfic variant infos */
NfcVSubtype sub_type; NfcVSubtype sub_type;

View File

@@ -236,6 +236,7 @@ bool slix_generic_protocol_filter(
break; break;
case SLIX_PASS_PRIVACY: case SLIX_PASS_PRIVACY:
slix->privacy = false; slix->privacy = false;
nfcv_data->modified = true;
break; break;
case SLIX_PASS_DESTROY: case SLIX_PASS_DESTROY:
FURI_LOG_D(TAG, "Pooof! Got destroyed"); FURI_LOG_D(TAG, "Pooof! Got destroyed");