text
[RRG-proxmark3.git] / doc / mfu_binary_format_notes.md
blob85935160ba04d1c04eb6d5cbd71e4eb844c1e801
1 # Notes on MFU binary formats
3   - new mfu format
4   - old mfu format
5   - plain mfu format
6   - future mfu format
7   
8 ## New mfu format
9 The new mfu binary format was created to compensate for different manufactures tag functions.
10 Like UL-Ev1 has three counter and tearing bytes,  while NTAG only has one counter and tearing byte.
11 PACK was removed from header, since its just normally part of the tag memory,  unreadable,  but when 
12 a proxmark3 dumps a tag and we have pwd/pack,  we add those to their normal location in memory.
13 This makes memory not a exact memory dump from a tag, but a "what it should have looked like" if we could read all memory
15 ```
16 // New Ultralight/NTAG dump file format
17 // Length must be aligned to 4 bytes (UL/NTAG page)
18 #define MFU_DUMP_PREFIX_LENGTH 56
20 typedef struct {
21     uint8_t version[8];
22     uint8_t tbo[2];
23     uint8_t tbo1[1];
24     uint8_t pages;                  // max page number in dump
25     uint8_t signature[32];
26     uint8_t counter_tearing[3][4];  // 3 bytes counter, 1 byte tearing flag
27     uint8_t data[1024];
28 } PACKED mfu_dump_t;
29 ```
31 ## Old mfu format
32 The old binary format saved the extra data on tag in order for the Proxmark3 to able to simulate a real tag.
34 ```
35 // Old Ultralight/NTAG dump file format
36 #define OLD_MFU_DUMP_PREFIX_LENGTH 48
38 typedef struct {
39     uint8_t version[8];
40     uint8_t tbo[2];
41     uint8_t tearing[3];
42     uint8_t pack[2];
43     uint8_t tbo1[1];
44     uint8_t signature[32];
45     uint8_t data[1024];
46 } old_mfu_dump_t;
47 ```
49 ## Plain mfu format
50 The first binary format for MFU was just a memory dump from the tag block 0 to end.
51 No extra data was saved.  
52 ```
53     uint8_t data[1024];
54 ```
56 ## future mfu format
57 For developers of apps and other tools, like libnfc,   we don't recommend using binary formats.
58 We decided to adopt a JSON based format,  which is much more flexible to changes of new tag functionality.
60 Example
61 ```
63   "Created": "proxmark3",
64   "FileType": "mfu",
65   "Card": {
66     "UID": "04F654CAFC388",
67     "Version": "0004030101000B0",
68     "TBO_0": "000",
69     "TBO_1": "0",
70     "Signature": "BC9BFD4B550C16B2B5A5ABA10B644A027B4CB03DDB46F94D992DC0FB02E0C3F",
71     "Counter0": "00000",
72     "Tearing0": "BD",
73     "Counter1": "00000",
74     "Tearing1": "BD",
75     "Counter2": "00000",
76     "Tearing2": "BD"
77   },
78   "blocks": {
79     "0": "04F6542",
80     "1": "CAFC388",
81     "2": "8E48000",
82     "3": "E110120",
83     "4": "0103A00",
84     "5": "340300F",
85     "6": "0000000",
86     "7": "0000000",
87     "8": "0000000",
88     "9": "0000000",
89     "10": "0000000",
90     "11": "0000000",
91     "12": "1122334",
92     "13": "0000000",
93     "14": "0000000",
94     "15": "0000000",
95     "16": "000000F",
96     "17": "0005000",
97     "18": "0000000",
98     "19": "0000000"
99   }