Nfc: async pcap worker (#1315)
* Nfc: async pcap worker * nfc: add pcap save to classic emulation Co-authored-by: gornekich <n.gorbadey@gmail.com>
This commit is contained in:
parent
fb8c8ae21c
commit
b2132b2ec7
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -152,7 +152,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
issue-number: ${{ github.event.pull_request.number }}
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
comment-author: 'github-actions[bot]'
|
comment-author: 'github-actions[bot]'
|
||||||
body-includes: 'to flash the'
|
body-includes: 'Install with web updater'
|
||||||
|
|
||||||
- name: 'Create or update comment'
|
- name: 'Create or update comment'
|
||||||
if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request}}
|
if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request}}
|
||||||
@ -161,7 +161,7 @@ jobs:
|
|||||||
comment-id: ${{ steps.fc.outputs.comment-id }}
|
comment-id: ${{ steps.fc.outputs.comment-id }}
|
||||||
issue-number: ${{ github.event.pull_request.number }}
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
body: |
|
body: |
|
||||||
[Install with web updater](https://my.flipp.dev/?url=https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.artifacts-path}}/flipper-z-${{steps.names.outputs.default-target}}-update-${{steps.names.outputs.suffix}}.tgz&channel=${{steps.names.outputs.artifacts-path}}&version=${{steps.names.outputs.short-hash}})
|
[Install with web updater](https://my.flipp.dev/?url=https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.artifacts-path}}/flipper-z-${{steps.names.outputs.default-target}}-update-${{steps.names.outputs.suffix}}.tgz&channel=${{steps.names.outputs.artifacts-path}}&version=${{steps.names.outputs.short-hash}}).
|
||||||
edit-mode: replace
|
edit-mode: replace
|
||||||
|
|
||||||
compact:
|
compact:
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "nfc_debug_pcap.h"
|
#include "nfc_debug_pcap.h"
|
||||||
|
|
||||||
#include <furi_hal_rtc.h>
|
#include <furi_hal_rtc.h>
|
||||||
|
#include <stream_buffer.h>
|
||||||
|
|
||||||
#define TAG "NfcDebugPcap"
|
#define TAG "NfcDebugPcap"
|
||||||
|
|
||||||
@ -14,9 +15,20 @@
|
|||||||
#define DATA_PICC_TO_PCD_CRC_DROPPED 0xFB
|
#define DATA_PICC_TO_PCD_CRC_DROPPED 0xFB
|
||||||
#define DATA_PCD_TO_PICC_CRC_DROPPED 0xFA
|
#define DATA_PCD_TO_PICC_CRC_DROPPED 0xFA
|
||||||
|
|
||||||
File* nfc_debug_pcap_open(Storage* storage) {
|
#define NFC_DEBUG_PCAP_FILENAME "/ext/nfc/debug.pcap"
|
||||||
|
#define NFC_DEBUG_PCAP_BUFFER_SIZE 64
|
||||||
|
|
||||||
|
struct NfcDebugPcapWorker {
|
||||||
|
bool alive;
|
||||||
|
Storage* storage;
|
||||||
|
File* file;
|
||||||
|
StreamBufferHandle_t stream;
|
||||||
|
FuriThread* thread;
|
||||||
|
};
|
||||||
|
|
||||||
|
static File* nfc_debug_pcap_open(Storage* storage) {
|
||||||
File* file = storage_file_alloc(storage);
|
File* file = storage_file_alloc(storage);
|
||||||
if(!storage_file_open(file, "/ext/nfc/debug.pcap", FSAM_WRITE, FSOM_OPEN_APPEND)) {
|
if(!storage_file_open(file, NFC_DEBUG_PCAP_FILENAME, FSAM_WRITE, FSOM_OPEN_APPEND)) {
|
||||||
storage_file_free(file);
|
storage_file_free(file);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -41,10 +53,8 @@ File* nfc_debug_pcap_open(Storage* storage) {
|
|||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nfc_debug_pcap_write(Storage* storage, uint8_t event, uint8_t* data, uint16_t len) {
|
static void
|
||||||
File* file = nfc_debug_pcap_open(storage);
|
nfc_debug_pcap_write(NfcDebugPcapWorker* instance, uint8_t event, uint8_t* data, uint16_t len) {
|
||||||
if(!file) return;
|
|
||||||
|
|
||||||
FuriHalRtcDateTime datetime;
|
FuriHalRtcDateTime datetime;
|
||||||
furi_hal_rtc_get_datetime(&datetime);
|
furi_hal_rtc_get_datetime(&datetime);
|
||||||
|
|
||||||
@ -67,26 +77,83 @@ void nfc_debug_pcap_write(Storage* storage, uint8_t event, uint8_t* data, uint16
|
|||||||
.event = event,
|
.event = event,
|
||||||
.len = len << 8 | len >> 8,
|
.len = len << 8 | len >> 8,
|
||||||
};
|
};
|
||||||
if(storage_file_write(file, &pkt_hdr, sizeof(pkt_hdr)) != sizeof(pkt_hdr)) {
|
xStreamBufferSend(instance->stream, &pkt_hdr, sizeof(pkt_hdr), osWaitForever);
|
||||||
FURI_LOG_E(TAG, "Failed to write pcap packet header");
|
xStreamBufferSend(instance->stream, data, len, osWaitForever);
|
||||||
} else if(storage_file_write(file, data, len) != len) {
|
|
||||||
FURI_LOG_E(TAG, "Failed to write pcap packet data");
|
|
||||||
}
|
|
||||||
storage_file_free(file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void nfc_debug_pcap_write_tx(uint8_t* data, uint16_t bits, bool crc_dropped, void* context) {
|
static void
|
||||||
|
nfc_debug_pcap_write_tx(uint8_t* data, uint16_t bits, bool crc_dropped, void* context) {
|
||||||
|
NfcDebugPcapWorker* instance = context;
|
||||||
uint8_t event = crc_dropped ? DATA_PCD_TO_PICC_CRC_DROPPED : DATA_PCD_TO_PICC;
|
uint8_t event = crc_dropped ? DATA_PCD_TO_PICC_CRC_DROPPED : DATA_PCD_TO_PICC;
|
||||||
nfc_debug_pcap_write(context, event, data, bits / 8);
|
nfc_debug_pcap_write(instance, event, data, bits / 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nfc_debug_pcap_write_rx(uint8_t* data, uint16_t bits, bool crc_dropped, void* context) {
|
static void
|
||||||
|
nfc_debug_pcap_write_rx(uint8_t* data, uint16_t bits, bool crc_dropped, void* context) {
|
||||||
|
NfcDebugPcapWorker* instance = context;
|
||||||
uint8_t event = crc_dropped ? DATA_PICC_TO_PCD_CRC_DROPPED : DATA_PICC_TO_PCD;
|
uint8_t event = crc_dropped ? DATA_PICC_TO_PCD_CRC_DROPPED : DATA_PICC_TO_PCD;
|
||||||
nfc_debug_pcap_write(context, event, data, bits / 8);
|
nfc_debug_pcap_write(instance, event, data, bits / 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nfc_debug_pcap_prepare_tx_rx(FuriHalNfcTxRxContext* tx_rx, Storage* storage, bool is_picc) {
|
int32_t nfc_debug_pcap_thread(void* context) {
|
||||||
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
|
NfcDebugPcapWorker* instance = context;
|
||||||
|
uint8_t buffer[NFC_DEBUG_PCAP_BUFFER_SIZE];
|
||||||
|
|
||||||
|
while(instance->alive) {
|
||||||
|
size_t ret =
|
||||||
|
xStreamBufferReceive(instance->stream, buffer, NFC_DEBUG_PCAP_BUFFER_SIZE, 50);
|
||||||
|
if(storage_file_write(instance->file, buffer, ret) != ret) {
|
||||||
|
FURI_LOG_E(TAG, "Failed to write pcap data");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
NfcDebugPcapWorker* nfc_debug_pcap_alloc(Storage* storage) {
|
||||||
|
NfcDebugPcapWorker* instance = malloc(sizeof(NfcDebugPcapWorker));
|
||||||
|
|
||||||
|
instance->alive = true;
|
||||||
|
|
||||||
|
instance->storage = storage;
|
||||||
|
|
||||||
|
instance->file = nfc_debug_pcap_open(storage);
|
||||||
|
|
||||||
|
instance->stream = xStreamBufferCreate(4096, 1);
|
||||||
|
|
||||||
|
instance->thread = furi_thread_alloc();
|
||||||
|
furi_thread_set_name(instance->thread, "PcapWorker");
|
||||||
|
furi_thread_set_stack_size(instance->thread, 1024);
|
||||||
|
furi_thread_set_callback(instance->thread, nfc_debug_pcap_thread);
|
||||||
|
furi_thread_set_context(instance->thread, instance);
|
||||||
|
furi_thread_start(instance->thread);
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nfc_debug_pcap_free(NfcDebugPcapWorker* instance) {
|
||||||
|
furi_assert(instance);
|
||||||
|
|
||||||
|
instance->alive = false;
|
||||||
|
|
||||||
|
furi_thread_join(instance->thread);
|
||||||
|
furi_thread_free(instance->thread);
|
||||||
|
|
||||||
|
vStreamBufferDelete(instance->stream);
|
||||||
|
|
||||||
|
if(instance->file) storage_file_free(instance->file);
|
||||||
|
|
||||||
|
instance->storage = NULL;
|
||||||
|
|
||||||
|
free(instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
void nfc_debug_pcap_prepare_tx_rx(
|
||||||
|
NfcDebugPcapWorker* instance,
|
||||||
|
FuriHalNfcTxRxContext* tx_rx,
|
||||||
|
bool is_picc) {
|
||||||
|
if(!instance || !instance->file) return;
|
||||||
|
|
||||||
if(is_picc) {
|
if(is_picc) {
|
||||||
tx_rx->sniff_tx = nfc_debug_pcap_write_rx;
|
tx_rx->sniff_tx = nfc_debug_pcap_write_rx;
|
||||||
tx_rx->sniff_rx = nfc_debug_pcap_write_tx;
|
tx_rx->sniff_rx = nfc_debug_pcap_write_tx;
|
||||||
@ -94,6 +161,6 @@ void nfc_debug_pcap_prepare_tx_rx(FuriHalNfcTxRxContext* tx_rx, Storage* storage
|
|||||||
tx_rx->sniff_tx = nfc_debug_pcap_write_tx;
|
tx_rx->sniff_tx = nfc_debug_pcap_write_tx;
|
||||||
tx_rx->sniff_rx = nfc_debug_pcap_write_rx;
|
tx_rx->sniff_rx = nfc_debug_pcap_write_rx;
|
||||||
}
|
}
|
||||||
tx_rx->sniff_context = storage;
|
|
||||||
}
|
tx_rx->sniff_context = instance;
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,19 @@
|
|||||||
#include <furi_hal_nfc.h>
|
#include <furi_hal_nfc.h>
|
||||||
#include <storage/storage.h>
|
#include <storage/storage.h>
|
||||||
|
|
||||||
|
typedef struct NfcDebugPcapWorker NfcDebugPcapWorker;
|
||||||
|
|
||||||
|
NfcDebugPcapWorker* nfc_debug_pcap_alloc(Storage* storage);
|
||||||
|
|
||||||
|
void nfc_debug_pcap_free(NfcDebugPcapWorker* instance);
|
||||||
|
|
||||||
/** Prepare tx/rx context for debug pcap logging, if enabled.
|
/** Prepare tx/rx context for debug pcap logging, if enabled.
|
||||||
*
|
*
|
||||||
|
* @param instance NfcDebugPcapWorker* instance, can be NULL
|
||||||
* @param tx_rx TX/RX context to log
|
* @param tx_rx TX/RX context to log
|
||||||
* @param storage Storage to log to
|
|
||||||
* @param is_picc if true, record Flipper as PICC, else PCD.
|
* @param is_picc if true, record Flipper as PICC, else PCD.
|
||||||
*/
|
*/
|
||||||
void nfc_debug_pcap_prepare_tx_rx(FuriHalNfcTxRxContext* tx_rx, Storage* storage, bool is_picc);
|
void nfc_debug_pcap_prepare_tx_rx(
|
||||||
|
NfcDebugPcapWorker* instance,
|
||||||
|
FuriHalNfcTxRxContext* tx_rx,
|
||||||
|
bool is_picc);
|
||||||
|
@ -1,17 +1,6 @@
|
|||||||
#include "nfc_worker_i.h"
|
#include "nfc_worker_i.h"
|
||||||
#include <furi_hal.h>
|
#include <furi_hal.h>
|
||||||
|
|
||||||
#include <lib/nfc_protocols/nfc_util.h>
|
|
||||||
#include <lib/nfc_protocols/emv.h>
|
|
||||||
#include <lib/nfc_protocols/mifare_common.h>
|
|
||||||
#include <lib/nfc_protocols/mifare_ultralight.h>
|
|
||||||
#include <lib/nfc_protocols/mifare_classic.h>
|
|
||||||
#include <lib/nfc_protocols/mifare_desfire.h>
|
|
||||||
#include <lib/nfc_protocols/nfca.h>
|
|
||||||
|
|
||||||
#include "helpers/nfc_mf_classic_dict.h"
|
|
||||||
#include "helpers/nfc_debug_pcap.h"
|
|
||||||
|
|
||||||
#define TAG "NfcWorker"
|
#define TAG "NfcWorker"
|
||||||
|
|
||||||
/***************************** NFC Worker API *******************************/
|
/***************************** NFC Worker API *******************************/
|
||||||
@ -36,13 +25,22 @@ NfcWorker* nfc_worker_alloc() {
|
|||||||
}
|
}
|
||||||
nfc_worker_change_state(nfc_worker, NfcWorkerStateReady);
|
nfc_worker_change_state(nfc_worker, NfcWorkerStateReady);
|
||||||
|
|
||||||
|
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
|
||||||
|
nfc_worker->debug_pcap_worker = nfc_debug_pcap_alloc(nfc_worker->storage);
|
||||||
|
}
|
||||||
|
|
||||||
return nfc_worker;
|
return nfc_worker;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nfc_worker_free(NfcWorker* nfc_worker) {
|
void nfc_worker_free(NfcWorker* nfc_worker) {
|
||||||
furi_assert(nfc_worker);
|
furi_assert(nfc_worker);
|
||||||
|
|
||||||
furi_thread_free(nfc_worker->thread);
|
furi_thread_free(nfc_worker->thread);
|
||||||
|
|
||||||
furi_record_close("storage");
|
furi_record_close("storage");
|
||||||
|
|
||||||
|
if(nfc_worker->debug_pcap_worker) nfc_debug_pcap_free(nfc_worker->debug_pcap_worker);
|
||||||
|
|
||||||
free(nfc_worker);
|
free(nfc_worker);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,7 +152,7 @@ void nfc_worker_detect(NfcWorker* nfc_worker) {
|
|||||||
|
|
||||||
void nfc_worker_emulate(NfcWorker* nfc_worker) {
|
void nfc_worker_emulate(NfcWorker* nfc_worker) {
|
||||||
FuriHalNfcTxRxContext tx_rx = {};
|
FuriHalNfcTxRxContext tx_rx = {};
|
||||||
nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, true);
|
nfc_debug_pcap_prepare_tx_rx(nfc_worker->debug_pcap_worker, &tx_rx, true);
|
||||||
FuriHalNfcDevData* data = &nfc_worker->dev_data->nfc_data;
|
FuriHalNfcDevData* data = &nfc_worker->dev_data->nfc_data;
|
||||||
NfcReaderRequestData* reader_data = &nfc_worker->dev_data->reader_data;
|
NfcReaderRequestData* reader_data = &nfc_worker->dev_data->reader_data;
|
||||||
|
|
||||||
@ -177,7 +175,7 @@ void nfc_worker_emulate(NfcWorker* nfc_worker) {
|
|||||||
|
|
||||||
void nfc_worker_read_emv_app(NfcWorker* nfc_worker) {
|
void nfc_worker_read_emv_app(NfcWorker* nfc_worker) {
|
||||||
FuriHalNfcTxRxContext tx_rx = {};
|
FuriHalNfcTxRxContext tx_rx = {};
|
||||||
nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, false);
|
nfc_debug_pcap_prepare_tx_rx(nfc_worker->debug_pcap_worker, &tx_rx, false);
|
||||||
EmvApplication emv_app = {};
|
EmvApplication emv_app = {};
|
||||||
NfcDeviceData* result = nfc_worker->dev_data;
|
NfcDeviceData* result = nfc_worker->dev_data;
|
||||||
FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data;
|
FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data;
|
||||||
@ -209,7 +207,7 @@ void nfc_worker_read_emv_app(NfcWorker* nfc_worker) {
|
|||||||
|
|
||||||
void nfc_worker_read_emv(NfcWorker* nfc_worker) {
|
void nfc_worker_read_emv(NfcWorker* nfc_worker) {
|
||||||
FuriHalNfcTxRxContext tx_rx = {};
|
FuriHalNfcTxRxContext tx_rx = {};
|
||||||
nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, false);
|
nfc_debug_pcap_prepare_tx_rx(nfc_worker->debug_pcap_worker, &tx_rx, false);
|
||||||
EmvApplication emv_app = {};
|
EmvApplication emv_app = {};
|
||||||
NfcDeviceData* result = nfc_worker->dev_data;
|
NfcDeviceData* result = nfc_worker->dev_data;
|
||||||
FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data;
|
FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data;
|
||||||
@ -258,7 +256,7 @@ void nfc_worker_read_emv(NfcWorker* nfc_worker) {
|
|||||||
|
|
||||||
void nfc_worker_emulate_apdu(NfcWorker* nfc_worker) {
|
void nfc_worker_emulate_apdu(NfcWorker* nfc_worker) {
|
||||||
FuriHalNfcTxRxContext tx_rx = {};
|
FuriHalNfcTxRxContext tx_rx = {};
|
||||||
nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, true);
|
nfc_debug_pcap_prepare_tx_rx(nfc_worker->debug_pcap_worker, &tx_rx, true);
|
||||||
FuriHalNfcDevData params = {
|
FuriHalNfcDevData params = {
|
||||||
.uid = {0xCF, 0x72, 0xd4, 0x40},
|
.uid = {0xCF, 0x72, 0xd4, 0x40},
|
||||||
.uid_len = 4,
|
.uid_len = 4,
|
||||||
@ -283,7 +281,7 @@ void nfc_worker_emulate_apdu(NfcWorker* nfc_worker) {
|
|||||||
|
|
||||||
void nfc_worker_read_mifare_ultralight(NfcWorker* nfc_worker) {
|
void nfc_worker_read_mifare_ultralight(NfcWorker* nfc_worker) {
|
||||||
FuriHalNfcTxRxContext tx_rx = {};
|
FuriHalNfcTxRxContext tx_rx = {};
|
||||||
nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, false);
|
nfc_debug_pcap_prepare_tx_rx(nfc_worker->debug_pcap_worker, &tx_rx, false);
|
||||||
MfUltralightReader reader = {};
|
MfUltralightReader reader = {};
|
||||||
MfUltralightData data = {};
|
MfUltralightData data = {};
|
||||||
NfcDeviceData* result = nfc_worker->dev_data;
|
NfcDeviceData* result = nfc_worker->dev_data;
|
||||||
@ -348,7 +346,7 @@ void nfc_worker_emulate_mifare_ul(NfcWorker* nfc_worker) {
|
|||||||
void nfc_worker_mifare_classic_dict_attack(NfcWorker* nfc_worker) {
|
void nfc_worker_mifare_classic_dict_attack(NfcWorker* nfc_worker) {
|
||||||
furi_assert(nfc_worker->callback);
|
furi_assert(nfc_worker->callback);
|
||||||
FuriHalNfcTxRxContext tx_rx_ctx = {};
|
FuriHalNfcTxRxContext tx_rx_ctx = {};
|
||||||
nfc_debug_pcap_prepare_tx_rx(&tx_rx_ctx, nfc_worker->storage, false);
|
nfc_debug_pcap_prepare_tx_rx(nfc_worker->debug_pcap_worker, &tx_rx_ctx, false);
|
||||||
MfClassicAuthContext auth_ctx = {};
|
MfClassicAuthContext auth_ctx = {};
|
||||||
MfClassicReader reader = {};
|
MfClassicReader reader = {};
|
||||||
uint64_t curr_key = 0;
|
uint64_t curr_key = 0;
|
||||||
@ -491,6 +489,7 @@ void nfc_worker_mifare_classic_dict_attack(NfcWorker* nfc_worker) {
|
|||||||
|
|
||||||
void nfc_worker_emulate_mifare_classic(NfcWorker* nfc_worker) {
|
void nfc_worker_emulate_mifare_classic(NfcWorker* nfc_worker) {
|
||||||
FuriHalNfcTxRxContext tx_rx = {};
|
FuriHalNfcTxRxContext tx_rx = {};
|
||||||
|
nfc_debug_pcap_prepare_tx_rx(nfc_worker->debug_pcap_worker, &tx_rx, true);
|
||||||
FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data;
|
FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data;
|
||||||
MfClassicEmulator emulator = {
|
MfClassicEmulator emulator = {
|
||||||
.cuid = nfc_util_bytes2num(&nfc_data->uid[nfc_data->uid_len - 4], 4),
|
.cuid = nfc_util_bytes2num(&nfc_data->uid[nfc_data->uid_len - 4], 4),
|
||||||
@ -519,7 +518,7 @@ void nfc_worker_emulate_mifare_classic(NfcWorker* nfc_worker) {
|
|||||||
|
|
||||||
void nfc_worker_read_mifare_desfire(NfcWorker* nfc_worker) {
|
void nfc_worker_read_mifare_desfire(NfcWorker* nfc_worker) {
|
||||||
FuriHalNfcTxRxContext tx_rx = {};
|
FuriHalNfcTxRxContext tx_rx = {};
|
||||||
nfc_debug_pcap_prepare_tx_rx(&tx_rx, nfc_worker->storage, false);
|
nfc_debug_pcap_prepare_tx_rx(nfc_worker->debug_pcap_worker, &tx_rx, false);
|
||||||
NfcDeviceData* result = nfc_worker->dev_data;
|
NfcDeviceData* result = nfc_worker->dev_data;
|
||||||
nfc_device_data_clear(result);
|
nfc_device_data_clear(result);
|
||||||
MifareDesfireData* data = &result->mf_df_data;
|
MifareDesfireData* data = &result->mf_df_data;
|
||||||
|
15
applications/nfc/nfc_worker_i.h
Executable file → Normal file
15
applications/nfc/nfc_worker_i.h
Executable file → Normal file
@ -1,11 +1,22 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "nfc_i.h"
|
|
||||||
#include "nfc_worker.h"
|
#include "nfc_worker.h"
|
||||||
|
#include "nfc_i.h"
|
||||||
|
|
||||||
#include <furi.h>
|
#include <furi.h>
|
||||||
#include <lib/toolbox/stream/file_stream.h>
|
#include <lib/toolbox/stream/file_stream.h>
|
||||||
|
|
||||||
|
#include <lib/nfc_protocols/nfc_util.h>
|
||||||
|
#include <lib/nfc_protocols/emv.h>
|
||||||
|
#include <lib/nfc_protocols/mifare_common.h>
|
||||||
|
#include <lib/nfc_protocols/mifare_ultralight.h>
|
||||||
|
#include <lib/nfc_protocols/mifare_classic.h>
|
||||||
|
#include <lib/nfc_protocols/mifare_desfire.h>
|
||||||
|
#include <lib/nfc_protocols/nfca.h>
|
||||||
|
|
||||||
|
#include "helpers/nfc_mf_classic_dict.h"
|
||||||
|
#include "helpers/nfc_debug_pcap.h"
|
||||||
|
|
||||||
struct NfcWorker {
|
struct NfcWorker {
|
||||||
FuriThread* thread;
|
FuriThread* thread;
|
||||||
Storage* storage;
|
Storage* storage;
|
||||||
@ -17,6 +28,8 @@ struct NfcWorker {
|
|||||||
void* context;
|
void* context;
|
||||||
|
|
||||||
NfcWorkerState state;
|
NfcWorkerState state;
|
||||||
|
|
||||||
|
NfcDebugPcapWorker* debug_pcap_worker;
|
||||||
};
|
};
|
||||||
|
|
||||||
void nfc_worker_change_state(NfcWorker* nfc_worker, NfcWorkerState state);
|
void nfc_worker_change_state(NfcWorker* nfc_worker, NfcWorkerState state);
|
||||||
|
@ -134,6 +134,10 @@ bool storage_file_close(File* file) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint16_t storage_file_read(File* file, void* buff, uint16_t bytes_to_read) {
|
uint16_t storage_file_read(File* file, void* buff, uint16_t bytes_to_read) {
|
||||||
|
if(bytes_to_read == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
S_FILE_API_PROLOGUE;
|
S_FILE_API_PROLOGUE;
|
||||||
S_API_PROLOGUE;
|
S_API_PROLOGUE;
|
||||||
|
|
||||||
@ -150,6 +154,10 @@ uint16_t storage_file_read(File* file, void* buff, uint16_t bytes_to_read) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint16_t storage_file_write(File* file, const void* buff, uint16_t bytes_to_write) {
|
uint16_t storage_file_write(File* file, const void* buff, uint16_t bytes_to_write) {
|
||||||
|
if(bytes_to_write == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
S_FILE_API_PROLOGUE;
|
S_FILE_API_PROLOGUE;
|
||||||
S_API_PROLOGUE;
|
S_API_PROLOGUE;
|
||||||
|
|
||||||
|
@ -392,6 +392,10 @@ static bool furi_hal_nfc_transparent_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_
|
|||||||
furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_nfc);
|
furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_nfc);
|
||||||
st25r3916ExecuteCommand(ST25R3916_CMD_UNMASK_RECEIVE_DATA);
|
st25r3916ExecuteCommand(ST25R3916_CMD_UNMASK_RECEIVE_DATA);
|
||||||
|
|
||||||
|
if(tx_rx->sniff_tx) {
|
||||||
|
tx_rx->sniff_tx(tx_rx->tx_data, tx_rx->tx_bits, false, tx_rx->sniff_context);
|
||||||
|
}
|
||||||
|
|
||||||
// Manually wait for interrupt
|
// Manually wait for interrupt
|
||||||
furi_hal_gpio_init(&gpio_rfid_pull, GpioModeInput, GpioPullDown, GpioSpeedVeryHigh);
|
furi_hal_gpio_init(&gpio_rfid_pull, GpioModeInput, GpioPullDown, GpioSpeedVeryHigh);
|
||||||
st25r3916ClearAndEnableInterrupts(ST25R3916_IRQ_MASK_RXE);
|
st25r3916ClearAndEnableInterrupts(ST25R3916_IRQ_MASK_RXE);
|
||||||
@ -428,6 +432,10 @@ static bool furi_hal_nfc_transparent_tx_rx(FuriHalNfcTxRxContext* tx_rx, uint16_
|
|||||||
tx_rx->rx_bits = len * 8;
|
tx_rx->rx_bits = len * 8;
|
||||||
memcpy(tx_rx->rx_data, rx, len);
|
memcpy(tx_rx->rx_data, rx, len);
|
||||||
|
|
||||||
|
if(tx_rx->sniff_rx) {
|
||||||
|
tx_rx->sniff_rx(tx_rx->rx_data, tx_rx->rx_bits, false, tx_rx->sniff_context);
|
||||||
|
}
|
||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
} else {
|
} else {
|
||||||
FURI_LOG_E(TAG, "Timeout error");
|
FURI_LOG_E(TAG, "Timeout error");
|
||||||
|
Loading…
Reference in New Issue
Block a user