]>
Commit | Line | Data |
---|---|---|
1 | #ifndef PROTOCOLS_H | |
2 | #define PROTOCOLS_H | |
3 | ||
4 | #include <string.h> | |
5 | #include <stdint.h> | |
6 | #include <stdarg.h> | |
7 | ||
8 | ||
9 | //The following data is taken from http://www.proxmark.org/forum/viewtopic.php?pid=13501#p13501 | |
10 | /* | |
11 | ISO14443A (usually NFC tags) | |
12 | 26 (7bits) = REQA | |
13 | 30 = Read (usage: 30+1byte block number+2bytes ISO14443A-CRC - answer: 16bytes) | |
14 | A2 = Write (usage: A2+1byte block number+4bytes data+2bytes ISO14443A-CRC - answer: 0A [ACK] or 00 [NAK]) | |
15 | 52 (7bits) = WUPA (usage: 52(7bits) - answer: 2bytes ATQA) | |
16 | 93 20 = Anticollision (usage: 9320 - answer: 4bytes UID+1byte UID-bytes-xor) | |
17 | 93 70 = Select (usage: 9370+5bytes 9320 answer - answer: 1byte SAK) | |
18 | 95 20 = Anticollision of cascade level2 | |
19 | 95 70 = Select of cascade level2 | |
20 | 50 00 = Halt (usage: 5000+2bytes ISO14443A-CRC - no answer from card) | |
21 | Mifare | |
22 | 60 = Authenticate with KeyA | |
23 | 61 = Authenticate with KeyB | |
24 | 40 (7bits) = Used to put Chinese Changeable UID cards in special mode (must be followed by 43 (8bits) - answer: 0A) | |
25 | C0 = Decrement | |
26 | C1 = Increment | |
27 | C2 = Restore | |
28 | B0 = Transfer | |
29 | Ultralight C | |
30 | A0 = Compatibility Write (to accomodate MIFARE commands) | |
31 | 1A = Step1 Authenticate | |
32 | AF = Step2 Authenticate | |
33 | ||
34 | ||
35 | ISO14443B | |
36 | 05 = REQB | |
37 | 1D = ATTRIB | |
38 | 50 = HALT | |
39 | ||
40 | BA = PING (reader -> tag) | |
41 | AB = PONG (tag -> reader) | |
42 | SRIX4K (tag does not respond to 05) | |
43 | 06 00 = INITIATE | |
44 | 0E xx = SELECT ID (xx = Chip-ID) | |
45 | 0B = Get UID | |
46 | 08 yy = Read Block (yy = block number) | |
47 | 09 yy dd dd dd dd = Write Block (yy = block number; dd dd dd dd = data to be written) | |
48 | 0C = Reset to Inventory | |
49 | 0F = Completion | |
50 | 0A 11 22 33 44 55 66 = Authenticate (11 22 33 44 55 66 = data to authenticate) | |
51 | ||
52 | ||
53 | ISO15693 | |
54 | MANDATORY COMMANDS (all ISO15693 tags must support those) | |
55 | 01 = Inventory (usage: 260100+2bytes ISO15693-CRC - answer: 12bytes) | |
56 | 02 = Stay Quiet | |
57 | OPTIONAL COMMANDS (not all tags support them) | |
58 | 20 = Read Block (usage: 0220+1byte block number+2bytes ISO15693-CRC - answer: 4bytes) | |
59 | 21 = Write Block (usage: 0221+1byte block number+4bytes data+2bytes ISO15693-CRC - answer: 4bytes) | |
60 | 22 = Lock Block | |
61 | 23 = Read Multiple Blocks (usage: 0223+1byte 1st block to read+1byte last block to read+2bytes ISO15693-CRC) | |
62 | 25 = Select | |
63 | 26 = Reset to Ready | |
64 | 27 = Write AFI | |
65 | 28 = Lock AFI | |
66 | 29 = Write DSFID | |
67 | 2A = Lock DSFID | |
68 | 2B = Get_System_Info (usage: 022B+2bytes ISO15693-CRC - answer: 14 or more bytes) | |
69 | 2C = Read Multiple Block Security Status (usage: 022C+1byte 1st block security to read+1byte last block security to read+2bytes ISO15693-CRC) | |
70 | ||
71 | EM Microelectronic CUSTOM COMMANDS | |
72 | A5 = Active EAS (followed by 1byte IC Manufacturer code+1byte EAS type) | |
73 | A7 = Write EAS ID (followed by 1byte IC Manufacturer code+2bytes EAS value) | |
74 | B8 = Get Protection Status for a specific block (followed by 1byte IC Manufacturer code+1byte block number+1byte of how many blocks after the previous is needed the info) | |
75 | E4 = Login (followed by 1byte IC Manufacturer code+4bytes password) | |
76 | NXP/Philips CUSTOM COMMANDS | |
77 | A0 = Inventory Read | |
78 | A1 = Fast Inventory Read | |
79 | A2 = Set EAS | |
80 | A3 = Reset EAS | |
81 | A4 = Lock EAS | |
82 | A5 = EAS Alarm | |
83 | A6 = Password Protect EAS | |
84 | A7 = Write EAS ID | |
85 | A8 = Read EPC | |
86 | B0 = Inventory Page Read | |
87 | B1 = Fast Inventory Page Read | |
88 | B2 = Get Random Number | |
89 | B3 = Set Password | |
90 | B4 = Write Password | |
91 | B5 = Lock Password | |
92 | B6 = Bit Password Protection | |
93 | B7 = Lock Page Protection Condition | |
94 | B8 = Get Multiple Block Protection Status | |
95 | B9 = Destroy SLI | |
96 | BA = Enable Privacy | |
97 | BB = 64bit Password Protection | |
98 | 40 = Long Range CMD (Standard ISO/TR7003:1990) | |
99 | ||
100 | ISO 7816-4 Basic interindustry commands. For command APDU's. | |
101 | B0 = READ BINARY | |
102 | D0 = WRITE BINARY | |
103 | D6 = UPDATE BINARY | |
104 | 0E = ERASE BINARY | |
105 | B2 = READ RECORDS | |
106 | D2 = WRITE RECORDS | |
107 | E2 = APPEND RECORD | |
108 | DC = UPDATE RECORD | |
109 | CA = GET DATA | |
110 | DA = PUT DATA | |
111 | A4 = SELECT FILE | |
112 | 20 = VERIFY | |
113 | 88 = INTERNAL AUTHENTICATION | |
114 | 82 = EXTERNAL AUTHENTICATION | |
115 | B4 = GET CHALLENGE | |
116 | 70 = MANAGE CHANNEL | |
117 | ||
118 | For response APDU's | |
119 | 90 00 = OK | |
120 | 6x xx = ERROR | |
121 | */ | |
122 | ||
123 | #define ICLASS_CMD_ACTALL 0x0A | |
124 | #define ICLASS_CMD_READ_OR_IDENTIFY 0x0C | |
125 | #define ICLASS_CMD_SELECT 0x81 | |
126 | #define ICLASS_CMD_PAGESEL 0x84 | |
127 | #define ICLASS_CMD_READCHECK_KD 0x88 | |
128 | #define ICLASS_CMD_READCHECK_KC 0x18 | |
129 | #define ICLASS_CMD_CHECK 0x05 | |
130 | #define ICLASS_CMD_DETECT 0x0F | |
131 | #define ICLASS_CMD_HALT 0x00 | |
132 | #define ICLASS_CMD_UPDATE 0x87 | |
133 | #define ICLASS_CMD_ACT 0x8E | |
134 | #define ICLASS_CMD_READ4 0x06 | |
135 | ||
136 | ||
137 | #define ISO14443A_CMD_REQA 0x26 | |
138 | #define ISO14443A_CMD_READBLOCK 0x30 | |
139 | #define ISO14443A_CMD_WUPA 0x52 | |
140 | #define ISO14443A_CMD_ANTICOLL_OR_SELECT 0x93 | |
141 | #define ISO14443A_CMD_ANTICOLL_OR_SELECT_2 0x95 | |
142 | #define ISO14443A_CMD_ANTICOLL_OR_SELECT_3 0x97 | |
143 | #define ISO14443A_CMD_WRITEBLOCK 0xA0 | |
144 | #define ISO14443A_CMD_HALT 0x50 | |
145 | #define ISO14443A_CMD_RATS 0xE0 | |
146 | ||
147 | #define MIFARE_AUTH_KEYA 0x60 | |
148 | #define MIFARE_AUTH_KEYB 0x61 | |
149 | #define MIFARE_MAGICWUPC1 0x40 | |
150 | #define MIFARE_MAGICWUPC2 0x43 | |
151 | #define MIFARE_MAGICWIPEC 0x41 | |
152 | #define MIFARE_CMD_INC 0xC0 | |
153 | #define MIFARE_CMD_DEC 0xC1 | |
154 | #define MIFARE_CMD_RESTORE 0xC2 | |
155 | #define MIFARE_CMD_TRANSFER 0xB0 | |
156 | ||
157 | #define MIFARE_EV1_PERSONAL_UID 0x40 | |
158 | #define MIFARE_EV1_SETMODE 0x43 | |
159 | ||
160 | #define MIFARE_ULC_WRITE 0xA2 | |
161 | //#define MIFARE_ULC__COMP_WRITE 0xA0 | |
162 | #define MIFARE_ULC_AUTH_1 0x1A | |
163 | #define MIFARE_ULC_AUTH_2 0xAF | |
164 | ||
165 | #define MIFARE_ULEV1_AUTH 0x1B | |
166 | #define MIFARE_ULEV1_VERSION 0x60 | |
167 | #define MIFARE_ULEV1_FASTREAD 0x3A | |
168 | #define MIFARE_ULEV1_READ_CNT 0x39 | |
169 | #define MIFARE_ULEV1_INCR_CNT 0xA5 | |
170 | #define MIFARE_ULEV1_READSIG 0x3C | |
171 | #define MIFARE_ULEV1_CHECKTEAR 0x3E | |
172 | #define MIFARE_ULEV1_VCSL 0x4B | |
173 | ||
174 | // mifare 4bit card answers | |
175 | #define CARD_ACK 0x0A // 1010 - ACK | |
176 | #define CARD_NACK_NA 0x04 // 0100 - NACK, not allowed (command not allowed) | |
177 | #define CARD_NACK_TR 0x05 // 0101 - NACK, transmission error | |
178 | ||
179 | ||
180 | // Magic Generation 1, parameter "work flags" | |
181 | // bit 0 - need get UID | |
182 | // bit 1 - send wupC (wakeup chinese) | |
183 | // bit 2 - send HALT cmd after sequence | |
184 | // bit 3 - turn on FPGA | |
185 | // bit 4 - turn off FPGA | |
186 | // bit 5 - set datain instead of issuing USB reply (called via ARM for StandAloneMode14a) | |
187 | #define MAGIC_UID 0x01 | |
188 | #define MAGIC_WUPC 0x02 | |
189 | #define MAGIC_HALT 0x04 | |
190 | #define MAGIC_INIT 0x08 | |
191 | #define MAGIC_OFF 0x10 | |
192 | #define MAGIC_DATAIN 0x20 | |
193 | #define MAGIC_WIPE 0x40 | |
194 | #define MAGIC_SINGLE (MAGIC_WUPC | MAGIC_HALT | MAGIC_INIT | MAGIC_OFF) //0x1E | |
195 | ||
196 | /** | |
197 | 06 00 = INITIATE | |
198 | 0E xx = SELECT ID (xx = Chip-ID) | |
199 | 0B = Get UID | |
200 | 08 yy = Read Block (yy = block number) | |
201 | 09 yy dd dd dd dd = Write Block (yy = block number; dd dd dd dd = data to be written) | |
202 | 0C = Reset to Inventory | |
203 | 0F = Completion | |
204 | 0A 11 22 33 44 55 66 = Authenticate (11 22 33 44 55 66 = data to authenticate) | |
205 | **/ | |
206 | ||
207 | #define ISO14443B_REQB 0x05 | |
208 | #define ISO14443B_ATTRIB 0x1D | |
209 | #define ISO14443B_HALT 0x50 | |
210 | #define ISO14443B_INITIATE 0x06 | |
211 | #define ISO14443B_SELECT 0x0E | |
212 | #define ISO14443B_GET_UID 0x0B | |
213 | #define ISO14443B_READ_BLK 0x08 | |
214 | #define ISO14443B_WRITE_BLK 0x09 | |
215 | #define ISO14443B_RESET 0x0C | |
216 | #define ISO14443B_COMPLETION 0x0F | |
217 | #define ISO14443B_AUTHENTICATE 0x0A | |
218 | #define ISO14443B_PING 0xBA | |
219 | #define ISO14443B_PONG 0xAB | |
220 | ||
221 | //First byte is 26 | |
222 | #define ISO15693_INVENTORY 0x01 | |
223 | #define ISO15693_STAYQUIET 0x02 | |
224 | //First byte is 02 | |
225 | #define ISO15693_READBLOCK 0x20 | |
226 | #define ISO15693_WRITEBLOCK 0x21 | |
227 | #define ISO15693_LOCKBLOCK 0x22 | |
228 | #define ISO15693_READ_MULTI_BLOCK 0x23 | |
229 | #define ISO15693_SELECT 0x25 | |
230 | #define ISO15693_RESET_TO_READY 0x26 | |
231 | #define ISO15693_WRITE_AFI 0x27 | |
232 | #define ISO15693_LOCK_AFI 0x28 | |
233 | #define ISO15693_WRITE_DSFID 0x29 | |
234 | #define ISO15693_LOCK_DSFID 0x2A | |
235 | #define ISO15693_GET_SYSTEM_INFO 0x2B | |
236 | #define ISO15693_READ_MULTI_SECSTATUS 0x2C | |
237 | ||
238 | ||
239 | // Topaz command set: | |
240 | #define TOPAZ_REQA 0x26 // Request | |
241 | #define TOPAZ_WUPA 0x52 // WakeUp | |
242 | #define TOPAZ_RID 0x78 // Read ID | |
243 | #define TOPAZ_RALL 0x00 // Read All (all bytes) | |
244 | #define TOPAZ_READ 0x01 // Read (a single byte) | |
245 | #define TOPAZ_WRITE_E 0x53 // Write-with-erase (a single byte) | |
246 | #define TOPAZ_WRITE_NE 0x1a // Write-no-erase (a single byte) | |
247 | // additional commands for Dynamic Memory Model | |
248 | #define TOPAZ_RSEG 0x10 // Read segment | |
249 | #define TOPAZ_READ8 0x02 // Read (eight bytes) | |
250 | #define TOPAZ_WRITE_E8 0x54 // Write-with-erase (eight bytes) | |
251 | #define TOPAZ_WRITE_NE8 0x1B // Write-no-erase (eight bytes) | |
252 | ||
253 | ||
254 | // Definetions of which protocol annotations there are available | |
255 | #define ISO_14443A 0 | |
256 | #define ICLASS 1 | |
257 | #define ISO_14443B 2 | |
258 | #define TOPAZ 3 | |
259 | #define ISO_7816_4 4 | |
260 | #define MFDES 5 | |
261 | #define LEGIC 6 | |
262 | ||
263 | //-- Picopass fuses | |
264 | #define FUSE_FPERS 0x80 | |
265 | #define FUSE_CODING1 0x40 | |
266 | #define FUSE_CODING0 0x20 | |
267 | #define FUSE_CRYPT1 0x10 | |
268 | #define FUSE_CRYPT0 0x08 | |
269 | #define FUSE_FPROD1 0x04 | |
270 | #define FUSE_FPROD0 0x02 | |
271 | #define FUSE_RA 0x01 | |
272 | ||
273 | // ISO 7816-4 Basic interindustry commands. For command APDU's. | |
274 | #define ISO7816_READ_BINARY 0xB0 | |
275 | #define ISO7816_WRITE_BINARY 0xD0 | |
276 | #define ISO7816_UPDATE_BINARY 0xD6 | |
277 | #define ISO7816_ERASE_BINARY 0x0E | |
278 | #define ISO7816_READ_RECORDS 0xB2 | |
279 | #define ISO7816_WRITE_RECORDS 0xD2 | |
280 | #define ISO7816_APPEND_RECORD 0xE2 | |
281 | #define ISO7816_UPDATE_RECORD 0xDC | |
282 | #define ISO7816_GET_DATA 0xCA | |
283 | #define ISO7816_PUT_DATA 0xDA | |
284 | #define ISO7816_SELECT_FILE 0xA4 | |
285 | #define ISO7816_VERIFY 0x20 | |
286 | #define ISO7816_INTERNAL_AUTHENTICATION 0x88 | |
287 | #define ISO7816_EXTERNAL_AUTHENTICATION 0x82 | |
288 | #define ISO7816_GET_CHALLENGE 0xB4 | |
289 | #define ISO7816_MANAGE_CHANNEL 0x70 | |
290 | ||
291 | // ISO7816-4 For response APDU's | |
292 | #define ISO7816_OK 0x9000 | |
293 | // 6x xx = ERROR | |
294 | ||
295 | // MIFARE DESFire command set: | |
296 | #define MFDES_CREATE_APPLICATION 0xca | |
297 | #define MFDES_DELETE_APPLICATION 0xda | |
298 | #define MFDES_GET_APPLICATION_IDS 0x6a | |
299 | #define MFDES_SELECT_APPLICATION 0x5a | |
300 | #define MFDES_FORMAT_PICC 0xfc | |
301 | #define MFDES_GET_VERSION 0x60 | |
302 | #define MFDES_READ_DATA 0xbd | |
303 | #define MFDES_WRITE_DATA 0x3d | |
304 | #define MFDES_GET_VALUE 0x6c | |
305 | #define MFDES_CREDIT 0x0c | |
306 | #define MFDES_DEBIT 0xdc | |
307 | #define MFDES_LIMITED_CREDIT 0x1c | |
308 | #define MFDES_WRITE_RECORD 0x3b | |
309 | #define MFDES_READ_RECORDS 0xbb | |
310 | #define MFDES_CLEAR_RECORD_FILE 0xeb | |
311 | #define MFDES_COMMIT_TRANSACTION 0xc7 | |
312 | #define MFDES_ABORT_TRANSACTION 0xa7 | |
313 | #define MFDES_GET_FREE_MEMORY 0x6e | |
314 | #define MFDES_GET_FILE_IDS 0x6f | |
315 | #define MFDES_GET_ISOFILE_IDS 0x61 | |
316 | #define MFDES_GET_FILE_SETTINGS 0xf5 | |
317 | #define MFDES_CHANGE_FILE_SETTINGS 0x5f | |
318 | #define MFDES_CREATE_STD_DATA_FILE 0xcd | |
319 | #define MFDES_CREATE_BACKUP_DATA_FILE 0xcb | |
320 | #define MFDES_CREATE_VALUE_FILE 0xcc | |
321 | #define MFDES_CREATE_LINEAR_RECORD_FILE 0xc1 | |
322 | #define MFDES_CREATE_CYCLIC_RECORD_FILE 0xc0 | |
323 | #define MFDES_DELETE_FILE 0xdf | |
324 | #define MFDES_AUTHENTICATE 0x0a // AUTHENTICATE_NATIVE | |
325 | #define MFDES_AUTHENTICATE_ISO 0x1a // AUTHENTICATE_STANDARD | |
326 | #define MFDES_AUTHENTICATE_AES 0xaa | |
327 | #define MFDES_CHANGE_KEY_SETTINGS 0x54 | |
328 | #define MFDES_GET_KEY_SETTINGS 0x45 | |
329 | #define MFDES_CHANGE_KEY 0xc4 | |
330 | #define MFDES_GET_KEY_VERSION 0x64 | |
331 | #define MFDES_AUTHENTICATION_FRAME 0xAF | |
332 | ||
333 | // LEGIC Commands | |
334 | #define LEGIC_MIM_22 0x0D | |
335 | #define LEGIC_MIM_256 0x1D | |
336 | #define LEGIC_MIM_1024 0x3D | |
337 | #define LEGIC_ACK_22 0x19 | |
338 | #define LEGIC_ACK_256 0x39 | |
339 | #define LEGIC_READ 0x01 | |
340 | #define LEGIC_WRITE 0x00 | |
341 | ||
342 | void printIclassDumpInfo(uint8_t* iclass_dump); | |
343 | void getMemConfig(uint8_t mem_cfg, uint8_t chip_cfg, uint8_t *max_blk, uint8_t *app_areas, uint8_t *kb); | |
344 | ||
345 | /* T55x7 configuration register definitions */ | |
346 | #define T55x7_POR_DELAY 0x00000001 | |
347 | #define T55x7_ST_TERMINATOR 0x00000008 | |
348 | #define T55x7_PWD 0x00000010 | |
349 | #define T55x7_MAXBLOCK_SHIFT 5 | |
350 | #define T55x7_AOR 0x00000200 | |
351 | #define T55x7_PSKCF_RF_2 0 | |
352 | #define T55x7_PSKCF_RF_4 0x00000400 | |
353 | #define T55x7_PSKCF_RF_8 0x00000800 | |
354 | #define T55x7_MODULATION_DIRECT 0 | |
355 | #define T55x7_MODULATION_PSK1 0x00001000 | |
356 | #define T55x7_MODULATION_PSK2 0x00002000 | |
357 | #define T55x7_MODULATION_PSK3 0x00003000 | |
358 | #define T55x7_MODULATION_FSK1 0x00004000 | |
359 | #define T55x7_MODULATION_FSK2 0x00005000 | |
360 | #define T55x7_MODULATION_FSK1a 0x00006000 | |
361 | #define T55x7_MODULATION_FSK2a 0x00007000 | |
362 | #define T55x7_MODULATION_MANCHESTER 0x00008000 | |
363 | #define T55x7_MODULATION_BIPHASE 0x00010000 | |
364 | #define T55x7_MODULATION_DIPHASE 0x00018000 | |
365 | #define T55x7_BITRATE_RF_8 0 | |
366 | #define T55x7_BITRATE_RF_16 0x00040000 | |
367 | #define T55x7_BITRATE_RF_32 0x00080000 | |
368 | #define T55x7_BITRATE_RF_40 0x000C0000 | |
369 | #define T55x7_BITRATE_RF_50 0x00100000 | |
370 | #define T55x7_BITRATE_RF_64 0x00140000 | |
371 | #define T55x7_BITRATE_RF_100 0x00180000 | |
372 | #define T55x7_BITRATE_RF_128 0x001C0000 | |
373 | ||
374 | /* T5555 (Q5) configuration register definitions */ | |
375 | #define T5555_ST_TERMINATOR 0x00000001 | |
376 | #define T5555_MAXBLOCK_SHIFT 0x00000001 | |
377 | #define T5555_MODULATION_MANCHESTER 0 | |
378 | #define T5555_MODULATION_PSK1 0x00000010 | |
379 | #define T5555_MODULATION_PSK2 0x00000020 | |
380 | #define T5555_MODULATION_PSK3 0x00000030 | |
381 | #define T5555_MODULATION_FSK1 0x00000040 | |
382 | #define T5555_MODULATION_FSK2 0x00000050 | |
383 | #define T5555_MODULATION_BIPHASE 0x00000060 | |
384 | #define T5555_MODULATION_DIRECT 0x00000070 | |
385 | #define T5555_INVERT_OUTPUT 0x00000080 | |
386 | #define T5555_PSK_RF_2 0 | |
387 | #define T5555_PSK_RF_4 0x00000100 | |
388 | #define T5555_PSK_RF_8 0x00000200 | |
389 | #define T5555_USE_PWD 0x00000400 | |
390 | #define T5555_USE_AOR 0x00000800 | |
391 | #define T5555_BITRATE_SHIFT 12 //(RF=2n+2) ie 64=2*0x1F+2 or n = (RF-2)/2 | |
392 | #define T5555_FAST_WRITE 0x00004000 | |
393 | #define T5555_PAGE_SELECT 0x00008000 | |
394 | ||
395 | uint32_t GetT55xxClockBit(uint32_t clock); | |
396 | ||
397 | // iclass / picopass chip config structures and shared routines | |
398 | typedef struct { | |
399 | uint8_t app_limit; //[8] | |
400 | uint8_t otp[2]; //[9-10] | |
401 | uint8_t block_writelock;//[11] | |
402 | uint8_t chip_config; //[12] | |
403 | uint8_t mem_config; //[13] | |
404 | uint8_t eas; //[14] | |
405 | uint8_t fuses; //[15] | |
406 | } picopass_conf_block; | |
407 | ||
408 | ||
409 | typedef struct { | |
410 | uint8_t csn[8]; | |
411 | picopass_conf_block conf; | |
412 | uint8_t epurse[8]; | |
413 | uint8_t key_d[8]; | |
414 | uint8_t key_c[8]; | |
415 | uint8_t app_issuer_area[8]; | |
416 | } picopass_hdr; | |
417 | ||
418 | ||
419 | #endif | |
420 | // PROTOCOLS_H |