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
56#define FELICA_SERVICE_ATTRIBUTE_UNAUTH_READ (0b000001)
57#define FELICA_SERVICE_ATTRIBUTE_READ_ONLY (0b000010)
58#define FELICA_SERVICE_ATTRIBUTE_RANDOM_ACCESS (0b001000)
59#define FELICA_SERVICE_ATTRIBUTE_CYCLIC (0b001100)
60#define FELICA_SERVICE_ATTRIBUTE_PURSE (0b010000)
61#define FELICA_SERVICE_ATTRIBUTE_PURSE_SUBFIELD (0b000110)
62
64typedef enum {
65 FelicaErrorNone,
66 FelicaErrorNotPresent,
67 FelicaErrorColResFailed,
68 FelicaErrorBufferOverflow,
69 FelicaErrorCommunication,
70 FelicaErrorFieldOff,
71 FelicaErrorWrongCrc,
72 FelicaErrorProtocol,
73 FelicaErrorTimeout,
74 FelicaErrorFeatureUnsupported,
75} FelicaError;
76
77typedef enum {
78 FelicaUnknown,
79 FelicaStandard,
80 FelicaLite,
81} FelicaWorkflowType;
82
83typedef struct {
84 uint8_t data[FELICA_DATA_BLOCK_SIZE];
86
88typedef struct {
89 uint8_t data[FELICA_DATA_BLOCK_SIZE];
91
95typedef struct {
96 bool internal : 1;
97 bool external : 1;
99
108
112typedef struct {
113 uint8_t data[FELICA_DATA_BLOCK_SIZE];
115
124
126typedef struct {
127 uint8_t data[FELICA_IDM_SIZE];
128} FelicaIDm;
129
131typedef struct {
132 uint8_t data[FELICA_PMM_SIZE];
133} FelicaPMm;
134
137typedef struct {
138 uint8_t SF1;
139 uint8_t SF2;
140 uint8_t data[FELICA_DATA_BLOCK_SIZE];
142
144typedef struct {
145 FelicaBlock spad[14];
146 FelicaBlock reg;
147 FelicaBlock rc;
148 FelicaBlock mac;
149 FelicaBlock id;
150 FelicaBlock d_id;
151 FelicaBlock ser_c;
152 FelicaBlock sys_c;
153 FelicaBlock ckv;
154 FelicaBlock ck;
155 FelicaBlock mc;
156 FelicaBlock wcnt;
157 FelicaBlock mac_a;
158 FelicaBlock state;
159 FelicaBlock crc_check;
161
163typedef union {
165 uint8_t dump[sizeof(FelicaFileSystem)];
167
168typedef struct {
169 uint16_t code;
170 uint8_t attr;
172
173typedef struct {
174 uint16_t code;
175 uint16_t first_idx;
176 uint16_t last_idx;
177} FelicaArea;
178
179typedef struct {
180 FelicaBlock block;
181 uint16_t service_code;
182 uint8_t block_idx;
184
186typedef struct {
187 FelicaIDm idm;
188 FelicaPMm pmm;
189 uint8_t blocks_total;
190 uint8_t blocks_read;
191 FelicaFSUnion data;
192
193 SimpleArray* services;
194 SimpleArray* areas;
195 SimpleArray* public_blocks;
196 FelicaWorkflowType workflow_type;
197} FelicaData;
198
199typedef struct FURI_PACKED {
200 uint8_t code;
201 FelicaIDm idm;
202 uint8_t service_num;
203 uint16_t service_code;
204 uint8_t block_count;
206
207typedef struct {
208 uint8_t length;
209 uint8_t response_code;
210 FelicaIDm idm;
211 uint8_t SF1;
212 uint8_t SF2;
214
215#pragma pack(push, 1)
216typedef struct {
217 uint8_t length;
218 uint8_t command;
219 FelicaIDm idm;
221#pragma pack(pop)
222
223typedef struct {
224 uint8_t service_code : 4;
225 uint8_t access_mode : 3;
226 uint8_t length : 1;
227 uint8_t block_number;
229
230typedef struct {
231 uint8_t length;
232 uint8_t response_code;
233 FelicaIDm idm;
234 uint8_t SF1;
235 uint8_t SF2;
236 uint8_t block_count;
237 uint8_t data[];
239
240typedef struct {
242 uint8_t block_count;
243 uint8_t data[];
245
246typedef struct {
248 uint8_t data[];
250
252
254
255extern const NfcDeviceBase nfc_device_felica;
256
257FelicaData* felica_alloc(void);
258
259void felica_free(FelicaData* data);
260
261void felica_reset(FelicaData* data);
262
263void felica_copy(FelicaData* data, const FelicaData* other);
264
265bool felica_verify(FelicaData* data, const FuriString* device_type);
266
267bool felica_load(FelicaData* data, FlipperFormat* ff, uint32_t version);
268
269bool felica_save(const FelicaData* data, FlipperFormat* ff);
270
271bool felica_is_equal(const FelicaData* data, const FelicaData* other);
272
273const char* felica_get_device_name(const FelicaData* data, NfcDeviceNameType name_type);
274
275const uint8_t* felica_get_uid(const FelicaData* data, size_t* uid_len);
276
277bool felica_set_uid(FelicaData* data, const uint8_t* uid, size_t uid_len);
278
279FelicaData* felica_get_base_data(const FelicaData* data);
280
281void felica_calculate_session_key(
282 mbedtls_des3_context* ctx,
283 const uint8_t* ck,
284 const uint8_t* rc,
285 uint8_t* out);
286
287bool felica_check_mac(
288 mbedtls_des3_context* ctx,
289 const uint8_t* session_key,
290 const uint8_t* rc,
291 const uint8_t* blocks,
292 const uint8_t block_count,
293 uint8_t* data);
294
295void felica_calculate_mac_read(
296 mbedtls_des3_context* ctx,
297 const uint8_t* session_key,
298 const uint8_t* rc,
299 const uint8_t* blocks,
300 const uint8_t block_count,
301 const uint8_t* data,
302 uint8_t* mac);
303
304void felica_calculate_mac_write(
305 mbedtls_des3_context* ctx,
306 const uint8_t* session_key,
307 const uint8_t* rc,
308 const uint8_t* wcnt,
309 const uint8_t* data,
310 uint8_t* mac);
311
312void felica_write_directory_tree(const FelicaData* data, FuriString* str);
313
314void felica_get_workflow_type(FelicaData* data);
315
316void felica_get_ic_name(const FelicaData* data, FuriString* ic_name);
317
318void felica_service_get_attribute_string(const FelicaService* service, FuriString* str);
319
320#ifdef __cplusplus
321}
322#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:173
Struct which controls the process of authentication and can be passed as a parameter to the applicati...
Definition felica.h:102
FelicaAuthenticationStatus auth_status
Authentication status.
Definition felica.h:106
bool skip_auth
By default it is true, so auth is skipped.
Definition felica.h:103
FelicaCardKey card_key
User must fill this field with known card key in order to pass auth.
Definition felica.h:105
Structure used to hold authentication related fields.
Definition felica.h:119
mbedtls_des3_context des_context
Context for mbedtls des functions.
Definition felica.h:120
FelicaAuthenticationContext context
Public auth context provided to upper levels.
Definition felica.h:122
FelicaSessionKey session_key
Calculated session key.
Definition felica.h:121
In Felica there two types of auth.
Definition felica.h:95
Definition felica.h:83
Felica block with status flags indicating last operation with it.
Definition felica.h:137
uint8_t SF1
Status flag 1, equals to 0 when success.
Definition felica.h:138
uint8_t SF2
Status flag 2, equals to 0 when success.
Definition felica.h:139
Definition felica.h:223
Separate type for card key block.
Definition felica.h:88
Definition felica.h:216
Definition felica.h:207
Structure used to store Felica data and additional values about reading.
Definition felica.h:186
Felica filesystem structure.
Definition felica.h:144
Felica ID block.
Definition felica.h:126
Definition felica.h:246
Definition felica.h:240
Felica PMm block.
Definition felica.h:131
Definition felica.h:230
Definition felica.h:179
Definition felica.h:168
Stucture for holding Felica session key which is calculated from rc and ck.
Definition felica.h:112
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:163