diff options
author | Kevin Wallace <184975+kevinwallace@users.noreply.github.com> | 2022-06-09 11:35:34 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-09 11:35:34 +0300 |
commit | 9c9f66a30fd2797f761f33cee0b8839c250b690e (patch) | |
tree | de73eb30ac31954bb4584e9c9ea001246de55b40 /applications/nfc/nfc_worker.c | |
parent | d5df4027d771dc654339e9d7a0c6c3c256165572 (diff) |
nfc: add debug PCAP output, refactor Mifare DESFire following #1095 (#1294)
* nfc: refactor nfc_worker_read_mifare_desfire to use furi_hal_nfc_tx_rx
Renames furi_hal_nfc_exchange_full to furi_hal_nfc_tx_rx_full, and
rewrites it to use furi_hal_nfc_tx_rx. This eliminates the final
remaining use of furi_hal_nfc_exchange, so remove that.
* nfc: write debug.pcap when debug mode enabled
Limited to NFC protocols that use furi_hal_nfc_tx_rx to communicate.
* switch to Doxygen style comment
Co-authored-by: Kevin Wallace <git+flipperzero@kevin.wallace.seattle.wa.us>
Co-authored-by: あく <alleteam@gmail.com>
Diffstat (limited to 'applications/nfc/nfc_worker.c')
-rw-r--r-- | applications/nfc/nfc_worker.c | 129 |
1 files changed, 64 insertions, 65 deletions
diff --git a/applications/nfc/nfc_worker.c b/applications/nfc/nfc_worker.c index 88729bf4..c058809e 100644 --- a/applications/nfc/nfc_worker.c +++ b/applications/nfc/nfc_worker.c @@ -10,6 +10,7 @@ #include <lib/nfc_protocols/nfca.h> #include "helpers/nfc_mf_classic_dict.h" +#include "helpers/nfc_debug_pcap.h" #define TAG "NfcWorker" @@ -153,6 +154,7 @@ void nfc_worker_detect(NfcWorker* nfc_worker) { void nfc_worker_emulate(NfcWorker* nfc_worker) { FuriHalNfcTxRxContext tx_rx = {}; + nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, true); FuriHalNfcDevData* data = &nfc_worker->dev_data->nfc_data; NfcReaderRequestData* reader_data = &nfc_worker->dev_data->reader_data; @@ -175,6 +177,7 @@ void nfc_worker_emulate(NfcWorker* nfc_worker) { void nfc_worker_read_emv_app(NfcWorker* nfc_worker) { FuriHalNfcTxRxContext tx_rx = {}; + nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, false); EmvApplication emv_app = {}; NfcDeviceData* result = nfc_worker->dev_data; FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; @@ -206,6 +209,7 @@ void nfc_worker_read_emv_app(NfcWorker* nfc_worker) { void nfc_worker_read_emv(NfcWorker* nfc_worker) { FuriHalNfcTxRxContext tx_rx = {}; + nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, false); EmvApplication emv_app = {}; NfcDeviceData* result = nfc_worker->dev_data; FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; @@ -254,6 +258,7 @@ void nfc_worker_read_emv(NfcWorker* nfc_worker) { void nfc_worker_emulate_apdu(NfcWorker* nfc_worker) { FuriHalNfcTxRxContext tx_rx = {}; + nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, true); FuriHalNfcDevData params = { .uid = {0xCF, 0x72, 0xd4, 0x40}, .uid_len = 4, @@ -278,6 +283,7 @@ void nfc_worker_emulate_apdu(NfcWorker* nfc_worker) { void nfc_worker_read_mifare_ultralight(NfcWorker* nfc_worker) { FuriHalNfcTxRxContext tx_rx = {}; + nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, false); MfUltralightReader reader = {}; MfUltralightData data = {}; NfcDeviceData* result = nfc_worker->dev_data; @@ -342,6 +348,7 @@ void nfc_worker_emulate_mifare_ul(NfcWorker* nfc_worker) { void nfc_worker_mifare_classic_dict_attack(NfcWorker* nfc_worker) { furi_assert(nfc_worker->callback); FuriHalNfcTxRxContext tx_rx_ctx = {}; + nfc_debug_pcap_prepare_tx_rx(&tx_rx_ctx, nfc_worker->storage, false); MfClassicAuthContext auth_ctx = {}; MfClassicReader reader = {}; uint64_t curr_key = 0; @@ -483,7 +490,8 @@ void nfc_worker_mifare_classic_dict_attack(NfcWorker* nfc_worker) { } void nfc_worker_emulate_mifare_classic(NfcWorker* nfc_worker) { - FuriHalNfcTxRxContext tx_rx; + FuriHalNfcTxRxContext tx_rx = {}; + nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, true); FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; MfClassicEmulator emulator = { .cuid = nfc_util_bytes2num(&nfc_data->uid[nfc_data->uid_len - 4], 4), @@ -511,11 +519,8 @@ void nfc_worker_emulate_mifare_classic(NfcWorker* nfc_worker) { } void nfc_worker_read_mifare_desfire(NfcWorker* nfc_worker) { - ReturnCode err; - uint8_t tx_buff[64] = {}; - uint16_t tx_len = 0; - uint8_t rx_buff[512] = {}; - uint16_t rx_len; + FuriHalNfcTxRxContext tx_rx = {}; + nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, false); NfcDeviceData* result = nfc_worker->dev_data; nfc_device_data_clear(result); MifareDesfireData* data = &result->mf_df_data; @@ -540,37 +545,36 @@ void nfc_worker_read_mifare_desfire(NfcWorker* nfc_worker) { result->protocol = NfcDeviceProtocolMifareDesfire; // Get DESFire version - tx_len = mf_df_prepare_get_version(tx_buff); - err = furi_hal_nfc_exchange_full(tx_buff, tx_len, rx_buff, sizeof(rx_buff), &rx_len); - if(err != ERR_NONE) { - FURI_LOG_W(TAG, "Bad exchange getting version, err: %d", err); + tx_rx.tx_bits = 8 * mf_df_prepare_get_version(tx_rx.tx_data); + if(!furi_hal_nfc_tx_rx_full(&tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange getting version"); continue; } - if(!mf_df_parse_get_version_response(rx_buff, rx_len, &data->version)) { + if(!mf_df_parse_get_version_response(tx_rx.rx_data, tx_rx.rx_bits / 8, &data->version)) { FURI_LOG_W(TAG, "Bad DESFire GET_VERSION response"); continue; } - tx_len = mf_df_prepare_get_free_memory(tx_buff); - err = furi_hal_nfc_exchange_full(tx_buff, tx_len, rx_buff, sizeof(rx_buff), &rx_len); - if(err == ERR_NONE) { + tx_rx.tx_bits = 8 * mf_df_prepare_get_free_memory(tx_rx.tx_data); + if(furi_hal_nfc_tx_rx_full(&tx_rx)) { data->free_memory = malloc(sizeof(MifareDesfireFreeMemory)); memset(data->free_memory, 0, sizeof(MifareDesfireFreeMemory)); - if(!mf_df_parse_get_free_memory_response(rx_buff, rx_len, data->free_memory)) { + if(!mf_df_parse_get_free_memory_response( + tx_rx.rx_data, tx_rx.rx_bits / 8, data->free_memory)) { FURI_LOG_D(TAG, "Bad DESFire GET_FREE_MEMORY response (normal for pre-EV1 cards)"); free(data->free_memory); data->free_memory = NULL; } } - tx_len = mf_df_prepare_get_key_settings(tx_buff); - err = furi_hal_nfc_exchange_full(tx_buff, tx_len, rx_buff, sizeof(rx_buff), &rx_len); - if(err != ERR_NONE) { - FURI_LOG_D(TAG, "Bad exchange getting key settings, err: %d", err); + tx_rx.tx_bits = 8 * mf_df_prepare_get_key_settings(tx_rx.tx_data); + if(!furi_hal_nfc_tx_rx_full(&tx_rx)) { + FURI_LOG_D(TAG, "Bad exchange getting key settings"); } else { data->master_key_settings = malloc(sizeof(MifareDesfireKeySettings)); memset(data->master_key_settings, 0, sizeof(MifareDesfireKeySettings)); - if(!mf_df_parse_get_key_settings_response(rx_buff, rx_len, data->master_key_settings)) { + if(!mf_df_parse_get_key_settings_response( + tx_rx.rx_data, tx_rx.rx_bits / 8, data->master_key_settings)) { FURI_LOG_W(TAG, "Bad DESFire GET_KEY_SETTINGS response"); free(data->master_key_settings); data->master_key_settings = NULL; @@ -580,17 +584,16 @@ void nfc_worker_read_mifare_desfire(NfcWorker* nfc_worker) { MifareDesfireKeyVersion** key_version_head = &data->master_key_settings->key_version_head; for(uint8_t key_id = 0; key_id < data->master_key_settings->max_keys; key_id++) { - tx_len = mf_df_prepare_get_key_version(tx_buff, key_id); - err = - furi_hal_nfc_exchange_full(tx_buff, tx_len, rx_buff, sizeof(rx_buff), &rx_len); - if(err != ERR_NONE) { - FURI_LOG_W(TAG, "Bad exchange getting key version, err: %d", err); + tx_rx.tx_bits = 8 * mf_df_prepare_get_key_version(tx_rx.tx_data, key_id); + if(!furi_hal_nfc_tx_rx_full(&tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange getting key version"); continue; } MifareDesfireKeyVersion* key_version = malloc(sizeof(MifareDesfireKeyVersion)); memset(key_version, 0, sizeof(MifareDesfireKeyVersion)); key_version->id = key_id; - if(!mf_df_parse_get_key_version_response(rx_buff, rx_len, key_version)) { + if(!mf_df_parse_get_key_version_response( + tx_rx.rx_data, tx_rx.rx_bits / 8, key_version)) { FURI_LOG_W(TAG, "Bad DESFire GET_KEY_VERSION response"); free(key_version); continue; @@ -600,31 +603,31 @@ void nfc_worker_read_mifare_desfire(NfcWorker* nfc_worker) { } } - tx_len = mf_df_prepare_get_application_ids(tx_buff); - err = furi_hal_nfc_exchange_full(tx_buff, tx_len, rx_buff, sizeof(rx_buff), &rx_len); - if(err != ERR_NONE) { - FURI_LOG_W(TAG, "Bad exchange getting application IDs, err: %d", err); + tx_rx.tx_bits = 8 * mf_df_prepare_get_application_ids(tx_rx.tx_data); + if(!furi_hal_nfc_tx_rx_full(&tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange getting application IDs"); } else { - if(!mf_df_parse_get_application_ids_response(rx_buff, rx_len, &data->app_head)) { + if(!mf_df_parse_get_application_ids_response( + tx_rx.rx_data, tx_rx.rx_bits / 8, &data->app_head)) { FURI_LOG_W(TAG, "Bad DESFire GET_APPLICATION_IDS response"); } } for(MifareDesfireApplication* app = data->app_head; app; app = app->next) { - tx_len = mf_df_prepare_select_application(tx_buff, app->id); - err = furi_hal_nfc_exchange_full(tx_buff, tx_len, rx_buff, sizeof(rx_buff), &rx_len); - if(!mf_df_parse_select_application_response(rx_buff, rx_len)) { - FURI_LOG_W(TAG, "Bad exchange selecting application, err: %d", err); + tx_rx.tx_bits = 8 * mf_df_prepare_select_application(tx_rx.tx_data, app->id); + if(!furi_hal_nfc_tx_rx_full(&tx_rx) || + !mf_df_parse_select_application_response(tx_rx.rx_data, tx_rx.rx_bits / 8)) { + FURI_LOG_W(TAG, "Bad exchange selecting application"); continue; } - tx_len = mf_df_prepare_get_key_settings(tx_buff); - err = furi_hal_nfc_exchange_full(tx_buff, tx_len, rx_buff, sizeof(rx_buff), &rx_len); - if(err != ERR_NONE) { - FURI_LOG_W(TAG, "Bad exchange getting key settings, err: %d", err); + tx_rx.tx_bits = 8 * mf_df_prepare_get_key_settings(tx_rx.tx_data); + if(!furi_hal_nfc_tx_rx_full(&tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange getting key settings"); } else { app->key_settings = malloc(sizeof(MifareDesfireKeySettings)); memset(app->key_settings, 0, sizeof(MifareDesfireKeySettings)); - if(!mf_df_parse_get_key_settings_response(rx_buff, rx_len, app->key_settings)) { + if(!mf_df_parse_get_key_settings_response( + tx_rx.rx_data, tx_rx.rx_bits / 8, app->key_settings)) { FURI_LOG_W(TAG, "Bad DESFire GET_KEY_SETTINGS response"); free(app->key_settings); app->key_settings = NULL; @@ -633,17 +636,16 @@ void nfc_worker_read_mifare_desfire(NfcWorker* nfc_worker) { MifareDesfireKeyVersion** key_version_head = &app->key_settings->key_version_head; for(uint8_t key_id = 0; key_id < app->key_settings->max_keys; key_id++) { - tx_len = mf_df_prepare_get_key_version(tx_buff, key_id); - err = furi_hal_nfc_exchange_full( - tx_buff, tx_len, rx_buff, sizeof(rx_buff), &rx_len); - if(err != ERR_NONE) { - FURI_LOG_W(TAG, "Bad exchange getting key version, err: %d", err); + tx_rx.tx_bits = 8 * mf_df_prepare_get_key_version(tx_rx.tx_data, key_id); + if(!furi_hal_nfc_tx_rx_full(&tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange getting key version"); continue; } MifareDesfireKeyVersion* key_version = malloc(sizeof(MifareDesfireKeyVersion)); memset(key_version, 0, sizeof(MifareDesfireKeyVersion)); key_version->id = key_id; - if(!mf_df_parse_get_key_version_response(rx_buff, rx_len, key_version)) { + if(!mf_df_parse_get_key_version_response( + tx_rx.rx_data, tx_rx.rx_bits / 8, key_version)) { FURI_LOG_W(TAG, "Bad DESFire GET_KEY_VERSION response"); free(key_version); continue; @@ -653,48 +655,45 @@ void nfc_worker_read_mifare_desfire(NfcWorker* nfc_worker) { } } - tx_len = mf_df_prepare_get_file_ids(tx_buff); - err = furi_hal_nfc_exchange_full(tx_buff, tx_len, rx_buff, sizeof(rx_buff), &rx_len); - if(err != ERR_NONE) { - FURI_LOG_W(TAG, "Bad exchange getting file IDs, err: %d", err); + tx_rx.tx_bits = 8 * mf_df_prepare_get_file_ids(tx_rx.tx_data); + if(!furi_hal_nfc_tx_rx_full(&tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange getting file IDs"); } else { - if(!mf_df_parse_get_file_ids_response(rx_buff, rx_len, &app->file_head)) { + if(!mf_df_parse_get_file_ids_response( + tx_rx.rx_data, tx_rx.rx_bits / 8, &app->file_head)) { FURI_LOG_W(TAG, "Bad DESFire GET_FILE_IDS response"); } } for(MifareDesfireFile* file = app->file_head; file; file = file->next) { - tx_len = mf_df_prepare_get_file_settings(tx_buff, file->id); - err = - furi_hal_nfc_exchange_full(tx_buff, tx_len, rx_buff, sizeof(rx_buff), &rx_len); - if(err != ERR_NONE) { - FURI_LOG_W(TAG, "Bad exchange getting file settings, err: %d", err); + tx_rx.tx_bits = 8 * mf_df_prepare_get_file_settings(tx_rx.tx_data, file->id); + if(!furi_hal_nfc_tx_rx_full(&tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange getting file settings"); continue; } - if(!mf_df_parse_get_file_settings_response(rx_buff, rx_len, file)) { + if(!mf_df_parse_get_file_settings_response( + tx_rx.rx_data, tx_rx.rx_bits / 8, file)) { FURI_LOG_W(TAG, "Bad DESFire GET_FILE_SETTINGS response"); continue; } switch(file->type) { case MifareDesfireFileTypeStandard: case MifareDesfireFileTypeBackup: - tx_len = mf_df_prepare_read_data(tx_buff, file->id, 0, 0); + tx_rx.tx_bits = 8 * mf_df_prepare_read_data(tx_rx.tx_data, file->id, 0, 0); break; case MifareDesfireFileTypeValue: - tx_len = mf_df_prepare_get_value(tx_buff, file->id); + tx_rx.tx_bits = 8 * mf_df_prepare_get_value(tx_rx.tx_data, file->id); break; case MifareDesfireFileTypeLinearRecord: case MifareDesfireFileTypeCyclicRecord: - tx_len = mf_df_prepare_read_records(tx_buff, file->id, 0, 0); + tx_rx.tx_bits = 8 * mf_df_prepare_read_records(tx_rx.tx_data, file->id, 0, 0); break; } - err = - furi_hal_nfc_exchange_full(tx_buff, tx_len, rx_buff, sizeof(rx_buff), &rx_len); - if(err != ERR_NONE) { - FURI_LOG_W(TAG, "Bad exchange reading file %d, err: %d", file->id, err); + if(!furi_hal_nfc_tx_rx_full(&tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange reading file %d", file->id); continue; } - if(!mf_df_parse_read_data_response(rx_buff, rx_len, file)) { + if(!mf_df_parse_read_data_response(tx_rx.rx_data, tx_rx.rx_bits / 8, file)) { FURI_LOG_W(TAG, "Bad response reading file %d", file->id); continue; } |