Skip to content

Commit 11d98ac

Browse files
committed
Move apps from flipperzero firmware into separate repository
0 parents  commit 11d98ac

40 files changed

+2545
-0
lines changed

application.fam

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
App(
2+
appid="nfc_magic",
3+
name="Nfc Magic",
4+
apptype=FlipperAppType.EXTERNAL,
5+
targets=["f7"],
6+
entry_point="nfc_magic_app",
7+
requires=[
8+
"storage",
9+
"gui",
10+
],
11+
stack_size=4 * 1024,
12+
order=30,
13+
fap_icon="../../../assets/icons/Archive/125_10px.png",
14+
fap_category="NFC",
15+
fap_private_libs=[
16+
Lib(
17+
name="magic",
18+
),
19+
],
20+
fap_icon_assets="assets",
21+
)

assets/DolphinCommon_56x48.png

1.38 KB
Loading

assets/DolphinNice_96x59.png

2.4 KB
Loading

assets/Loading_24.png

3.56 KB
Loading

assets/NFC_manual_60x50.png

3.71 KB
Loading

lib/magic/classic_gen1.c

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
#include "classic_gen1.h"
2+
3+
#include <furi_hal_nfc.h>
4+
5+
#define TAG "Magic"
6+
7+
#define MAGIC_CMD_WUPA (0x40)
8+
#define MAGIC_CMD_ACCESS (0x43)
9+
10+
#define MAGIC_MIFARE_READ_CMD (0x30)
11+
#define MAGIC_MIFARE_WRITE_CMD (0xA0)
12+
13+
#define MAGIC_ACK (0x0A)
14+
15+
#define MAGIC_BUFFER_SIZE (32)
16+
17+
bool magic_gen1_wupa() {
18+
bool magic_activated = false;
19+
uint8_t tx_data[MAGIC_BUFFER_SIZE] = {};
20+
uint8_t rx_data[MAGIC_BUFFER_SIZE] = {};
21+
uint16_t rx_len = 0;
22+
FuriHalNfcReturn ret = 0;
23+
24+
do {
25+
// Start communication
26+
tx_data[0] = MAGIC_CMD_WUPA;
27+
ret = furi_hal_nfc_ll_txrx_bits(
28+
tx_data,
29+
7,
30+
rx_data,
31+
sizeof(rx_data),
32+
&rx_len,
33+
FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_TX_MANUAL | FURI_HAL_NFC_LL_TXRX_FLAGS_AGC_ON |
34+
FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_RX_KEEP,
35+
furi_hal_nfc_ll_ms2fc(20));
36+
if(ret != FuriHalNfcReturnIncompleteByte) break;
37+
if(rx_len != 4) break;
38+
if(rx_data[0] != MAGIC_ACK) break;
39+
magic_activated = true;
40+
} while(false);
41+
42+
return magic_activated;
43+
}
44+
45+
bool magic_gen1_data_access_cmd() {
46+
bool write_cmd_success = false;
47+
uint8_t tx_data[MAGIC_BUFFER_SIZE] = {};
48+
uint8_t rx_data[MAGIC_BUFFER_SIZE] = {};
49+
uint16_t rx_len = 0;
50+
FuriHalNfcReturn ret = 0;
51+
52+
do {
53+
tx_data[0] = MAGIC_CMD_ACCESS;
54+
ret = furi_hal_nfc_ll_txrx_bits(
55+
tx_data,
56+
8,
57+
rx_data,
58+
sizeof(rx_data),
59+
&rx_len,
60+
FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_TX_MANUAL | FURI_HAL_NFC_LL_TXRX_FLAGS_AGC_ON |
61+
FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_RX_KEEP,
62+
furi_hal_nfc_ll_ms2fc(20));
63+
if(ret != FuriHalNfcReturnIncompleteByte) break;
64+
if(rx_len != 4) break;
65+
if(rx_data[0] != MAGIC_ACK) break;
66+
67+
write_cmd_success = true;
68+
} while(false);
69+
70+
return write_cmd_success;
71+
}
72+
73+
bool magic_gen1_read_block(uint8_t block_num, MfClassicBlock* data) {
74+
furi_assert(data);
75+
76+
bool read_success = false;
77+
78+
uint8_t tx_data[MAGIC_BUFFER_SIZE] = {};
79+
uint8_t rx_data[MAGIC_BUFFER_SIZE] = {};
80+
uint16_t rx_len = 0;
81+
FuriHalNfcReturn ret = 0;
82+
83+
do {
84+
tx_data[0] = MAGIC_MIFARE_READ_CMD;
85+
tx_data[1] = block_num;
86+
ret = furi_hal_nfc_ll_txrx_bits(
87+
tx_data,
88+
2 * 8,
89+
rx_data,
90+
sizeof(rx_data),
91+
&rx_len,
92+
FURI_HAL_NFC_LL_TXRX_FLAGS_AGC_ON,
93+
furi_hal_nfc_ll_ms2fc(20));
94+
95+
if(ret != FuriHalNfcReturnOk) break;
96+
if(rx_len != 16 * 8) break;
97+
memcpy(data->value, rx_data, sizeof(data->value));
98+
read_success = true;
99+
} while(false);
100+
101+
return read_success;
102+
}
103+
104+
bool magic_gen1_write_blk(uint8_t block_num, MfClassicBlock* data) {
105+
furi_assert(data);
106+
107+
bool write_success = false;
108+
uint8_t tx_data[MAGIC_BUFFER_SIZE] = {};
109+
uint8_t rx_data[MAGIC_BUFFER_SIZE] = {};
110+
uint16_t rx_len = 0;
111+
FuriHalNfcReturn ret = 0;
112+
113+
do {
114+
tx_data[0] = MAGIC_MIFARE_WRITE_CMD;
115+
tx_data[1] = block_num;
116+
ret = furi_hal_nfc_ll_txrx_bits(
117+
tx_data,
118+
2 * 8,
119+
rx_data,
120+
sizeof(rx_data),
121+
&rx_len,
122+
FURI_HAL_NFC_LL_TXRX_FLAGS_AGC_ON | FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_RX_KEEP,
123+
furi_hal_nfc_ll_ms2fc(20));
124+
if(ret != FuriHalNfcReturnIncompleteByte) break;
125+
if(rx_len != 4) break;
126+
if(rx_data[0] != MAGIC_ACK) break;
127+
128+
memcpy(tx_data, data->value, sizeof(data->value));
129+
ret = furi_hal_nfc_ll_txrx_bits(
130+
tx_data,
131+
16 * 8,
132+
rx_data,
133+
sizeof(rx_data),
134+
&rx_len,
135+
FURI_HAL_NFC_LL_TXRX_FLAGS_AGC_ON | FURI_HAL_NFC_LL_TXRX_FLAGS_CRC_RX_KEEP,
136+
furi_hal_nfc_ll_ms2fc(20));
137+
if(ret != FuriHalNfcReturnIncompleteByte) break;
138+
if(rx_len != 4) break;
139+
if(rx_data[0] != MAGIC_ACK) break;
140+
141+
write_success = true;
142+
} while(false);
143+
144+
return write_success;
145+
}

