4
4
5
5
#define MF_DESFIRE_PROTOCOL_NAME "Mifare DESFire"
6
6
7
+ #define MF_DESFIRE_HW_MINOR_TYPE (0x00)
8
+ #define MF_DESFIRE_HW_MINOR_TYPE_MF3ICD40 (0x02)
9
+
10
+ #define MF_DESFIRE_HW_MAJOR_TYPE_EV1 (0x01)
11
+ #define MF_DESFIRE_HW_MAJOR_TYPE_EV2 (0x12)
12
+ #define MF_DESFIRE_HW_MAJOR_TYPE_EV2_XL (0x22)
13
+ #define MF_DESFIRE_HW_MAJOR_TYPE_EV3 (0x33)
14
+ #define MF_DESFIRE_HW_MAJOR_TYPE_MF3ICD40 (0x00)
15
+
16
+ #define MF_DESFIRE_STORAGE_SIZE_2K (0x16)
17
+ #define MF_DESFIRE_STORAGE_SIZE_4K (0x18)
18
+ #define MF_DESFIRE_STORAGE_SIZE_8K (0x1A)
19
+ #define MF_DESFIRE_STORAGE_SIZE_16K (0x1C)
20
+ #define MF_DESFIRE_STORAGE_SIZE_32K (0x1E)
21
+ #define MF_DESFIRE_STORAGE_SIZE_MF3ICD40 (0xFF)
22
+ #define MF_DESFIRE_STORAGE_SIZE_UNKNOWN (0xFF)
23
+
24
+ #define MF_DESFIRE_TEST_TYPE_MF3ICD40 (major , minor , storage ) \
25
+ (((major) == MF_DESFIRE_HW_MAJOR_TYPE_MF3ICD40) && \
26
+ ((minor) == MF_DESFIRE_HW_MINOR_TYPE_MF3ICD40) && \
27
+ ((storage) == MF_DESFIRE_STORAGE_SIZE_MF3ICD40))
28
+
29
+ static const char * mf_desfire_type_strings [] = {
30
+ [MfDesfireTypeMF3ICD40 ] = "(MF3ICD40)" ,
31
+ [MfDesfireTypeEV1 ] = "EV1" ,
32
+ [MfDesfireTypeEV2 ] = "EV2" ,
33
+ [MfDesfireTypeEV2XL ] = "EV2 XL" ,
34
+ [MfDesfireTypeEV3 ] = "EV3" ,
35
+ [MfDesfireTypeUnknown ] = "UNK" ,
36
+ };
37
+
38
+ static const char * mf_desfire_size_strings [] = {
39
+ [MfDesfireSize2k ] = "2K" ,
40
+ [MfDesfireSize4k ] = "4K" ,
41
+ [MfDesfireSize8k ] = "8K" ,
42
+ [MfDesfireSize16k ] = "16K" ,
43
+ [MfDesfireSize32k ] = "32K" ,
44
+ [MfDesfireSizeUnknown ] = "" ,
45
+ };
46
+
7
47
const NfcDeviceBase nfc_device_mf_desfire = {
8
48
.protocol_name = MF_DESFIRE_PROTOCOL_NAME ,
9
49
.alloc = (NfcDeviceAlloc )mf_desfire_alloc ,
@@ -26,7 +66,7 @@ MfDesfireData* mf_desfire_alloc(void) {
26
66
data -> master_key_versions = simple_array_alloc (& mf_desfire_key_version_array_config );
27
67
data -> application_ids = simple_array_alloc (& mf_desfire_app_id_array_config );
28
68
data -> applications = simple_array_alloc (& mf_desfire_application_array_config );
29
-
69
+ data -> device_name = furi_string_alloc ();
30
70
return data ;
31
71
}
32
72
@@ -38,6 +78,7 @@ void mf_desfire_free(MfDesfireData* data) {
38
78
simple_array_free (data -> application_ids );
39
79
simple_array_free (data -> master_key_versions );
40
80
iso14443_4a_free (data -> iso14443_4a_data );
81
+ furi_string_free (data -> device_name );
41
82
free (data );
42
83
}
43
84
@@ -228,10 +269,83 @@ bool mf_desfire_is_equal(const MfDesfireData* data, const MfDesfireData* other)
228
269
simple_array_is_equal (data -> applications , other -> applications );
229
270
}
230
271
272
+ static MfDesfireType mf_desfire_get_type_from_version (const MfDesfireVersion * const version ) {
273
+ MfDesfireType type = MfDesfireTypeUnknown ;
274
+
275
+ switch (version -> hw_major ) {
276
+ case MF_DESFIRE_HW_MAJOR_TYPE_EV1 :
277
+ type = MfDesfireTypeEV1 ;
278
+ break ;
279
+ case MF_DESFIRE_HW_MAJOR_TYPE_EV2 :
280
+ type = MfDesfireTypeEV2 ;
281
+ break ;
282
+ case MF_DESFIRE_HW_MAJOR_TYPE_EV2_XL :
283
+ type = MfDesfireTypeEV2XL ;
284
+ break ;
285
+ case MF_DESFIRE_HW_MAJOR_TYPE_EV3 :
286
+ type = MfDesfireTypeEV3 ;
287
+ break ;
288
+ default :
289
+ if (MF_DESFIRE_TEST_TYPE_MF3ICD40 (version -> hw_major , version -> hw_minor , version -> hw_storage ))
290
+ type = MfDesfireTypeMF3ICD40 ;
291
+ break ;
292
+ }
293
+
294
+ return type ;
295
+ }
296
+
297
+ static MfDesfireSize mf_desfire_get_size_from_version (const MfDesfireVersion * const version ) {
298
+ MfDesfireSize size = MfDesfireSizeUnknown ;
299
+
300
+ switch (version -> hw_storage ) {
301
+ case MF_DESFIRE_STORAGE_SIZE_2K :
302
+ size = MfDesfireSize2k ;
303
+ break ;
304
+ case MF_DESFIRE_STORAGE_SIZE_4K :
305
+ size = MfDesfireSize4k ;
306
+ break ;
307
+ case MF_DESFIRE_STORAGE_SIZE_8K :
308
+ size = MfDesfireSize8k ;
309
+ break ;
310
+ case MF_DESFIRE_STORAGE_SIZE_16K :
311
+ size = MfDesfireSize16k ;
312
+ break ;
313
+ case MF_DESFIRE_STORAGE_SIZE_32K :
314
+ size = MfDesfireSize32k ;
315
+ break ;
316
+ default :
317
+ if (MF_DESFIRE_TEST_TYPE_MF3ICD40 (version -> hw_major , version -> hw_minor , version -> hw_storage ))
318
+ size = MfDesfireSize4k ;
319
+ break ;
320
+ }
321
+
322
+ return size ;
323
+ }
324
+
231
325
const char * mf_desfire_get_device_name (const MfDesfireData * data , NfcDeviceNameType name_type ) {
232
- UNUSED (data );
233
- UNUSED (name_type );
234
- return MF_DESFIRE_PROTOCOL_NAME ;
326
+ furi_check (data );
327
+
328
+ const MfDesfireType type = mf_desfire_get_type_from_version (& data -> version );
329
+ const MfDesfireSize size = mf_desfire_get_size_from_version (& data -> version );
330
+
331
+ if (type == MfDesfireTypeUnknown ) {
332
+ furi_string_printf (data -> device_name , "Unknown %s" , MF_DESFIRE_PROTOCOL_NAME );
333
+ } else if (name_type == NfcDeviceNameTypeFull ) {
334
+ furi_string_printf (
335
+ data -> device_name ,
336
+ "%s %s %s" ,
337
+ MF_DESFIRE_PROTOCOL_NAME ,
338
+ mf_desfire_type_strings [type ],
339
+ mf_desfire_size_strings [size ]);
340
+ } else {
341
+ furi_string_printf (
342
+ data -> device_name ,
343
+ "%s %s" ,
344
+ mf_desfire_type_strings [type ],
345
+ mf_desfire_size_strings [size ]);
346
+ }
347
+
348
+ return furi_string_get_cstr (data -> device_name );
235
349
}
236
350
237
351
const uint8_t * mf_desfire_get_uid (const MfDesfireData * data , size_t * uid_len ) {
0 commit comments