]>
Commit | Line | Data |
---|---|---|
b67f7ec3 MHS |
1 | #ifndef PROTOCOLS_H |
2 | #define PROTOCOLS_H | |
3 | ||
4 | //The following data is taken from http://www.proxmark.org/forum/viewtopic.php?pid=13501#p13501 | |
5 | /* | |
6 | ISO14443A (usually NFC tags) | |
7 | 26 (7bits) = REQA | |
8 | 30 = Read (usage: 30+1byte block number+2bytes ISO14443A-CRC - answer: 16bytes) | |
9 | A2 = Write (usage: A2+1byte block number+4bytes data+2bytes ISO14443A-CRC - answer: 0A [ACK] or 00 [NAK]) | |
10 | 52 (7bits) = WUPA (usage: 52(7bits) - answer: 2bytes ATQA) | |
11 | 93 20 = Anticollision (usage: 9320 - answer: 4bytes UID+1byte UID-bytes-xor) | |
12 | 93 70 = Select (usage: 9370+5bytes 9320 answer - answer: 1byte SAK) | |
13 | 95 20 = Anticollision of cascade level2 | |
14 | 95 70 = Select of cascade level2 | |
15 | 50 00 = Halt (usage: 5000+2bytes ISO14443A-CRC - no answer from card) | |
16 | Mifare | |
17 | 60 = Authenticate with KeyA | |
18 | 61 = Authenticate with KeyB | |
19 | 40 (7bits) = Used to put Chinese Changeable UID cards in special mode (must be followed by 43 (8bits) - answer: 0A) | |
20 | C0 = Decrement | |
21 | C1 = Increment | |
22 | C2 = Restore | |
23 | B0 = Transfer | |
24 | Ultralight C | |
25 | A0 = Compatibility Write (to accomodate MIFARE commands) | |
26 | 1A = Step1 Authenticate | |
27 | AF = Step2 Authenticate | |
28 | ||
29 | ||
30 | ISO14443B | |
31 | 05 = REQB | |
32 | 1D = ATTRIB | |
33 | 50 = HALT | |
34 | SRIX4K (tag does not respond to 05) | |
35 | 06 00 = INITIATE | |
36 | 0E xx = SELECT ID (xx = Chip-ID) | |
37 | 0B = Get UID | |
38 | 08 yy = Read Block (yy = block number) | |
39 | 09 yy dd dd dd dd = Write Block (yy = block number; dd dd dd dd = data to be written) | |
40 | 0C = Reset to Inventory | |
41 | 0F = Completion | |
42 | 0A 11 22 33 44 55 66 = Authenticate (11 22 33 44 55 66 = data to authenticate) | |
43 | ||
44 | ||
45 | ISO15693 | |
46 | MANDATORY COMMANDS (all ISO15693 tags must support those) | |
47 | 01 = Inventory (usage: 260100+2bytes ISO15693-CRC - answer: 12bytes) | |
48 | 02 = Stay Quiet | |
49 | OPTIONAL COMMANDS (not all tags support them) | |
50 | 20 = Read Block (usage: 0220+1byte block number+2bytes ISO15693-CRC - answer: 4bytes) | |
51 | 21 = Write Block (usage: 0221+1byte block number+4bytes data+2bytes ISO15693-CRC - answer: 4bytes) | |
52 | 22 = Lock Block | |
53 | 23 = Read Multiple Blocks (usage: 0223+1byte 1st block to read+1byte last block to read+2bytes ISO15693-CRC) | |
54 | 25 = Select | |
55 | 26 = Reset to Ready | |
56 | 27 = Write AFI | |
57 | 28 = Lock AFI | |
58 | 29 = Write DSFID | |
59 | 2A = Lock DSFID | |
60 | 2B = Get_System_Info (usage: 022B+2bytes ISO15693-CRC - answer: 14 or more bytes) | |
61 | 2C = Read Multiple Block Security Status (usage: 022C+1byte 1st block security to read+1byte last block security to read+2bytes ISO15693-CRC) | |
62 | ||
63 | EM Microelectronic CUSTOM COMMANDS | |
64 | A5 = Active EAS (followed by 1byte IC Manufacturer code+1byte EAS type) | |
65 | A7 = Write EAS ID (followed by 1byte IC Manufacturer code+2bytes EAS value) | |
66 | 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) | |
67 | E4 = Login (followed by 1byte IC Manufacturer code+4bytes password) | |
68 | NXP/Philips CUSTOM COMMANDS | |
69 | A0 = Inventory Read | |
70 | A1 = Fast Inventory Read | |
71 | A2 = Set EAS | |
72 | A3 = Reset EAS | |
73 | A4 = Lock EAS | |
74 | A5 = EAS Alarm | |
75 | A6 = Password Protect EAS | |
76 | A7 = Write EAS ID | |
77 | A8 = Read EPC | |
78 | B0 = Inventory Page Read | |
79 | B1 = Fast Inventory Page Read | |
80 | B2 = Get Random Number | |
81 | B3 = Set Password | |
82 | B4 = Write Password | |
83 | B5 = Lock Password | |
84 | B6 = Bit Password Protection | |
85 | B7 = Lock Page Protection Condition | |
86 | B8 = Get Multiple Block Protection Status | |
87 | B9 = Destroy SLI | |
88 | BA = Enable Privacy | |
89 | BB = 64bit Password Protection | |
90 | 40 = Long Range CMD (Standard ISO/TR7003:1990) | |
91 | */ | |
92 | ||
93 | #define ICLASS_CMD_ACTALL 0x0A | |
94 | #define ICLASS_CMD_READ_OR_IDENTIFY 0x0C | |
95 | #define ICLASS_CMD_SELECT 0x81 | |
96 | #define ICLASS_CMD_PAGESEL 0x84 | |
97 | #define ICLASS_CMD_READCHECK_KD 0x88 | |
98 | #define ICLASS_CMD_READCHECK_KC 0x18 | |
99 | #define ICLASS_CMD_CHECK 0x05 | |
100 | #define ICLASS_CMD_DETECT 0x0F | |
101 | #define ICLASS_CMD_HALT 0x00 | |
b82d8098 | 102 | #define ICLASS_CMD_UPDATE 0x87 |
b67f7ec3 MHS |
103 | #define ICLASS_CMD_ACT 0x8E |
104 | #define ICLASS_CMD_READ4 0x06 | |
105 | ||
106 | ||
107 | #define ISO14443A_CMD_REQA 0x26 | |
b67f7ec3 MHS |
108 | #define ISO14443A_CMD_WUPA 0x52 |
109 | #define ISO14443A_CMD_ANTICOLL_OR_SELECT 0x93 | |
110 | #define ISO14443A_CMD_ANTICOLL_OR_SELECT_2 0x95 | |
c872d8c1 | 111 | #define ISO14443A_CMD_ANTICOLL_OR_SELECT_3 0x97 |
b67f7ec3 MHS |
112 | #define ISO14443A_CMD_HALT 0x50 |
113 | #define ISO14443A_CMD_RATS 0xE0 | |
114 | ||
b8dd1ef6 | 115 | #define MIFARE_CMD_READBLOCK 0x30 |
116 | #define MIFARE_CMD_WRITEBLOCK 0xA0 | |
117 | #define MIFARE_AUTH_KEYA 0x60 | |
118 | #define MIFARE_AUTH_KEYB 0x61 | |
119 | #define MIFARE_MAGICWUPC1 0x40 | |
120 | #define MIFARE_MAGICWUPC2 0x43 | |
121 | #define MIFARE_MAGICWIPEC 0x41 | |
122 | #define MIFARE_CMD_INC 0xC0 | |
123 | #define MIFARE_CMD_DEC 0xC1 | |
124 | #define MIFARE_CMD_RESTORE 0xC2 | |
125 | #define MIFARE_CMD_TRANSFER 0xB0 | |
126 | ||
127 | #define MIFARE_EV1_PERSONAL_UID 0x40 | |
128 | #define MIFARE_EV1_SETMODE 0x43 | |
129 | ||
130 | #define MIFARE_ULC_WRITE 0xA2 | |
131 | #define MIFARE_ULC_COMP_WRITE MIFARE_CMD_WRITEBLOCK | |
132 | #define MIFARE_ULC_AUTH_1 0x1A | |
133 | #define MIFARE_ULC_AUTH_2 0xAF | |
134 | ||
135 | #define MIFARE_ULEV1_AUTH 0x1B | |
136 | #define MIFARE_ULEV1_VERSION 0x60 | |
137 | #define MIFARE_ULEV1_FASTREAD 0x3A | |
138 | #define MIFARE_ULEV1_WRITE 0xA2 | |
139 | #define MIFARE_ULEV1_COMP_WRITE MIFARE_CMD_WRITEBLOCK | |
140 | #define MIFARE_ULEV1_READ_CNT 0x39 | |
141 | #define MIFARE_ULEV1_INCR_CNT 0xA5 | |
142 | #define MIFARE_ULEV1_READSIG 0x3C | |
143 | #define MIFARE_ULEV1_CHECKTEAR 0x3E | |
144 | #define MIFARE_ULEV1_VCSL 0x4B | |
145 | ||
146 | // mifare 4bit card answers | |
147 | #define CARD_ACK 0x0A // 1010 - ACK | |
148 | #define CARD_NACK_NA 0x04 // 0100 - NACK, not allowed (command not allowed) | |
149 | #define CARD_NACK_TR 0x05 // 0101 - NACK, transmission error | |
150 | ||
b67f7ec3 MHS |
151 | |
152 | /** | |
153 | 06 00 = INITIATE | |
154 | 0E xx = SELECT ID (xx = Chip-ID) | |
155 | 0B = Get UID | |
156 | 08 yy = Read Block (yy = block number) | |
157 | 09 yy dd dd dd dd = Write Block (yy = block number; dd dd dd dd = data to be written) | |
158 | 0C = Reset to Inventory | |
159 | 0F = Completion | |
160 | 0A 11 22 33 44 55 66 = Authenticate (11 22 33 44 55 66 = data to authenticate) | |
161 | **/ | |
162 | ||
163 | #define ISO14443B_REQB 0x05 | |
164 | #define ISO14443B_ATTRIB 0x1D | |
165 | #define ISO14443B_HALT 0x50 | |
166 | #define ISO14443B_INITIATE 0x06 | |
167 | #define ISO14443B_SELECT 0x0E | |
168 | #define ISO14443B_GET_UID 0x0B | |
169 | #define ISO14443B_READ_BLK 0x08 | |
170 | #define ISO14443B_WRITE_BLK 0x09 | |
171 | #define ISO14443B_RESET 0x0C | |
172 | #define ISO14443B_COMPLETION 0x0F | |
173 | #define ISO14443B_AUTHENTICATE 0x0A | |
174 | ||
8c6cca0b | 175 | // ISO15693 COMMANDS |
176 | #define ISO15693_INVENTORY 0x01 | |
177 | #define ISO15693_STAYQUIET 0x02 | |
178 | #define ISO15693_READBLOCK 0x20 | |
179 | #define ISO15693_WRITEBLOCK 0x21 | |
180 | #define ISO15693_LOCKBLOCK 0x22 | |
181 | #define ISO15693_READ_MULTI_BLOCK 0x23 | |
182 | #define ISO15693_SELECT 0x25 | |
183 | #define ISO15693_RESET_TO_READY 0x26 | |
184 | #define ISO15693_WRITE_AFI 0x27 | |
185 | #define ISO15693_LOCK_AFI 0x28 | |
186 | #define ISO15693_WRITE_DSFID 0x29 | |
187 | #define ISO15693_LOCK_DSFID 0x2A | |
188 | #define ISO15693_GET_SYSTEM_INFO 0x2B | |
189 | #define ISO15693_READ_MULTI_SECSTATUS 0x2C | |
190 | ||
191 | // ISO15693 REQUEST FLAGS | |
192 | #define ISO15693_REQ_SUBCARRIER_TWO (1<<0) | |
193 | #define ISO15693_REQ_DATARATE_HIGH (1<<1) | |
194 | #define ISO15693_REQ_INVENTORY (1<<2) | |
195 | #define ISO15693_REQ_PROTOCOL_EXT (1<<3) // RFU | |
196 | #define ISO15693_REQ_OPTION (1<<6) // Command specific option selector | |
197 | // when REQ_INVENTORY is not set | |
198 | #define ISO15693_REQ_SELECT (1<<4) // only selected cards response | |
199 | #define ISO15693_REQ_ADDRESS (1<<5) // this req contains an address | |
200 | // when REQ_INVENTORY is set | |
201 | #define ISO15693_REQINV_AFI (1<<4) // AFI Field is present | |
202 | #define ISO15693_REQINV_SLOT1 (1<<5) // 1 Slot (16 slots if not set) | |
203 | ||
204 | // ISO15693 RESPONSE FLAGS | |
205 | #define ISO15693_RES_ERROR (1<<0) | |
206 | #define ISO15693_RES_EXT (1<<3) // Protocol Extention | |
207 | ||
208 | // ISO15693 RESPONSE ERROR CODES | |
209 | #define ISO15693_NOERROR 0x00 | |
210 | #define ISO15693_ERROR_CMD_NOT_SUP 0x01 // Command not supported | |
211 | #define ISO15693_ERROR_CMD_NOT_REC 0x02 // Command not recognized (eg. parameter error) | |
212 | #define ISO15693_ERROR_CMD_OPTION 0x03 // Command option not supported | |
213 | #define ISO15693_ERROR_GENERIC 0x0F // No additional Info about this error | |
214 | #define ISO15693_ERROR_BLOCK_UNAVAILABLE 0x10 | |
215 | #define ISO15693_ERROR_BLOCK_LOCKED_ALREADY 0x11 // cannot lock again | |
216 | #define ISO15693_ERROR_BLOCK_LOCKED 0x12 // cannot be changed | |
217 | #define ISO15693_ERROR_BLOCK_WRITE 0x13 // Writing was unsuccessful | |
218 | #define ISO15693_ERROR_BLOCL_WRITELOCK 0x14 // Locking was unsuccessful | |
b67f7ec3 MHS |
219 | |
220 | ||
ee1eadee | 221 | // Topaz command set: |
222 | #define TOPAZ_REQA 0x26 // Request | |
223 | #define TOPAZ_WUPA 0x52 // WakeUp | |
224 | #define TOPAZ_RID 0x78 // Read ID | |
225 | #define TOPAZ_RALL 0x00 // Read All (all bytes) | |
226 | #define TOPAZ_READ 0x01 // Read (a single byte) | |
227 | #define TOPAZ_WRITE_E 0x53 // Write-with-erase (a single byte) | |
228 | #define TOPAZ_WRITE_NE 0x1a // Write-no-erase (a single byte) | |
48ece4a7 | 229 | // additional commands for Dynamic Memory Model |
230 | #define TOPAZ_RSEG 0x10 // Read segment | |
231 | #define TOPAZ_READ8 0x02 // Read (eight bytes) | |
232 | #define TOPAZ_WRITE_E8 0x54 // Write-with-erase (eight bytes) | |
233 | #define TOPAZ_WRITE_NE8 0x1B // Write-no-erase (eight bytes) | |
ee1eadee | 234 | |
235 | ||
43591e64 | 236 | #define ISO_14443A 0 |
237 | #define ICLASS 1 | |
238 | #define ISO_14443B 2 | |
239 | #define TOPAZ 3 | |
240 | #define PROTO_MIFARE 4 | |
241 | #define ISO_7816_4 5 | |
0d2624a0 | 242 | #define ISO_15693 6 |
53fb848a | 243 | #define ISO_14443_4 7 |
0d2624a0 | 244 | |
b67f7ec3 | 245 | |
1defcf60 MHS |
246 | //-- Picopass fuses |
247 | #define FUSE_FPERS 0x80 | |
248 | #define FUSE_CODING1 0x40 | |
249 | #define FUSE_CODING0 0x20 | |
250 | #define FUSE_CRYPT1 0x10 | |
251 | #define FUSE_CRYPT0 0x08 | |
252 | #define FUSE_FPROD1 0x04 | |
253 | #define FUSE_FPROD0 0x02 | |
254 | #define FUSE_RA 0x01 | |
255 | ||
43591e64 | 256 | // ISO 7816-4 Basic interindustry commands. For command APDU's. |
43591e64 | 257 | #define ISO7816_ERASE_BINARY 0x0E |
43591e64 | 258 | #define ISO7816_VERIFY 0x20 |
43591e64 | 259 | #define ISO7816_MANAGE_CHANNEL 0x70 |
53fb848a | 260 | #define ISO7816_EXTERNAL_AUTHENTICATE 0x82 |
261 | #define ISO7816_GET_CHALLENGE 0x84 | |
262 | #define ISO7816_INTERNAL_AUTHENTICATE 0x88 | |
263 | #define ISO7816_SELECT_FILE 0xA4 | |
264 | #define ISO7816_GET_PROCESSING_OPTIONS 0xA8 | |
265 | #define ISO7816_READ_BINARY 0xB0 | |
266 | #define ISO7816_READ_RECORDS 0xB2 | |
6b5105be | 267 | #define ISO7816_GET_RESPONSE 0xC0 |
53fb848a | 268 | #define ISO7816_ENVELOPE 0xC2 |
269 | #define ISO7816_GET_DATA 0xCA | |
270 | #define ISO7816_WRITE_BINARY 0xD0 | |
271 | #define ISO7816_WRITE_RECORD 0xD2 | |
272 | #define ISO7816_UPDATE_BINARY 0xD6 | |
273 | #define ISO7816_PUT_DATA 0xDA | |
274 | #define ISO7816_UPDATE_DATA 0xDC | |
275 | #define ISO7816_APPEND_RECORD 0xE2 | |
43591e64 | 276 | // ISO7816-4 For response APDU's |
277 | #define ISO7816_OK 0x9000 | |
278 | // 6x xx = ERROR | |
6b5105be | 279 | #define ISO7816_MAX_FRAME_SIZE 261 |
43591e64 | 280 | |
281 | ||
282 | ||
1defcf60 | 283 | void printIclassDumpInfo(uint8_t* iclass_dump); |
bbd19bec | 284 | void getMemConfig(uint8_t mem_cfg, uint8_t chip_cfg, uint8_t *max_blk, uint8_t *app_areas, uint8_t *kb); |
b67f7ec3 | 285 | |
3606ac0a | 286 | /* T55x7 configuration register definitions */ |
9f669cb2 | 287 | #define T55x7_POR_DELAY 0x00000001 |
288 | #define T55x7_ST_TERMINATOR 0x00000008 | |
289 | #define T55x7_PWD 0x00000010 | |
290 | #define T55x7_MAXBLOCK_SHIFT 5 | |
291 | #define T55x7_AOR 0x00000200 | |
292 | #define T55x7_PSKCF_RF_2 0 | |
293 | #define T55x7_PSKCF_RF_4 0x00000400 | |
294 | #define T55x7_PSKCF_RF_8 0x00000800 | |
295 | #define T55x7_MODULATION_DIRECT 0 | |
296 | #define T55x7_MODULATION_PSK1 0x00001000 | |
297 | #define T55x7_MODULATION_PSK2 0x00002000 | |
298 | #define T55x7_MODULATION_PSK3 0x00003000 | |
299 | #define T55x7_MODULATION_FSK1 0x00004000 | |
300 | #define T55x7_MODULATION_FSK2 0x00005000 | |
301 | #define T55x7_MODULATION_FSK1a 0x00006000 | |
302 | #define T55x7_MODULATION_FSK2a 0x00007000 | |
303 | #define T55x7_MODULATION_MANCHESTER 0x00008000 | |
304 | #define T55x7_MODULATION_BIPHASE 0x00010000 | |
305 | #define T55x7_MODULATION_DIPHASE 0x00018000 | |
b97311b1 | 306 | #define T55x7_X_MODE 0x00020000 |
9f669cb2 | 307 | #define T55x7_BITRATE_RF_8 0 |
308 | #define T55x7_BITRATE_RF_16 0x00040000 | |
309 | #define T55x7_BITRATE_RF_32 0x00080000 | |
310 | #define T55x7_BITRATE_RF_40 0x000C0000 | |
311 | #define T55x7_BITRATE_RF_50 0x00100000 | |
312 | #define T55x7_BITRATE_RF_64 0x00140000 | |
313 | #define T55x7_BITRATE_RF_100 0x00180000 | |
314 | #define T55x7_BITRATE_RF_128 0x001C0000 | |
3606ac0a | 315 | |
316 | /* T5555 (Q5) configuration register definitions */ | |
9f669cb2 | 317 | #define T5555_ST_TERMINATOR 0x00000001 |
318 | #define T5555_MAXBLOCK_SHIFT 0x00000001 | |
319 | #define T5555_MODULATION_MANCHESTER 0 | |
320 | #define T5555_MODULATION_PSK1 0x00000010 | |
321 | #define T5555_MODULATION_PSK2 0x00000020 | |
322 | #define T5555_MODULATION_PSK3 0x00000030 | |
323 | #define T5555_MODULATION_FSK1 0x00000040 | |
324 | #define T5555_MODULATION_FSK2 0x00000050 | |
325 | #define T5555_MODULATION_BIPHASE 0x00000060 | |
326 | #define T5555_MODULATION_DIRECT 0x00000070 | |
327 | #define T5555_INVERT_OUTPUT 0x00000080 | |
328 | #define T5555_PSK_RF_2 0 | |
329 | #define T5555_PSK_RF_4 0x00000100 | |
330 | #define T5555_PSK_RF_8 0x00000200 | |
331 | #define T5555_USE_PWD 0x00000400 | |
332 | #define T5555_USE_AOR 0x00000800 | |
4ab135c0 | 333 | #define T5555_SET_BITRATE(x) (((x-2)/2)<<12) |
334 | #define T5555_GET_BITRATE(x) ((((x >> 12) & 0x3F)*2)+2) | |
76346455 | 335 | #define T5555_BITRATE_SHIFT 12 //(RF=2n+2) ie 64=2*0x1F+2 or n = (RF-2)/2 |
9f669cb2 | 336 | #define T5555_FAST_WRITE 0x00004000 |
337 | #define T5555_PAGE_SELECT 0x00008000 | |
3606ac0a | 338 | |
8b6abef5 | 339 | #define T55XX_WRITE_TIMEOUT 1500 |
340 | ||
3606ac0a | 341 | uint32_t GetT55xxClockBit(uint32_t clock); |
342 | ||
4ab135c0 | 343 | // em4x05 & em4x69 chip configuration register definitions |
344 | #define EM4x05_GET_BITRATE(x) (((x & 0x3F)*2)+2) | |
345 | #define EM4x05_SET_BITRATE(x) ((x-2)/2) | |
346 | #define EM4x05_MODULATION_NRZ 0x00000000 | |
347 | #define EM4x05_MODULATION_MANCHESTER 0x00000040 | |
348 | #define EM4x05_MODULATION_BIPHASE 0x00000080 | |
349 | #define EM4x05_MODULATION_MILLER 0x000000C0 //not supported by all 4x05/4x69 chips | |
350 | #define EM4x05_MODULATION_PSK1 0x00000100 //not supported by all 4x05/4x69 chips | |
351 | #define EM4x05_MODULATION_PSK2 0x00000140 //not supported by all 4x05/4x69 chips | |
352 | #define EM4x05_MODULATION_PSK3 0x00000180 //not supported by all 4x05/4x69 chips | |
353 | #define EM4x05_MODULATION_FSK1 0x00000200 //not supported by all 4x05/4x69 chips | |
354 | #define EM4x05_MODULATION_FSK2 0x00000240 //not supported by all 4x05/4x69 chips | |
355 | #define EM4x05_PSK_RF_2 0 | |
356 | #define EM4x05_PSK_RF_4 0x00000400 | |
357 | #define EM4x05_PSK_RF_8 0x00000800 | |
358 | #define EM4x05_MAXBLOCK_SHIFT 14 | |
359 | #define EM4x05_FIRST_USER_BLOCK 5 | |
360 | #define EM4x05_SET_NUM_BLOCKS(x) ((x+5-1)<<14) //# of blocks sent during default read mode | |
361 | #define EM4x05_GET_NUM_BLOCKS(x) (((x>>14) & 0xF)-5+1) | |
362 | #define EM4x05_READ_LOGIN_REQ 1<<18 | |
363 | #define EM4x05_READ_HK_LOGIN_REQ 1<<19 | |
364 | #define EM4x05_WRITE_LOGIN_REQ 1<<20 | |
365 | #define EM4x05_WRITE_HK_LOGIN_REQ 1<<21 | |
366 | #define EM4x05_READ_AFTER_WRITE 1<<22 | |
367 | #define EM4x05_DISABLE_ALLOWED 1<<23 | |
368 | #define EM4x05_READER_TALK_FIRST 1<<24 | |
369 | ||
3606ac0a | 370 | #endif |
371 | // PROTOCOLS_H |