lib/magic/classic_gen1.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#pragma once
2+
3+
#include <lib/nfc/protocols/mifare_classic.h>
4+
5+
bool magic_gen1_wupa();
6+
7+
bool magic_gen1_read_block(uint8_t block_num, MfClassicBlock* data);
8+
9+
bool magic_gen1_data_access_cmd();
10+
11+
bool magic_gen1_write_blk(uint8_t block_num, MfClassicBlock* data);

lib/magic/common.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include "common.h"
2+
3+
#include <furi_hal_nfc.h>
4+
5+
#define REQA (0x26)
6+
#define CL1_PREFIX (0x93)
7+
#define SELECT (0x70)
8+
9+
#define MAGIC_BUFFER_SIZE (32)
10+
11+
bool magic_activate() {
12+
FuriHalNfcReturn ret = 0;
13+
14+
// Setup nfc poller
15+
furi_hal_nfc_exit_sleep();
16+
furi_hal_nfc_ll_txrx_on();
17+
furi_hal_nfc_ll_poll();
18+
ret = furi_hal_nfc_ll_set_mode(
19+
FuriHalNfcModePollNfca, FuriHalNfcBitrate106, FuriHalNfcBitrate106);
20+
if(ret != FuriHalNfcReturnOk) return false;
21+
22+
furi_hal_nfc_ll_set_fdt_listen(FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_POLLER);
23+
furi_hal_nfc_ll_set_fdt_poll(FURI_HAL_NFC_LL_FDT_POLL_NFCA_POLLER);
24+
furi_hal_nfc_ll_set_error_handling(FuriHalNfcErrorHandlingNfc);
25+
furi_hal_nfc_ll_set_guard_time(FURI_HAL_NFC_LL_GT_NFCA);
26+
27+
return true;
28+
}
29+
30+
void magic_deactivate() {
31+
furi_hal_nfc_ll_txrx_off();
32+
furi_hal_nfc_sleep();
33+
}

lib/magic/common.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
3+
#include <stdint.h>
4+
#include <stdbool.h>
5+
6+
typedef enum {
7+
MagicTypeClassicGen1,
8+
MagicTypeClassicDirectWrite,
9+
MagicTypeClassicAPDU,
10+
MagicTypeUltralightGen1,
11+
MagicTypeUltralightDirectWrite,
12+
MagicTypeUltralightC_Gen1,
13+
MagicTypeUltralightC_DirectWrite,
14+
MagicTypeGen4,
15+
} MagicType;
16+
17+
bool magic_activate();
18+
19+
void magic_deactivate();

0 commit comments

Comments
 (0)