|
@@ -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;
|