Skip to content
This repository was archived by the owner on Nov 19, 2024. It is now read-only.

Commit ac57443

Browse files
committed
Refactor Mifare fuzzer to new API
1 parent 66bb02e commit ac57443

File tree

7 files changed

+92
-61
lines changed

7 files changed

+92
-61
lines changed

applications/external/mifare_fuzzer/application.fam

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
App(
2-
appid=".mifare_fuzzer",
2+
appid="mifare_fuzzer",
33
name="Mifare Fuzzer",
44
apptype=FlipperAppType.EXTERNAL,
55
entry_point="mifare_fuzzer_app",

applications/external/mifare_fuzzer/mifare_fuzzer_i.h

-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ struct MifareFuzzerApp {
6868

6969
MifareCard card;
7070
MifareFuzzerAttack attack;
71-
FuriHalNfcDevData nfc_dev_data;
7271
FuriString* app_folder;
7372
FuriString* file_path;
7473
FuriString* uid_str;

applications/external/mifare_fuzzer/mifare_fuzzer_worker.c

+34-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
#include "mifare_fuzzer_worker.h"
32

43
/// @brief mifare_fuzzer_worker_alloc()
@@ -9,6 +8,10 @@ MifareFuzzerWorker* mifare_fuzzer_worker_alloc() {
98
mifare_fuzzer_worker->thread = furi_thread_alloc_ex(
109
"MifareFuzzerWorker", 8192, mifare_fuzzer_worker_task, mifare_fuzzer_worker);
1110
mifare_fuzzer_worker->state = MifareFuzzerWorkerStateStop;
11+
12+
mifare_fuzzer_worker->nfc = nfc_alloc();
13+
mifare_fuzzer_worker->nfc_device = nfc_device_alloc();
14+
1215
return mifare_fuzzer_worker;
1316
}
1417

@@ -17,6 +20,10 @@ MifareFuzzerWorker* mifare_fuzzer_worker_alloc() {
1720
void mifare_fuzzer_worker_free(MifareFuzzerWorker* mifare_fuzzer_worker) {
1821
furi_assert(mifare_fuzzer_worker);
1922
furi_thread_free(mifare_fuzzer_worker->thread);
23+
24+
nfc_free(mifare_fuzzer_worker->nfc);
25+
nfc_device_free(mifare_fuzzer_worker->nfc_device);
26+
2027
free(mifare_fuzzer_worker);
2128
}
2229

@@ -45,14 +52,19 @@ int32_t mifare_fuzzer_worker_task(void* context) {
4552
MifareFuzzerWorker* mifare_fuzzer_worker = context;
4653

4754
if(mifare_fuzzer_worker->state == MifareFuzzerWorkerStateEmulate) {
48-
FuriHalNfcDevData params = mifare_fuzzer_worker->nfc_dev_data;
55+
const Iso14443_3aData* data =
56+
nfc_device_get_data(mifare_fuzzer_worker->nfc_device, NfcProtocolIso14443_3a);
57+
58+
mifare_fuzzer_worker->nfc_listener =
59+
nfc_listener_alloc(mifare_fuzzer_worker->nfc, NfcProtocolIso14443_3a, data);
60+
nfc_listener_start(mifare_fuzzer_worker->nfc_listener, NULL, NULL);
4961

50-
furi_hal_nfc_exit_sleep();
5162
while(mifare_fuzzer_worker->state == MifareFuzzerWorkerStateEmulate) {
52-
furi_hal_nfc_listen(params.uid, params.uid_len, params.atqa, params.sak, false, 500);
5363
furi_delay_ms(50);
5464
}
55-
furi_hal_nfc_sleep();
65+
66+
nfc_listener_stop(mifare_fuzzer_worker->nfc_listener);
67+
nfc_listener_free(mifare_fuzzer_worker->nfc_listener);
5668
}
5769

5870
mifare_fuzzer_worker->state = MifareFuzzerWorkerStateStop;
@@ -70,18 +82,27 @@ bool mifare_fuzzer_worker_is_emulating(MifareFuzzerWorker* mifare_fuzzer_worker)
7082
return false;
7183
}
7284

73-
/// @brief mifare_fuzzer_worker_set_nfc_dev_data()
85+
/// @brief mifare_fuzzer_worker_set_nfc_data()
7486
/// @param mifare_fuzzer_worker
75-
/// @param nfc_dev_data
76-
void mifare_fuzzer_worker_set_nfc_dev_data(
87+
/// @param nfc_data
88+
void mifare_fuzzer_worker_set_nfc_data(
7789
MifareFuzzerWorker* mifare_fuzzer_worker,
78-
FuriHalNfcDevData nfc_dev_data) {
79-
mifare_fuzzer_worker->nfc_dev_data = nfc_dev_data;
90+
Iso14443_3aData nfc_data) {
91+
Iso14443_3aData* nfc_14a_data = iso14443_3a_alloc();
92+
nfc_14a_data->uid_len = nfc_data.uid_len;
93+
memcpy(nfc_14a_data->uid, nfc_data.uid, nfc_data.uid_len);
94+
memcpy(nfc_14a_data->atqa, nfc_data.atqa, ATQA_LEN);
95+
nfc_14a_data->sak = nfc_data.sak;
96+
97+
nfc_device_clear(mifare_fuzzer_worker->nfc_device);
98+
nfc_device_set_data(mifare_fuzzer_worker->nfc_device, NfcProtocolIso14443_3a, nfc_14a_data);
99+
100+
iso14443_3a_free(nfc_14a_data);
80101
}
81102

82-
/// @brief mifare_fuzzer_worker_get_nfc_dev_data()
103+
/// @brief mifare_fuzzer_worker_get_nfc_data()
83104
/// @param mifare_fuzzer_worker
84105
/// @return
85-
FuriHalNfcDevData mifare_fuzzer_worker_get_nfc_dev_data(MifareFuzzerWorker* mifare_fuzzer_worker) {
86-
return mifare_fuzzer_worker->nfc_dev_data;
106+
Iso14443_3aData mifare_fuzzer_worker_get_nfc_data(MifareFuzzerWorker* mifare_fuzzer_worker) {
107+
return mifare_fuzzer_worker->nfc_data;
87108
}

applications/external/mifare_fuzzer/mifare_fuzzer_worker.h

+11-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
#include <furi.h>
33
#include <furi_hal.h>
44

5+
#include <nfc/nfc_device.h>
6+
#include <nfc/nfc_listener.h>
7+
#include <nfc/protocols/iso14443_3a/iso14443_3a.h>
8+
59
typedef enum MifareFuzzerWorkerState {
610
MifareFuzzerWorkerStateEmulate,
711
MifareFuzzerWorkerStateStop,
@@ -13,7 +17,10 @@ typedef enum MifareFuzzerWorkerState {
1317
typedef struct MifareFuzzerWorker {
1418
FuriThread* thread;
1519
MifareFuzzerWorkerState state;
16-
FuriHalNfcDevData nfc_dev_data;
20+
Iso14443_3aData nfc_data;
21+
NfcListener* nfc_listener;
22+
NfcDevice* nfc_device;
23+
Nfc* nfc;
1724
} MifareFuzzerWorker;
1825

1926
// worker
@@ -25,7 +32,7 @@ void mifare_fuzzer_worker_start(MifareFuzzerWorker* mifare_fuzzer_worker);
2532
int32_t mifare_fuzzer_worker_task(void* context);
2633
//
2734
bool mifare_fuzzer_worker_is_emulating(MifareFuzzerWorker* mifare_fuzzer_worker);
28-
void mifare_fuzzer_worker_set_nfc_dev_data(
35+
void mifare_fuzzer_worker_set_nfc_data(
2936
MifareFuzzerWorker* mifare_fuzzer_worker,
30-
FuriHalNfcDevData nfc_dev_data);
31-
FuriHalNfcDevData mifare_fuzzer_worker_get_nfc_dev_data(MifareFuzzerWorker* mifare_fuzzer_worker);
37+
Iso14443_3aData nfc_data);
38+
Iso14443_3aData mifare_fuzzer_worker_get_nfc_data(MifareFuzzerWorker* mifare_fuzzer_worker);

applications/external/mifare_fuzzer/scenes/mifare_fuzzer_scene_emulator.c

+36-34
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,21 @@ void mifare_fuzzer_scene_emulator_on_enter(void* context) {
4141
mifare_fuzzer_emulator_set_ticks_between_cards(
4242
app->emulator_view, emulator->ticks_between_cards);
4343
// init default card data
44-
FuriHalNfcDevData nfc_dev_data;
45-
nfc_dev_data.atqa[0] = 0x00;
46-
nfc_dev_data.atqa[1] = 0x00;
47-
nfc_dev_data.sak = 0x00;
44+
Iso14443_3aData nfc_data;
45+
nfc_data.atqa[0] = 0x00;
46+
nfc_data.atqa[1] = 0x00;
47+
nfc_data.sak = 0x00;
4848
if(app->card == MifareCardUltralight) {
49-
nfc_dev_data.uid_len = 0x07;
49+
nfc_data.uid_len = 0x07;
5050
} else {
51-
nfc_dev_data.uid_len = 0x04;
51+
nfc_data.uid_len = 0x04;
5252
}
53-
for(uint32_t i = 0; i < nfc_dev_data.uid_len; i++) {
54-
nfc_dev_data.uid[i] = 0x00;
53+
for(uint32_t i = 0; i < nfc_data.uid_len; i++) {
54+
nfc_data.uid[i] = 0x00;
5555
}
56-
mifare_fuzzer_emulator_set_nfc_dev_data(app->emulator_view, nfc_dev_data);
56+
57+
mifare_fuzzer_emulator_set_nfc_data(app->emulator_view, nfc_data);
58+
5759
// init other vars
5860
attack_step = 0;
5961

@@ -67,7 +69,7 @@ void mifare_fuzzer_scene_emulator_on_enter(void* context) {
6769
/// @return
6870
bool mifare_fuzzer_scene_emulator_on_event(void* context, SceneManagerEvent event) {
6971
//FURI_LOG_D(TAG, "mifare_fuzzer_scene_emulator_on_event()");
70-
FuriHalNfcDevData nfc_dev_data;
72+
Iso14443_3aData nfc_data;
7173

7274
MifareFuzzerApp* app = context;
7375
MifareFuzzerEmulator* emulator = app->emulator_view;
@@ -84,27 +86,27 @@ bool mifare_fuzzer_scene_emulator_on_event(void* context, SceneManagerEvent even
8486
// Set card type
8587
// TODO: Move somewhere else, I do not like this to be there
8688
if(app->card == MifareCardClassic1k) {
87-
nfc_dev_data.atqa[0] = 0x04;
88-
nfc_dev_data.atqa[1] = 0x00;
89-
nfc_dev_data.sak = 0x08;
90-
nfc_dev_data.uid_len = 0x04;
89+
nfc_data.atqa[0] = 0x04;
90+
nfc_data.atqa[1] = 0x00;
91+
nfc_data.sak = 0x08;
92+
nfc_data.uid_len = 0x04;
9193
} else if(app->card == MifareCardClassic4k) {
92-
nfc_dev_data.atqa[0] = 0x02;
93-
nfc_dev_data.atqa[1] = 0x00;
94-
nfc_dev_data.sak = 0x18;
95-
nfc_dev_data.uid_len = 0x04;
94+
nfc_data.atqa[0] = 0x02;
95+
nfc_data.atqa[1] = 0x00;
96+
nfc_data.sak = 0x18;
97+
nfc_data.uid_len = 0x04;
9698
} else if(app->card == MifareCardUltralight) {
97-
nfc_dev_data.atqa[0] = 0x44;
98-
nfc_dev_data.atqa[1] = 0x00;
99-
nfc_dev_data.sak = 0x00;
100-
nfc_dev_data.uid_len = 0x07;
99+
nfc_data.atqa[0] = 0x44;
100+
nfc_data.atqa[1] = 0x00;
101+
nfc_data.sak = 0x00;
102+
nfc_data.uid_len = 0x07;
101103
}
102104

103105
// Set UIDs
104106
if(app->attack == MifareFuzzerAttackTestValues) {
105107
// Load test UIDs
106-
for(uint8_t i = 0; i < nfc_dev_data.uid_len; i++) {
107-
nfc_dev_data.uid[i] = id_uid_test[attack_step][i];
108+
for(uint8_t i = 0; i < nfc_data.uid_len; i++) {
109+
nfc_data.uid[i] = id_uid_test[attack_step][i];
108110
}
109111
// Next UIDs on next loop
110112
if(attack_step >= 8) {
@@ -121,13 +123,13 @@ bool mifare_fuzzer_scene_emulator_on_event(void* context, SceneManagerEvent even
121123

122124
// TODO: Manufacture-code must be selectable from a list
123125
// use a fixed manufacture-code for now: 0x04 = NXP Semiconductors Germany
124-
nfc_dev_data.uid[0] = 0x04;
125-
for(uint8_t i = 1; i < nfc_dev_data.uid_len; i++) {
126-
nfc_dev_data.uid[i] = (furi_hal_random_get() & 0xFF);
126+
nfc_data.uid[0] = 0x04;
127+
for(uint8_t i = 1; i < nfc_data.uid_len; i++) {
128+
nfc_data.uid[i] = (furi_hal_random_get() & 0xFF);
127129
}
128130
} else {
129-
for(uint8_t i = 0; i < nfc_dev_data.uid_len; i++) {
130-
nfc_dev_data.uid[i] = (furi_hal_random_get() & 0xFF);
131+
for(uint8_t i = 0; i < nfc_data.uid_len; i++) {
132+
nfc_data.uid[i] = (furi_hal_random_get() & 0xFF);
131133
}
132134
}
133135
} else if(app->attack == MifareFuzzerAttackLoadUidsFromFile) {
@@ -155,21 +157,21 @@ bool mifare_fuzzer_scene_emulator_on_event(void* context, SceneManagerEvent even
155157

156158
// parse string to UID
157159
// TODO: a better validation on input?
158-
for(uint8_t i = 0; i < nfc_dev_data.uid_len; i++) {
160+
for(uint8_t i = 0; i < nfc_data.uid_len; i++) {
159161
if(i <= ((furi_string_size(app->uid_str) - 1) / 2)) {
160162
char temp_str[3];
161163
temp_str[0] = furi_string_get_cstr(app->uid_str)[i * 2];
162164
temp_str[1] = furi_string_get_cstr(app->uid_str)[i * 2 + 1];
163165
temp_str[2] = '\0';
164-
nfc_dev_data.uid[i] = (uint8_t)strtol(temp_str, NULL, 16);
166+
nfc_data.uid[i] = (uint8_t)strtol(temp_str, NULL, 16);
165167
} else {
166-
nfc_dev_data.uid[i] = 0x00;
168+
nfc_data.uid[i] = 0x00;
167169
}
168170
}
169171
}
170172

171-
mifare_fuzzer_worker_set_nfc_dev_data(app->worker, nfc_dev_data);
172-
mifare_fuzzer_emulator_set_nfc_dev_data(app->emulator_view, nfc_dev_data);
173+
mifare_fuzzer_worker_set_nfc_data(app->worker, nfc_data);
174+
mifare_fuzzer_emulator_set_nfc_data(app->emulator_view, nfc_data);
173175

174176
// Reset tick_counter
175177
tick_counter = 0;

applications/external/mifare_fuzzer/views/mifare_fuzzer_emulator.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ static void mifare_fuzzer_emulator_draw_callback(Canvas* canvas, void* _model) {
3939
char uid[25];
4040
char uid_char[3];
4141
cpos = 0;
42-
for(uint8_t i = 0; i < model->nfc_dev_data.uid_len; i++) {
42+
for(uint8_t i = 0; i < model->nfc_data.uid_len; i++) {
4343
if(i > 0) {
4444
uid[cpos] = ':';
4545
cpos++;
4646
}
47-
snprintf(uid_char, sizeof(uid_char), "%02X", model->nfc_dev_data.uid[i]);
47+
snprintf(uid_char, sizeof(uid_char), "%02X", model->nfc_data.uid[i]);
4848
uid[cpos] = uid_char[0];
4949
cpos++;
5050
uid[cpos] = uid_char[1];
@@ -258,15 +258,15 @@ void mifare_fuzzer_emulator_set_attack(
258258
/// @brief mifare_fuzzer_emulator_set_nfc_dev_data
259259
/// @param mifare_fuzzer_emulator
260260
/// @param nfc_dev_data
261-
void mifare_fuzzer_emulator_set_nfc_dev_data(
261+
void mifare_fuzzer_emulator_set_nfc_data(
262262
MifareFuzzerEmulator* mifare_fuzzer_emulator,
263-
FuriHalNfcDevData nfc_dev_data) {
263+
Iso14443_3aData nfc_data) {
264264
furi_assert(mifare_fuzzer_emulator);
265265

266266
with_view_model(
267267
mifare_fuzzer_emulator->view,
268268
MifareFuzzerEmulatorModel * model,
269-
{ model->nfc_dev_data = nfc_dev_data; },
269+
{ model->nfc_data = nfc_data; },
270270
true);
271271
}
272272

applications/external/mifare_fuzzer/views/mifare_fuzzer_emulator.h

+5-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#include <gui/view.h>
66
#include <gui/elements.h>
77

8+
#include "lib/nfc/protocols/iso14443_3a/iso14443_3a.h"
9+
810
typedef void (*MifareFuzzerEmulatorCallback)(MifareFuzzerEvent event, void* context);
911

1012
typedef enum MifareCard {
@@ -33,7 +35,7 @@ typedef struct MifareFuzzerEmulatorModel {
3335
const char* mifare_card_dsc;
3436
MifareFuzzerAttack attack;
3537
const char* attack_dsc;
36-
FuriHalNfcDevData nfc_dev_data;
38+
Iso14443_3aData nfc_data;
3739
bool is_attacking;
3840
uint8_t tick_num;
3941
uint8_t ticks_between_cards;
@@ -57,9 +59,9 @@ void mifare_fuzzer_emulator_set_callback(
5759
MifareFuzzerEmulatorCallback callback,
5860
void* context);
5961

60-
void mifare_fuzzer_emulator_set_nfc_dev_data(
62+
void mifare_fuzzer_emulator_set_nfc_data(
6163
MifareFuzzerEmulator* mifare_fuzzer_emulator,
62-
FuriHalNfcDevData nfc_dev_data);
64+
Iso14443_3aData nfc_data);
6365

6466
void mifare_fuzzer_emulator_set_ticks_between_cards(
6567
MifareFuzzerEmulator* mifare_fuzzer_emulator,

0 commit comments

Comments
 (0)