Procházet zdrojové kódy

add mifare fuzzer port to new API

by Sil333033
MX před 2 roky
rodič
revize
fa96adc434

+ 0 - 1
apps_broken_by_last_refactors/mifare_fuzzer/mifare_fuzzer_i.h

@@ -68,7 +68,6 @@ struct MifareFuzzerApp {
 
     MifareCard card;
     MifareFuzzerAttack attack;
-    FuriHalNfcDevData nfc_dev_data;
     FuriString* app_folder;
     FuriString* file_path;
     FuriString* uid_str;

+ 34 - 13
apps_broken_by_last_refactors/mifare_fuzzer/mifare_fuzzer_worker.c

@@ -1,4 +1,3 @@
-
 #include "mifare_fuzzer_worker.h"
 
 /// @brief mifare_fuzzer_worker_alloc()
@@ -9,6 +8,10 @@ MifareFuzzerWorker* mifare_fuzzer_worker_alloc() {
     mifare_fuzzer_worker->thread = furi_thread_alloc_ex(
         "MifareFuzzerWorker", 8192, mifare_fuzzer_worker_task, mifare_fuzzer_worker);
     mifare_fuzzer_worker->state = MifareFuzzerWorkerStateStop;
+
+    mifare_fuzzer_worker->nfc = nfc_alloc();
+    mifare_fuzzer_worker->nfc_device = nfc_device_alloc();
+
     return mifare_fuzzer_worker;
 }
 
@@ -17,6 +20,10 @@ MifareFuzzerWorker* mifare_fuzzer_worker_alloc() {
 void mifare_fuzzer_worker_free(MifareFuzzerWorker* mifare_fuzzer_worker) {
     furi_assert(mifare_fuzzer_worker);
     furi_thread_free(mifare_fuzzer_worker->thread);
+
+    nfc_free(mifare_fuzzer_worker->nfc);
+    nfc_device_free(mifare_fuzzer_worker->nfc_device);
+
     free(mifare_fuzzer_worker);
 }
 
@@ -45,14 +52,19 @@ int32_t mifare_fuzzer_worker_task(void* context) {
     MifareFuzzerWorker* mifare_fuzzer_worker = context;
 
     if(mifare_fuzzer_worker->state == MifareFuzzerWorkerStateEmulate) {
-        FuriHalNfcDevData params = mifare_fuzzer_worker->nfc_dev_data;
+        const Iso14443_3aData* data =
+            nfc_device_get_data(mifare_fuzzer_worker->nfc_device, NfcProtocolIso14443_3a);
+
+        mifare_fuzzer_worker->nfc_listener =
+            nfc_listener_alloc(mifare_fuzzer_worker->nfc, NfcProtocolIso14443_3a, data);
+        nfc_listener_start(mifare_fuzzer_worker->nfc_listener, NULL, NULL);
 
-        furi_hal_nfc_exit_sleep();
         while(mifare_fuzzer_worker->state == MifareFuzzerWorkerStateEmulate) {
-            furi_hal_nfc_listen(params.uid, params.uid_len, params.atqa, params.sak, false, 500);
             furi_delay_ms(50);
         }
-        furi_hal_nfc_sleep();
+
+        nfc_listener_stop(mifare_fuzzer_worker->nfc_listener);
+        nfc_listener_free(mifare_fuzzer_worker->nfc_listener);
     }
 
     mifare_fuzzer_worker->state = MifareFuzzerWorkerStateStop;
@@ -70,18 +82,27 @@ bool mifare_fuzzer_worker_is_emulating(MifareFuzzerWorker* mifare_fuzzer_worker)
     return false;
 }
 
-/// @brief mifare_fuzzer_worker_set_nfc_dev_data()
+/// @brief mifare_fuzzer_worker_set_nfc_data()
 /// @param mifare_fuzzer_worker
-/// @param nfc_dev_data
-void mifare_fuzzer_worker_set_nfc_dev_data(
+/// @param nfc_data
+void mifare_fuzzer_worker_set_nfc_data(
     MifareFuzzerWorker* mifare_fuzzer_worker,
-    FuriHalNfcDevData nfc_dev_data) {
-    mifare_fuzzer_worker->nfc_dev_data = nfc_dev_data;
+    Iso14443_3aData nfc_data) {
+    Iso14443_3aData* nfc_14a_data = iso14443_3a_alloc();
+    nfc_14a_data->uid_len = nfc_data.uid_len;
+    memcpy(nfc_14a_data->uid, nfc_data.uid, nfc_data.uid_len);
+    memcpy(nfc_14a_data->atqa, nfc_data.atqa, ATQA_LEN);
+    nfc_14a_data->sak = nfc_data.sak;
+
+    nfc_device_clear(mifare_fuzzer_worker->nfc_device);
+    nfc_device_set_data(mifare_fuzzer_worker->nfc_device, NfcProtocolIso14443_3a, nfc_14a_data);
+
+    iso14443_3a_free(nfc_14a_data);
 }
 
-/// @brief mifare_fuzzer_worker_get_nfc_dev_data()
+/// @brief mifare_fuzzer_worker_get_nfc_data()
 /// @param mifare_fuzzer_worker
 /// @return
-FuriHalNfcDevData mifare_fuzzer_worker_get_nfc_dev_data(MifareFuzzerWorker* mifare_fuzzer_worker) {
-    return mifare_fuzzer_worker->nfc_dev_data;
+Iso14443_3aData mifare_fuzzer_worker_get_nfc_data(MifareFuzzerWorker* mifare_fuzzer_worker) {
+    return mifare_fuzzer_worker->nfc_data;
 }

+ 11 - 4
apps_broken_by_last_refactors/mifare_fuzzer/mifare_fuzzer_worker.h

@@ -2,6 +2,10 @@
 #include <furi.h>
 #include <furi_hal.h>
 
+#include <nfc/nfc_device.h>
+#include <nfc/nfc_listener.h>
+#include <nfc/protocols/iso14443_3a/iso14443_3a.h>
+
 typedef enum MifareFuzzerWorkerState {
     MifareFuzzerWorkerStateEmulate,
     MifareFuzzerWorkerStateStop,
@@ -13,7 +17,10 @@ typedef enum MifareFuzzerWorkerState {
 typedef struct MifareFuzzerWorker {
     FuriThread* thread;
     MifareFuzzerWorkerState state;
-    FuriHalNfcDevData nfc_dev_data;
+    Iso14443_3aData nfc_data;
+    NfcListener* nfc_listener;
+    NfcDevice* nfc_device;
+    Nfc* nfc;
 } MifareFuzzerWorker;
 
 // worker
@@ -25,7 +32,7 @@ void mifare_fuzzer_worker_start(MifareFuzzerWorker* mifare_fuzzer_worker);
 int32_t mifare_fuzzer_worker_task(void* context);
 //
 bool mifare_fuzzer_worker_is_emulating(MifareFuzzerWorker* mifare_fuzzer_worker);
-void mifare_fuzzer_worker_set_nfc_dev_data(
+void mifare_fuzzer_worker_set_nfc_data(
     MifareFuzzerWorker* mifare_fuzzer_worker,
-    FuriHalNfcDevData nfc_dev_data);
-FuriHalNfcDevData mifare_fuzzer_worker_get_nfc_dev_data(MifareFuzzerWorker* mifare_fuzzer_worker);
+    Iso14443_3aData nfc_data);
+Iso14443_3aData mifare_fuzzer_worker_get_nfc_data(MifareFuzzerWorker* mifare_fuzzer_worker);

+ 36 - 34
apps_broken_by_last_refactors/mifare_fuzzer/scenes/mifare_fuzzer_scene_emulator.c

@@ -41,19 +41,21 @@ void mifare_fuzzer_scene_emulator_on_enter(void* context) {
     mifare_fuzzer_emulator_set_ticks_between_cards(
         app->emulator_view, emulator->ticks_between_cards);
     // init default card data
-    FuriHalNfcDevData nfc_dev_data;
-    nfc_dev_data.atqa[0] = 0x00;
-    nfc_dev_data.atqa[1] = 0x00;
-    nfc_dev_data.sak = 0x00;
+    Iso14443_3aData nfc_data;
+    nfc_data.atqa[0] = 0x00;
+    nfc_data.atqa[1] = 0x00;
+    nfc_data.sak = 0x00;
     if(app->card == MifareCardUltralight) {
-        nfc_dev_data.uid_len = 0x07;
+        nfc_data.uid_len = 0x07;
     } else {
-        nfc_dev_data.uid_len = 0x04;
+        nfc_data.uid_len = 0x04;
     }
-    for(uint32_t i = 0; i < nfc_dev_data.uid_len; i++) {
-        nfc_dev_data.uid[i] = 0x00;
+    for(uint32_t i = 0; i < nfc_data.uid_len; i++) {
+        nfc_data.uid[i] = 0x00;
     }
-    mifare_fuzzer_emulator_set_nfc_dev_data(app->emulator_view, nfc_dev_data);
+
+    mifare_fuzzer_emulator_set_nfc_data(app->emulator_view, nfc_data);
+
     // init other vars
     attack_step = 0;
 
@@ -67,7 +69,7 @@ void mifare_fuzzer_scene_emulator_on_enter(void* context) {
 /// @return
 bool mifare_fuzzer_scene_emulator_on_event(void* context, SceneManagerEvent event) {
     //FURI_LOG_D(TAG, "mifare_fuzzer_scene_emulator_on_event()");
-    FuriHalNfcDevData nfc_dev_data;
+    Iso14443_3aData nfc_data;
 
     MifareFuzzerApp* app = context;
     MifareFuzzerEmulator* emulator = app->emulator_view;
@@ -84,27 +86,27 @@ bool mifare_fuzzer_scene_emulator_on_event(void* context, SceneManagerEvent even
             // Set card type
             // TODO: Move somewhere else, I do not like this to be there
             if(app->card == MifareCardClassic1k) {
-                nfc_dev_data.atqa[0] = 0x04;
-                nfc_dev_data.atqa[1] = 0x00;
-                nfc_dev_data.sak = 0x08;
-                nfc_dev_data.uid_len = 0x04;
+                nfc_data.atqa[0] = 0x04;
+                nfc_data.atqa[1] = 0x00;
+                nfc_data.sak = 0x08;
+                nfc_data.uid_len = 0x04;
             } else if(app->card == MifareCardClassic4k) {
-                nfc_dev_data.atqa[0] = 0x02;
-                nfc_dev_data.atqa[1] = 0x00;
-                nfc_dev_data.sak = 0x18;
-                nfc_dev_data.uid_len = 0x04;
+                nfc_data.atqa[0] = 0x02;
+                nfc_data.atqa[1] = 0x00;
+                nfc_data.sak = 0x18;
+                nfc_data.uid_len = 0x04;
             } else if(app->card == MifareCardUltralight) {
-                nfc_dev_data.atqa[0] = 0x44;
-                nfc_dev_data.atqa[1] = 0x00;
-                nfc_dev_data.sak = 0x00;
-                nfc_dev_data.uid_len = 0x07;
+                nfc_data.atqa[0] = 0x44;
+                nfc_data.atqa[1] = 0x00;
+                nfc_data.sak = 0x00;
+                nfc_data.uid_len = 0x07;
             }
 
             // Set UIDs
             if(app->attack == MifareFuzzerAttackTestValues) {
                 // Load test UIDs
-                for(uint8_t i = 0; i < nfc_dev_data.uid_len; i++) {
-                    nfc_dev_data.uid[i] = id_uid_test[attack_step][i];
+                for(uint8_t i = 0; i < nfc_data.uid_len; i++) {
+                    nfc_data.uid[i] = id_uid_test[attack_step][i];
                 }
                 // Next UIDs on next loop
                 if(attack_step >= 8) {
@@ -121,13 +123,13 @@ bool mifare_fuzzer_scene_emulator_on_event(void* context, SceneManagerEvent even
 
                     // TODO: Manufacture-code must be selectable from a list
                     // use a fixed manufacture-code for now: 0x04 = NXP Semiconductors Germany
-                    nfc_dev_data.uid[0] = 0x04;
-                    for(uint8_t i = 1; i < nfc_dev_data.uid_len; i++) {
-                        nfc_dev_data.uid[i] = (furi_hal_random_get() & 0xFF);
+                    nfc_data.uid[0] = 0x04;
+                    for(uint8_t i = 1; i < nfc_data.uid_len; i++) {
+                        nfc_data.uid[i] = (furi_hal_random_get() & 0xFF);
                     }
                 } else {
-                    for(uint8_t i = 0; i < nfc_dev_data.uid_len; i++) {
-                        nfc_dev_data.uid[i] = (furi_hal_random_get() & 0xFF);
+                    for(uint8_t i = 0; i < nfc_data.uid_len; i++) {
+                        nfc_data.uid[i] = (furi_hal_random_get() & 0xFF);
                     }
                 }
             } else if(app->attack == MifareFuzzerAttackLoadUidsFromFile) {
@@ -155,21 +157,21 @@ bool mifare_fuzzer_scene_emulator_on_event(void* context, SceneManagerEvent even
 
                 // parse string to UID
                 // TODO: a better validation on input?
-                for(uint8_t i = 0; i < nfc_dev_data.uid_len; i++) {
+                for(uint8_t i = 0; i < nfc_data.uid_len; i++) {
                     if(i <= ((furi_string_size(app->uid_str) - 1) / 2)) {
                         char temp_str[3];
                         temp_str[0] = furi_string_get_cstr(app->uid_str)[i * 2];
                         temp_str[1] = furi_string_get_cstr(app->uid_str)[i * 2 + 1];
                         temp_str[2] = '\0';
-                        nfc_dev_data.uid[i] = (uint8_t)strtol(temp_str, NULL, 16);
+                        nfc_data.uid[i] = (uint8_t)strtol(temp_str, NULL, 16);
                     } else {
-                        nfc_dev_data.uid[i] = 0x00;
+                        nfc_data.uid[i] = 0x00;
                     }
                 }
             }
 
-            mifare_fuzzer_worker_set_nfc_dev_data(app->worker, nfc_dev_data);
-            mifare_fuzzer_emulator_set_nfc_dev_data(app->emulator_view, nfc_dev_data);
+            mifare_fuzzer_worker_set_nfc_data(app->worker, nfc_data);
+            mifare_fuzzer_emulator_set_nfc_data(app->emulator_view, nfc_data);
 
             // Reset tick_counter
             tick_counter = 0;

+ 5 - 5
apps_broken_by_last_refactors/mifare_fuzzer/views/mifare_fuzzer_emulator.c

@@ -39,12 +39,12 @@ static void mifare_fuzzer_emulator_draw_callback(Canvas* canvas, void* _model) {
     char uid[25];
     char uid_char[3];
     cpos = 0;
-    for(uint8_t i = 0; i < model->nfc_dev_data.uid_len; i++) {
+    for(uint8_t i = 0; i < model->nfc_data.uid_len; i++) {
         if(i > 0) {
             uid[cpos] = ':';
             cpos++;
         }
-        snprintf(uid_char, sizeof(uid_char), "%02X", model->nfc_dev_data.uid[i]);
+        snprintf(uid_char, sizeof(uid_char), "%02X", model->nfc_data.uid[i]);
         uid[cpos] = uid_char[0];
         cpos++;
         uid[cpos] = uid_char[1];
@@ -258,15 +258,15 @@ void mifare_fuzzer_emulator_set_attack(
 /// @brief mifare_fuzzer_emulator_set_nfc_dev_data
 /// @param mifare_fuzzer_emulator
 /// @param nfc_dev_data
-void mifare_fuzzer_emulator_set_nfc_dev_data(
+void mifare_fuzzer_emulator_set_nfc_data(
     MifareFuzzerEmulator* mifare_fuzzer_emulator,
-    FuriHalNfcDevData nfc_dev_data) {
+    Iso14443_3aData nfc_data) {
     furi_assert(mifare_fuzzer_emulator);
 
     with_view_model(
         mifare_fuzzer_emulator->view,
         MifareFuzzerEmulatorModel * model,
-        { model->nfc_dev_data = nfc_dev_data; },
+        { model->nfc_data = nfc_data; },
         true);
 }
 

+ 5 - 3
apps_broken_by_last_refactors/mifare_fuzzer/views/mifare_fuzzer_emulator.h

@@ -5,6 +5,8 @@
 #include <gui/view.h>
 #include <gui/elements.h>
 
+#include "lib/nfc/protocols/iso14443_3a/iso14443_3a.h"
+
 typedef void (*MifareFuzzerEmulatorCallback)(MifareFuzzerEvent event, void* context);
 
 typedef enum MifareCard {
@@ -33,7 +35,7 @@ typedef struct MifareFuzzerEmulatorModel {
     const char* mifare_card_dsc;
     MifareFuzzerAttack attack;
     const char* attack_dsc;
-    FuriHalNfcDevData nfc_dev_data;
+    Iso14443_3aData nfc_data;
     bool is_attacking;
     uint8_t tick_num;
     uint8_t ticks_between_cards;
@@ -57,9 +59,9 @@ void mifare_fuzzer_emulator_set_callback(
     MifareFuzzerEmulatorCallback callback,
     void* context);
 
-void mifare_fuzzer_emulator_set_nfc_dev_data(
+void mifare_fuzzer_emulator_set_nfc_data(
     MifareFuzzerEmulator* mifare_fuzzer_emulator,
-    FuriHalNfcDevData nfc_dev_data);
+    Iso14443_3aData nfc_data);
 
 void mifare_fuzzer_emulator_set_ticks_between_cards(
     MifareFuzzerEmulator* mifare_fuzzer_emulator,