Loading...
Searching...
No Matches
felica.h
1#pragma once
2
5#include <mbedtls/include/mbedtls/des.h>
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
12#define FELICA_IDM_SIZE (8U)
13#define FELICA_PMM_SIZE (8U)
14#define FELICA_DATA_BLOCK_SIZE (16U)
15
16#define FELICA_CMD_READ_WITHOUT_ENCRYPTION (0x06U)
17#define FELICA_CMD_WRITE_WITHOUT_ENCRYPTION (0x08U)
18
19#define FELICA_SERVICE_RW_ACCESS (0x0009U)
20#define FELICA_SERVICE_RO_ACCESS (0x000BU)
21
22#define FELICA_BLOCKS_TOTAL_COUNT (28U)
23#define FELICA_BLOCK_INDEX_REG (0x0EU)
24#define FELICA_BLOCK_INDEX_RC (0x80U)
25#define FELICA_BLOCK_INDEX_MAC (0x81U)
26#define FELICA_BLOCK_INDEX_ID (0x82U)
27#define FELICA_BLOCK_INDEX_D_ID (0x83U)
28#define FELICA_BLOCK_INDEX_SER_C (0x84U)
29#define FELICA_BLOCK_INDEX_SYS_C (0x85U)
30#define FELICA_BLOCK_INDEX_CKV (0x86U)
31#define FELICA_BLOCK_INDEX_CK (0x87U)
32#define FELICA_BLOCK_INDEX_MC (0x88U)
33#define FELICA_BLOCK_INDEX_WCNT (0x90U)
34#define FELICA_BLOCK_INDEX_MAC_A (0x91U)
35#define FELICA_BLOCK_INDEX_STATE (0x92U)
36#define FELICA_BLOCK_INDEX_CRC_CHECK (0xA0U)
37
38#define FELICA_STANDARD_MAX_BLOCK_COUNT (0xFFU)
39
40#define FELICA_GUARD_TIME_US (20000U)
41#define FELICA_FDT_POLL_FC (10000U)
42#define FELICA_POLL_POLL_MIN_US (1280U)
43
44#define FELICA_FDT_LISTEN_FC (0)
45
46#define FELICA_SYSTEM_CODE_CODE (0xFFFFU)
47#define FELICA_TIME_SLOT_1 (0x00U)
48#define FELICA_TIME_SLOT_2 (0x01U)
49#define FELICA_TIME_SLOT_4 (0x03U)
50#define FELICA_TIME_SLOT_8 (0x07U)
51#define FELICA_TIME_SLOT_16 (0x0FU)
52
53#define FELICA_CMD_LIST_SERVICE_CODE 0x0A
54#define FELICA_CMD_LIST_SERVICE_CODE_RESP 0x0B
55#define FELICA_CMD_REQUEST_SYSTEM_CODE 0x0C
56#define FELICA_CMD_REQUEST_SYSTEM_CODE_RESP 0x0D
57
58#define FELICA_SERVICE_ATTRIBUTE_UNAUTH_READ (0b000001)
59#define FELICA_SERVICE_ATTRIBUTE_READ_ONLY (0b000010)
60#define FELICA_SERVICE_ATTRIBUTE_RANDOM_ACCESS (0b001000)
61#define FELICA_SERVICE_ATTRIBUTE_CYCLIC (0b001100)
62#define FELICA_SERVICE_ATTRIBUTE_PURSE (0b010000)
63#define FELICA_SERVICE_ATTRIBUTE_PURSE_SUBFIELD (0b000110)
64
66typedef enum {
67 FelicaErrorNone,
68 FelicaErrorNotPresent,
69 FelicaErrorColResFailed,
70 FelicaErrorBufferOverflow,
71 FelicaErrorCommunication,
72 FelicaErrorFieldOff,
73 FelicaErrorWrongCrc,
74 FelicaErrorProtocol,
75 FelicaErrorTimeout,
76 FelicaErrorFeatureUnsupported,
77} FelicaError;
78
79typedef enum {
80 FelicaUnknown,
81 FelicaStandard,
82 FelicaLite,
83} FelicaWorkflowType;
84
85typedef struct {
86 uint8_t data[FELICA_DATA_BLOCK_SIZE];
88
90typedef struct {
91 uint8_t data[FELICA_DATA_BLOCK_SIZE];
93
97typedef struct {
98 bool internal : 1;
99 bool external : 1;
101
110
114typedef struct {
115 uint8_t data[FELICA_DATA_BLOCK_SIZE];
117
126
128typedef struct {
129 uint8_t data[FELICA_IDM_SIZE];
130} FelicaIDm;
131
133typedef struct {
134 uint8_t data[FELICA_PMM_SIZE];
135} FelicaPMm;
136
139typedef struct {
140 uint8_t SF1;
141 uint8_t SF2;
142 uint8_t data[FELICA_DATA_BLOCK_SIZE];
144
146typedef struct {
147 FelicaBlock spad[14];
148 FelicaBlock reg;
149 FelicaBlock rc;
150 FelicaBlock mac;
151 FelicaBlock id;
152 FelicaBlock d_id;
153 FelicaBlock ser_c;
154 FelicaBlock sys_c;
155 FelicaBlock ckv;
156 FelicaBlock ck;
157 FelicaBlock mc;
158 FelicaBlock wcnt;
159 FelicaBlock mac_a;
160 FelicaBlock state;
161 FelicaBlock crc_check;
163
165typedef union {
167 uint8_t dump[sizeof(FelicaFileSystem)];
169
170typedef struct {
171 uint16_t code;
172 uint8_t attr;
174
175typedef struct {
176 uint16_t code;
177 uint16_t first_idx;
178 uint16_t last_idx;
179} FelicaArea;
180
181typedef struct {
182 FelicaBlock block;
183 uint16_t service_code;
184 uint8_t block_idx;
186
187typedef struct {
188 uint8_t system_code_idx;
189 uint16_t system_code;
190 SimpleArray* services;
191 SimpleArray* areas;
192 SimpleArray* public_blocks;
194
196typedef struct {
197 FelicaIDm idm;
198 FelicaPMm pmm;
199 uint8_t blocks_total;
200 uint8_t blocks_read;
201 FelicaFSUnion data;
202
203 SimpleArray* systems;
204
205 FelicaWorkflowType workflow_type;
206} FelicaData;
207
208typedef struct FURI_PACKED {
209 uint8_t code;
210 FelicaIDm idm;
211 uint8_t service_num;
212 uint16_t service_code;
213 uint8_t block_count;
215
216typedef struct {
217 uint8_t length;
218 uint8_t response_code;
219 FelicaIDm idm;
220 uint8_t SF1;
221 uint8_t SF2;
223
224#pragma pack(push, 1)
225typedef struct {
226 uint8_t length;
227 uint8_t command;
228 FelicaIDm idm;
230#pragma pack(pop)
231
232typedef struct {
233 uint8_t service_code : 4;
234 uint8_t access_mode : 3;
235 uint8_t length : 1;
236 uint8_t block_number;
238
239typedef struct {
240 uint8_t length;
241 uint8_t response_code;
242 FelicaIDm idm;
243 uint8_t SF1;
244 uint8_t SF2;
245 uint8_t block_count;
246 uint8_t data[];
248
249typedef struct {
251 uint8_t block_count;
252 uint8_t data[];
254
255typedef struct {
257 uint8_t data[];
259
260typedef struct {
262 uint8_t system_count;
263 uint8_t system_code[];
265
267
269
270extern const NfcDeviceBase nfc_device_felica;
271
272FelicaData* felica_alloc(void);
273
274void felica_free(FelicaData* data);
275
276void felica_reset(FelicaData* data);
277
278void felica_copy(FelicaData* data, const FelicaData* other);
279
280bool felica_verify(FelicaData* data, const FuriString* device_type);
281
282bool felica_load(FelicaData* data, FlipperFormat* ff, uint32_t version);
283
284bool felica_save(const FelicaData* data, FlipperFormat* ff);
285
286bool felica_is_equal(const FelicaData* data, const FelicaData* other);
287
288const char* felica_get_device_name(const FelicaData* data, NfcDeviceNameType name_type);
289
290const uint8_t* felica_get_uid(const FelicaData* data, size_t* uid_len);
291
292bool felica_set_uid(FelicaData* data, const uint8_t* uid, size_t uid_len);
293
294FelicaData* felica_get_base_data(const FelicaData* data);
295
296void felica_calculate_session_key(
297 mbedtls_des3_context* ctx,
298 const uint8_t* ck,
299 const uint8_t* rc,
300 uint8_t* out);
301
302bool felica_check_mac(
303 mbedtls_des3_context* ctx,
304 const uint8_t* session_key,
305 const uint8_t* rc,
306 const uint8_t* blocks,
307 const uint8_t block_count,
308 uint8_t* data);
309
310void felica_calculate_mac_read(
311 mbedtls_des3_context* ctx,
312 const uint8_t* session_key,
313 const uint8_t* rc,
314 const uint8_t* blocks,
315 const uint8_t block_count,
316 const uint8_t* data,
317 uint8_t* mac);
318
319void felica_calculate_mac_write(
320 mbedtls_des3_context* ctx,
321 const uint8_t* session_key,
322 const uint8_t* rc,
323 const uint8_t* wcnt,
324 const uint8_t* data,
325 uint8_t* mac);
326
327void felica_write_directory_tree(const FelicaSystem* system, FuriString* str);
328
329void felica_get_workflow_type(FelicaData* data);
330
331void felica_get_ic_name(const FelicaData* data, FuriString* ic_name);
332
333void felica_service_get_attribute_string(const FelicaService* service, FuriString* str);
334
335#ifdef __cplusplus
336}
337#endif
Bit Buffer.
NfcDeviceNameType
Verbosity level of the displayed NFC device name.
Definition nfc_device_base.h:14
Abstract interface definitions for the NFC device system.
This file provides a simple (non-type safe) array for elements with (optional) in-place construction ...
Definition system/js_app/modules/js_gui/icon.c:36
Definition felica.h:175
Struct which controls the process of authentication and can be passed as a parameter to the applicati...
Definition felica.h:104
FelicaAuthenticationStatus auth_status
Authentication status.
Definition felica.h:108
bool skip_auth
By default it is true, so auth is skipped.
Definition felica.h:105
FelicaCardKey card_key
User must fill this field with known card key in order to pass auth.
Definition felica.h:107
Structure used to hold authentication related fields.
Definition felica.h:121
mbedtls_des3_context des_context
Context for mbedtls des functions.
Definition felica.h:122
FelicaAuthenticationContext context
Public auth context provided to upper levels.
Definition felica.h:124
FelicaSessionKey session_key
Calculated session key.
Definition felica.h:123
In Felica there two types of auth.
Definition felica.h:97
Definition felica.h:85
Felica block with status flags indicating last operation with it.
Definition felica.h:139
uint8_t SF1
Status flag 1, equals to 0 when success.
Definition felica.h:140
uint8_t SF2
Status flag 2, equals to 0 when success.
Definition felica.h:141
Definition felica.h:232
Separate type for card key block.
Definition felica.h:90
Definition felica.h:225
Definition felica.h:216
Structure used to store Felica data and additional values about reading.
Definition felica.h:196
Felica filesystem structure.
Definition felica.h:146
Felica ID block.
Definition felica.h:128
Definition felica.h:255
Definition felica.h:249
Felica PMm block.
Definition felica.h:133
Definition felica.h:239
Definition felica.h:181
Definition felica.h:170
Stucture for holding Felica session key which is calculated from rc and ck.
Definition felica.h:114
Definition felica.h:187
Definition flipper_format.c:17
Definition string.c:4
Generic NFC device interface.
Definition nfc_device_base_i.h:142
Definition simple_array.c:5
Union which represents filesystem in junction with plain data dump.
Definition felica.h:165