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_SYSTEM_NODE_CODE (0xFFFFU)
23
26#define FELICA_KEY_VERSION_UNKNOWN (0xFFFFU)
27#define FELICA_AREA_END_CODE_UNKNOWN (0xFFFFU)
28
29#define FELICA_BLOCKS_TOTAL_COUNT (28U)
30#define FELICA_BLOCK_INDEX_REG (0x0EU)
31#define FELICA_BLOCK_INDEX_RC (0x80U)
32#define FELICA_BLOCK_INDEX_MAC (0x81U)
33#define FELICA_BLOCK_INDEX_ID (0x82U)
34#define FELICA_BLOCK_INDEX_D_ID (0x83U)
35#define FELICA_BLOCK_INDEX_SER_C (0x84U)
36#define FELICA_BLOCK_INDEX_SYS_C (0x85U)
37#define FELICA_BLOCK_INDEX_CKV (0x86U)
38#define FELICA_BLOCK_INDEX_CK (0x87U)
39#define FELICA_BLOCK_INDEX_MC (0x88U)
40#define FELICA_BLOCK_INDEX_WCNT (0x90U)
41#define FELICA_BLOCK_INDEX_MAC_A (0x91U)
42#define FELICA_BLOCK_INDEX_STATE (0x92U)
43#define FELICA_BLOCK_INDEX_CRC_CHECK (0xA0U)
44
45#define FELICA_STANDARD_MAX_BLOCK_COUNT (0xFFU)
46
47#define FELICA_GUARD_TIME_US (20000U)
48#define FELICA_FDT_POLL_FC (10000U)
49#define FELICA_POLL_POLL_MIN_US (1280U)
50
51#define FELICA_FDT_LISTEN_FC (0)
52
53#define FELICA_SYSTEM_CODE_CODE (0xFFFFU)
54#define FELICA_TIME_SLOT_1 (0x00U)
55#define FELICA_TIME_SLOT_2 (0x01U)
56#define FELICA_TIME_SLOT_4 (0x03U)
57#define FELICA_TIME_SLOT_8 (0x07U)
58#define FELICA_TIME_SLOT_16 (0x0FU)
59
60#define FELICA_CMD_REQUEST_SERVICE 0x02
61#define FELICA_CMD_REQUEST_SERVICE_RESP 0x03
62#define FELICA_CMD_REQUEST_RESPONSE 0x04
63#define FELICA_CMD_REQUEST_RESPONSE_RESP 0x05
64#define FELICA_CMD_LIST_SERVICE_CODE 0x0A
65#define FELICA_CMD_LIST_SERVICE_CODE_RESP 0x0B
66#define FELICA_CMD_REQUEST_SYSTEM_CODE 0x0C
67#define FELICA_CMD_REQUEST_SYSTEM_CODE_RESP 0x0D
68
69#define FELICA_SERVICE_ATTRIBUTE_UNAUTH_READ (0b000001)
70#define FELICA_SERVICE_ATTRIBUTE_READ_ONLY (0b000010)
71#define FELICA_SERVICE_ATTRIBUTE_RANDOM_ACCESS (0b001000)
72#define FELICA_SERVICE_ATTRIBUTE_CYCLIC (0b001100)
73#define FELICA_SERVICE_ATTRIBUTE_PURSE (0b010000)
74#define FELICA_SERVICE_ATTRIBUTE_PURSE_SUBFIELD (0b000110)
75
76#define FELICA_SF1_SUCCESS (0x00U)
77
78#define FELICA_SF2_SUCCESS (0x00U)
79#define FELICA_SF2_WARNING_REWRITE_LIMIT (0x71U)
80#define FELICA_SF2_ERROR_SERVICE_COUNT (0xA1U)
81#define FELICA_SF2_ERROR_BLOCK_COUNT (0xA2U)
82#define FELICA_SF2_ERROR_BLOCK_LIST_SERVICE_ORDER (0xA3U)
83#define FELICA_SF2_ERROR_SERVICE_CODE (0xA6U)
84#define FELICA_SF2_ERROR_BLOCK_LIST_ACCESS_MODE (0xA7U)
85#define FELICA_SF2_ERROR_BLOCK_NUMBER (0xA8U)
86#define FELICA_SF2_ERROR_MAC_BLOCKS_MIXED (0xB0U)
87#define FELICA_SF2_ERROR_AUTHENTICATION_REQUIRED (0xB1U)
88#define FELICA_SF2_ERROR_RC_MAC_WCNT (0xB2U)
89
91typedef enum {
92 FelicaErrorNone,
93 FelicaErrorNotPresent,
94 FelicaErrorColResFailed,
95 FelicaErrorBufferOverflow,
96 FelicaErrorCommunication,
97 FelicaErrorFieldOff,
98 FelicaErrorWrongCrc,
99 FelicaErrorProtocol,
100 FelicaErrorTimeout,
101 FelicaErrorFeatureUnsupported,
102 FelicaErrorIgnore,
103} FelicaError;
104
105typedef enum {
106 FelicaUnknown,
107 FelicaStandard,
108 FelicaLite,
109} FelicaWorkflowType;
110
111typedef struct {
112 uint8_t data[FELICA_DATA_BLOCK_SIZE];
114
116typedef struct {
117 uint8_t data[FELICA_DATA_BLOCK_SIZE];
119
123typedef struct {
124 bool internal : 1;
125 bool external : 1;
127
136
140typedef struct {
141 uint8_t data[FELICA_DATA_BLOCK_SIZE];
143
152
154typedef struct {
155 uint8_t data[FELICA_IDM_SIZE];
156} FelicaIDm;
157
159typedef struct {
160 uint8_t data[FELICA_PMM_SIZE];
161} FelicaPMm;
162
165typedef struct {
166 uint8_t SF1;
167 uint8_t SF2;
168 uint8_t data[FELICA_DATA_BLOCK_SIZE];
170
172typedef struct {
173 FelicaBlock spad[14];
174 FelicaBlock reg;
175 FelicaBlock rc;
176 FelicaBlock mac;
177 FelicaBlock id;
178 FelicaBlock d_id;
179 FelicaBlock ser_c;
180 FelicaBlock sys_c;
181 FelicaBlock ckv;
182 FelicaBlock ck;
183 FelicaBlock mc;
184 FelicaBlock wcnt;
185 FelicaBlock mac_a;
186 FelicaBlock state;
187 FelicaBlock crc_check;
189
191typedef union {
193 uint8_t dump[sizeof(FelicaFileSystem)];
195
196typedef struct {
197 uint16_t code;
198 uint8_t attr;
199 uint16_t key_version;
201
202typedef struct {
203 uint16_t code;
204 uint16_t end_code;
205 uint16_t first_idx;
206 uint16_t last_idx;
207 uint16_t key_version;
208} FelicaArea;
209
210typedef struct {
211 FelicaBlock block;
212 uint16_t service_code;
213 uint8_t block_idx;
215
216typedef struct {
217 uint8_t system_code_idx;
218 uint16_t system_code;
219 uint16_t key_version;
220 SimpleArray* services;
221 SimpleArray* areas;
222 SimpleArray* public_blocks;
224
226typedef struct {
227 FelicaIDm idm;
228 FelicaPMm pmm;
229 uint8_t blocks_total;
230 uint8_t blocks_read;
231 FelicaFSUnion data;
232
233 SimpleArray* systems;
234
235 FelicaWorkflowType workflow_type;
236} FelicaData;
237
238typedef struct FURI_PACKED {
239 uint8_t code;
240 FelicaIDm idm;
241 uint8_t service_num;
242 uint16_t service_code;
243 uint8_t block_count;
245
246typedef struct {
247 uint8_t length;
248 uint8_t response_code;
249 FelicaIDm idm;
250 uint8_t SF1;
251 uint8_t SF2;
253
254#pragma pack(push, 1)
255typedef struct {
256 uint8_t length;
257 uint8_t command;
258 FelicaIDm idm;
260#pragma pack(pop)
261
262typedef struct {
263 uint8_t service_code : 4;
264 uint8_t access_mode : 3;
265 uint8_t length : 1;
266 uint8_t block_number;
268
269typedef struct {
270 uint8_t length;
271 uint8_t response_code;
272 FelicaIDm idm;
273 uint8_t SF1;
274 uint8_t SF2;
275 uint8_t block_count;
276 uint8_t data[];
278
279typedef struct {
281 uint8_t block_count;
282 uint8_t data[];
284
285typedef struct {
287 uint8_t data[];
289
290typedef struct {
292 uint8_t system_count;
293 uint8_t system_code[];
295
297
299
300extern const NfcDeviceBase nfc_device_felica;
301
302FelicaData* felica_alloc(void);
303
304void felica_free(FelicaData* data);
305
306void felica_reset(FelicaData* data);
307
308void felica_copy(FelicaData* data, const FelicaData* other);
309
310bool felica_verify(FelicaData* data, const FuriString* device_type);
311
312bool felica_load(FelicaData* data, FlipperFormat* ff, uint32_t version);
313
314bool felica_save(const FelicaData* data, FlipperFormat* ff);
315
316bool felica_is_equal(const FelicaData* data, const FelicaData* other);
317
318const char* felica_get_device_name(const FelicaData* data, NfcDeviceNameType name_type);
319
320const uint8_t* felica_get_uid(const FelicaData* data, size_t* uid_len);
321
322bool felica_set_uid(FelicaData* data, const uint8_t* uid, size_t uid_len);
323
324FelicaData* felica_get_base_data(const FelicaData* data);
325
326void felica_calculate_session_key(
327 mbedtls_des3_context* ctx,
328 const uint8_t* ck,
329 const uint8_t* rc,
330 uint8_t* out);
331
332bool felica_check_mac(
333 mbedtls_des3_context* ctx,
334 const uint8_t* session_key,
335 const uint8_t* rc,
336 const uint8_t* blocks,
337 const uint8_t block_count,
338 uint8_t* data);
339
340void felica_calculate_mac_read(
341 mbedtls_des3_context* ctx,
342 const uint8_t* session_key,
343 const uint8_t* rc,
344 const uint8_t* blocks,
345 const uint8_t block_count,
346 const uint8_t* data,
347 uint8_t* mac);
348
349void felica_calculate_mac_write(
350 mbedtls_des3_context* ctx,
351 const uint8_t* session_key,
352 const uint8_t* rc,
353 const uint8_t* wcnt,
354 const uint8_t* data,
355 uint8_t* mac);
356
357void felica_write_directory_tree(const FelicaSystem* system, FuriString* str);
358
359void felica_get_workflow_type(FelicaData* data);
360
361void felica_get_ic_name(const FelicaData* data, FuriString* ic_name);
362
363void felica_service_get_attribute_string(const FelicaService* service, FuriString* str);
364
365#ifdef __cplusplus
366}
367#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:202
Struct which controls the process of authentication and can be passed as a parameter to the applicati...
Definition felica.h:130
FelicaAuthenticationStatus auth_status
Authentication status.
Definition felica.h:134
bool skip_auth
By default it is true, so auth is skipped.
Definition felica.h:131
FelicaCardKey card_key
User must fill this field with known card key in order to pass auth.
Definition felica.h:133
Structure used to hold authentication related fields.
Definition felica.h:147
mbedtls_des3_context des_context
Context for mbedtls des functions.
Definition felica.h:148
FelicaAuthenticationContext context
Public auth context provided to upper levels.
Definition felica.h:150
FelicaSessionKey session_key
Calculated session key.
Definition felica.h:149
In Felica there two types of auth.
Definition felica.h:123
Definition felica.h:111
Felica block with status flags indicating last operation with it.
Definition felica.h:165
uint8_t SF1
Status flag 1, equals to 0 when success.
Definition felica.h:166
uint8_t SF2
Status flag 2, equals to 0 when success.
Definition felica.h:167
Definition felica.h:262
Separate type for card key block.
Definition felica.h:116
Definition felica.h:255
Definition felica.h:246
Structure used to store Felica data and additional values about reading.
Definition felica.h:226
Felica filesystem structure.
Definition felica.h:172
Felica ID block.
Definition felica.h:154
Definition felica.h:285
Definition felica.h:279
Felica PMm block.
Definition felica.h:159
Definition felica.h:269
Definition felica.h:210
Definition felica.h:196
Stucture for holding Felica session key which is calculated from rc and ck.
Definition felica.h:140
Definition felica.h:216
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:191