fix overwriting return value in one case
[RRG-proxmark3.git] / doc / desfire.md
blob50bddc9d5be0dc756ec0716678190237be41cc80
1 # Notes on MIFARE DESFire
2 <a id="Top"></a>
4 # Table of Contents
6 - [Notes on MIFARE DESFire](#notes-on-mifare-desfire)
7 - [Table of Contents](#table-of-contents)
8   - [Documentation](#documentation)
9   - [Source code](#source-code)
10   - [Communication channel with a card](#communication-channel-with-a-card)
11   - [Card architecture](#card-architecture)
12   - [Card structure](#card-structure)
13   - [DESFire Light](#desfire-light)
14   - [How to](#how-to)
15     - [How to get card UID](#how-to-get-card-uid)
16     - [How to get/set default communication channel settings](#how-to-getset-default-communication-channel-settings)
17     - [How to guess default communication channel settings](#how-to-guess-default-communication-channel-settings)
18     - [How to try communication channel settings](#how-to-try-communication-channel-settings)
19     - [How to look at the application list on the card](#how-to-look-at-the-application-list-on-the-card)
20     - [How to look/dump files from the application file list](#how-to-lookdump-files-from-the-application-file-list)
21     - [How to change key](#how-to-change-key)
22     - [How to create the application](#how-to-create-the-application)
23     - [How to create files](#how-to-create-files)
24     - [How to delete files](#how-to-delete-files)
25     - [How to read/write files](#how-to-readwrite-files)
26     - [How to work with transaction mac](#how-to-work-with-transaction-mac)
27     - [How to switch DESFire Light to LRP mode](#how-to-switch-desfire-light-to-lrp-mode)
30 ## Documentation
31 ^[Top](#top)
33 [DESFire Light datasheet MF2DL(H)x0](https://www.nxp.com/docs/en/data-sheet/MF2DLHX0.pdf)
35 [Features and Hints AN12343](https://www.nxp.com/docs/en/application-note/AN12343.pdf)
37 [Quick Start Guide AN12341](https://www.nxp.com/docs/en/application-note/AN12341.pdf)
39 [LRP Specification](https://www.nxp.com/docs/en/application-note/AN12304.pdf)
41 [NTAG 424 DNA NT4H2421Gx](https://www.nxp.com/docs/en/data-sheet/NT4H2421Gx.pdf)
43 [NTAG features and hints - LRP mode](https://www.nxp.com/docs/en/application-note/AN12321.pdf)
45 [ev2 samples AN12196](https://www.nxp.com/docs/en/application-note/AN12196.pdf)
47 [MIFARE Application Directory AN10787](https://www.nxp.com/docs/en/application-note/AN10787.pdf)
49 [Symmetric key diversifications AN10922](https://www.nxp.com/docs/en/application-note/AN10922.pdf)
51 ## Source code
52 ^[Top](#top)
54 [desfire_crypto from proxmark3](https://github.com/RfidResearchGroup/proxmark3/blob/master/armsrc/desfire_crypto.c)
56 [libfreefare](https://github.com/nfc-tools/libfreefare)
58 [desfire-tools-for-android](https://github.com/skjolber/desfire-tools-for-android)
60 [nfcjlib](https://github.com/andrade/nfcjlib/)
62 [java-card-desfire-emulation](https://github.com/gathigai/java-card-desfire-emulation)
64 [ChameleonMiniDESFireStack](https://github.com/maxieds/ChameleonMiniDESFireStack/)
66 [LRP/ev2 nfc-ev2-crypto](https://github.com/icedevml/nfc-ev2-crypto)
68 ## Communication channel with a card
69 ^[Top](#top)
71 The card can work with a combination of: key type - command set - secure channel - communication mode
73 *key types:*
75 **des** - 8-byte key. can be present in a form of **2tdea** key with length 16 bytes by duplicating contents twice.
77 **2tdea** - 16-byte key
79 **3tdea** - 24-byte key. can be disabled on the card level.
81 **aes** - 16-byte AES-128 key
83 *command sets:*
85 **native** - raw commands
87 **native iso** - wraps raw commands into the ISO APDU. **CLA** = 0x90, **INS** = command code, **data** = the remaining data from raw command
89 **iso** - works only for some commands: ISO select by ISO ID (if enabled), authenticate, read and write in the **plain** mode, read in the **mac** mode
91 *secure channels:*
93 **d40** - old secure channel that can work only with **des** and **2tdea** keys
95 **ev1** - secure channel that can work with all the keys: **des**, **2tdea**, **3tdea**, **aes**
97 **ev2** - the newest channel that can work with **aes** key only
99 *communication modes*
101 **plain** - just plain data between card and reader
103 **maced** - mac applied to request/response/both (may be sent or not)
105 **encrypted** - encrypted data in the request/response/both in the ev2 channel data signed with mac.
107 ## Card architecture
108 ^[Top](#top)
110 The card has several applications on it and the applications have files and some other objects.
112 Each card has a master application with AID 0x000000 that saves the card's configuration.
114 Master application has many keys with different purposes, but commands show that there is only one key - card master key.
116 Each application may have its own key type and set of keys. Each file can only have links to these keys in its access rights.
118 ## Card structure
119 ^[Top](#top)
121 - Application
122 - Application number: 1 byte
123 - Application ISO number: if set at the time of application creation. It can be selected by this ID in the ISO command set.
124 - Application DF name: 1-16 chars. It can be selected by this name in the ISO command set.
125 - Key settings: number of keys, key type, key config (what can do/not user with keys)
126 - Keys: up to 14 keys (indexes 0..d)
127 - Key versions: key version of corresponding key
128 - Files:
129   - File number: 1 byte
130   - File ISO number: should be present if and only if application created with ISO number.
131   - File type: standard, backup, value, cyclic record, linear record, transaction mac
132   - Some settings that belong to file type (size for standard file for example)
133   - File communication mode: plain/maced/encrypted
134   - File access right: there are 4 modes: read/write/read-write/change settings. And each mode access can be: key0..keyD, E - free access, F - deny access
136 ## DESFire Light
137 ^[Top](#top)
139 The card has one preinstalled master file (ISO ID 0x3f00) and one application (0xdf01)
141 In the application, there are 6 files:
143 - 0x00 Standard data file with size 256 bytes
144 - 0x01 Cyclic record file with 5 records with size 16 bytes each
145 - 0x03 Value file
146 - 0x04 Standard data file with size 256 bytes
147 - 0x0f Transaction MAC file with size 256 bytes
148 - 0x1f Standard data file with size 32 bytes. Used for FCI.
150 User can't create/delete files (except Transaction MAC file).
152 ISO file IDs, the other files and application parameters can be changed via SetConfiguration command only.
154 The card has two secure channels: EV2 and LRP. By default, EV2 is on. LRP can be switched on by issuing SetConfiguration command and after that, it can't be switched off.
156 Application on the card can't be selected by DESFire native select. Needs to issue ISO select command. All the commands that can work in LRP channel have **--appisoid** option
158 Transaction MAC file - the only file that can be created and deleted. By default, all transaction operations (operations with Value and Record file) need to issue CommitReaderID command.  
159 So (to fast check- it is needed to delete this file) it has default file id - 0x0f.
161 FCI sends from card to reader after selecting the application (df01 by default)
163 If it needs to have more space for FCI - just change the ID of one of the bigger files to 0x1f (and the current ID to something else) via SetConfiguration command.
165 ## How to
168 ### How to get card UID
169 ^[Top](#top)
171 The card can return UID in encrypted communication mode. Needs to authenticate with any key from the card.
173 `hf mfdes getuid` - authenticate with default key
175 `hf mfdes getuid -s d40` - via d40 secure channel
177 `hf mfdes getuid -s ev2 -t aes -k 11223344556677889900112233445566` - via ev2 secure channel with specified aes key
179 ### How to get/set default communication channel settings
180 ^[Top](#top)
182 All the commands use these settings by default if a more important setting is not specified in the command line.
184 `hf mfdes default` - get channel settings
186 `hf mfdes default -n 1 -t aes` - set key number 1 and key type aes
188 ### How to guess default communication channel settings
189 ^[Top](#top)
191 `hf mfdes detect` - simply detect key for master application (PICC level)
193 `hf mfdes detect --save` - detect key and save to defaults. look after to output of `hf mfdes default`
195 `hf mfdes detect -s d40` - detect via channel d40
197 `hf mfdes detect --dict mfdes_default_keys` - detect key with help of dictionary file
199 `hf mfdes detect --aid 123456 -n 2` - detect key 2 from application with AID 123456
201 ### How to try communication channel settings
202 ^[Top](#top)
204 `hf mfdes auth -n 0 -t des -k 1122334455667788 --aid 123456` - try application 123456 master key
206 `hf mfdes auth -n 0 -t aes --save` - try PICC AES master key and save the configuration to defaults if authentication succeeds
208 ### How to look at the application list on the card
209 ^[Top](#top)
211 `hf mfdes lsapp --no-auth` - show applications list without authentication
213 `hf mfdes lsapp` - show applications list with authentication from default settings
215 `hf mfdes lsapp --files` - show applications list with their files
217 `hf mfdes getaids --no-auth` - this command can return a simple AID list if it is enabled in the card settings
219 ### How to look/dump files from the application file list
220 ^[Top](#top)
222 `hf mfdes lsfiles --aid 123456 -t aes` - file list for application 123456 with aes key
224 `hf mfdes dump --aid 123456` - shows files and their contents from application 123456
226 ### How to change key
227 ^[Top](#top)
229 Changing key algorithm can be done only in one case - change card master key.
231 Key algorithm for application can be chosen only on its creation.
233 `hf mfdes changekey -t des --newalgo aes --newkey 11223344556677889900112233445566 --newver a5` - change picc master key from des default to aes
235 `hf mfdes changekey --aid 123456 -t des -n 0 -k 5555555555555555 --newkey 1122334455667788` - change application master key from one key to another
237 `hf mfdes changekey --aid 123456 -t des -n 0 --newkeyno 1 --oldkey 5555555555555555 --newkey 1122334455667788` - change key 1 with authentication with key 0 (app master key)
239 ### How to create the application
240 ^[Top](#top)
242 `hf mfdes createapp --aid 123456 --fid 2345 --dfname aid123456 --dstalgo aes` - create an application with ISO file ID, df name, and key algorithm AES
244 `hf mfdes createapp --aid 123456` - create an application 123456 with DES key algorithm and without ISO file ID. in this case, iso file id can't be provided for application's files
246 ### How to create files
247 ^[Top](#top)
249 `hf mfdes createfile --aid 123456 --fid 01 --isofid 0001 --size 000010` - create standard file with ISO ID and default access settings
251 `hf mfdes createfile --aid 123456 --fid 01 --isofid 0001 --size 000010 --backup` - create backup file
253 Create standard file with mac access mode and specified access settings. access settings can be changed later with command `hf mfdes chfilesettings`
255 `hf mfdes createfile --aid 123456 --fid 01 --isofid 0001 --size 000010 --amode mac --rrights free --wrights free --rwrights free --chrights key0`
257 `hf mfdes createvaluefile --aid 123456 --fid 01 --isofid 0001 --lower 00000010 --upper 00010000 --value 00000100` - create value file
259 `hf mfdes createrecordfile --aid 123456 --fid 01 --isofid 0001 --size 000010 --maxrecord 000010` - create linear record file
261 `hf mfdes createrecordfile --aid 123456 --fid 01 --isofid 0001 --size 000010 --maxrecord 000010 --cyclic` - create cyclic record file
263 `hf mfdes createmacfile --aid 123456 --fid 01 --rawrights 0FF0 --mackey 00112233445566778899aabbccddeeff --mackeyver 01` - create transaction mac file
265 ### How to delete files
266 ^[Top](#top)
268 `hf mfdes deletefile --aid 123456 --fid 01` - delete file
270 ### How to read/write files
271 ^[Top](#top)
273 *read:*
275 `hf mfdes read --aid 123456 --fid 01` - autodetect file type (with `hf mfdes getfilesettings`) and read its contents
277 `hf mfdes read --aid 123456 --fid 01 --type record --offset 000000 --length 000001` - read one last record from a record file
279 *read via ISO command set:*
281 Here it is needed to specify the type of the file because there is no `hf mfdes getfilesettings` in the ISO command set
283 `hf mfdes read --aid 123456 --fileisoid 1000 --type data -c iso` - select application via native command and then read file via ISO
285 `hf mfdes read --appisoid 0102 --fileisoid 1000 --type data -c iso` - select all via ISO commands and then read
287 `hf mfdes read --appisoid 0102 --fileisoid 1100 --type record -c iso --offset 000005 --length 000001` - read one record (number 5) from file ID 1100 via ISO command set
289 `hf mfdes read --appisoid 0102 --fileisoid 1100 --type record -c iso --offset 000005 --length 000000` - read all the records (from 5 to 1) from file ID 1100 via ISO command set
291 *write:*
293 `hf mfdes write --aid 123456 --fid 01 -d 01020304` - autodetect file type (with `hf mfdes getfilesettings`) and write data with offset 0
295 `hf mfdes write --aid 123456 --fid 01 --type data -d 01020304 --commit` - write backup data file and commit
297 `hf mfdes write --aid 123456 --fid 01 --type value -d 00000001` increment value file
299 `hf mfdes write --aid 123456 --fid 01 --type value -d 00000001 --debit` decrement value file
301 `hf mfdes write --aid 123456 --fid 01 --type record -d 01020304` write data to a record file
303 `hf mfdes write --aid 123456 --fid 01 --type record -d 01020304 --updaterec 0` update record 0 (latest) in the record file.
305 *write via iso command set:*
307 `hf mfdes write --appisoid 1234 --fileisoid 1000 --type data -c iso -d 01020304` write data to std/backup file via ISO command set
309 `hf mfdes write --appisoid 1234 --fileisoid 2000 --type record -c iso -d 01020304` send record to record file via ISO command set
311 *transactions:*
313 For more detailed samples look at the next howto.
315 `hf mfdes write --aid 123456 --fid 01 -d 01020304 --readerid 010203` write data to the file with CommitReaderID command before and CommitTransaction after write
317 ### How to work with transaction mac
318 ^[Top](#top)
320 There are two types of transactions with mac: with and without the CommitReaderID command. The type can be chosen by `hf mfdes createmacfile` command.
322 By default, the application works with transactions. All the write operations except write to standard file need to be committed by CommitTransaction command.
324 CommitTransaction command issued at the end of each write operation (except standard file).
326 Mac mode of transactions can be switched on by creating a mac file. There may be only one file with this file type for one application.
328 Command CommitReaderID enable/disable mode can be chosen at the creation of this file.
330 When CommitReaderID is enabled, it is needed to issue this command once per transaction. The transaction can't be committed without this command.
332 When the command is disabled - CommitReaderID returns an error.
334 *more info from MF2DL(H)x0 datasheet (link at the top of this document):*
336 10.3.2.1 Transaction MAC Counter (page 41)
338 10.3.2.5 Transaction MAC Reader ID and its encryption (page 43)
340 10.3.3 Transaction MAC Enabling (page 44)
342 10.3.4 Transaction MAC Calculation (page 45)
344 10.3.4.3 CommitReaderID Command (page 47)
346 *create mac file:*
348 `hf mfdes createmacfile --aid 123456 --fid 0f --rawrights 0FF0 --mackey 00112233445566778899aabbccddeeff --mackeyver 01` - create transaction mac file. CommitReaderID disabled
350 `hf mfdes createmacfile --aid 123456 --fid 0f --rawrights 0F10 --mackey 00112233445566778899aabbccddeeff --mackeyver 01` - create transaction mac file. CommitReaderID enabled with key 1
352 *read mac and transactions counter from mac file:*
354 `hf mfdes read --aid 123456 --fid 0f` - with type autodetect
356 *write to data file without CommitReaderID:*
358 `hf mfdes write --aid 123456 --fid 01 -d 01020304`
360 *write to data file with CommitReaderID:*
362 `hf mfdes write --aid 123456 --fid 01 -d 01020304 --readerid 010203`
364 *write to data file with CommitReaderID and decode previous reader ID:*
366 step 1. read mac file or read all the files to get transaction mac counter
368 `hf mfdes read --aid 123456 --fid 0f` - read mac file
370 `hf mfdes dump --aid 123456` - read all the files
372 step 2. write something to a file with CommitReaderID command and provide the key that was set by `hf mfdes createmacfile` command
374 `hf mfdes write --aid 123456 --fid 01 -d 01020304 --readerid 010203 --trkey 00112233445566778899aabbccddeeff`
376 ### How to switch DESFire Light to LRP mode
377 ^[Top](#top)
379 Remove failed authentication counters (if needs, but strongly recommended)
381 `hf mfdes setconfig --appisoid df01 -t aes -s ev2 --param 0a --data 00ffffffff`
383 or in the LRP mode
385 `hf mfdes setconfig --appisoid df01 -t aes -s lrp --param 0a --data 00ffffffff`
387 Switch LRP mode on
389 `hf mfdes setconfig --appisoid df01 -t aes -s ev2 --param 05 --data 00000000010000000000`