]> git.zerfleddert.de Git - proxmark3-svn/blame - client/cmdlft55xx.c
Merge branch 'master' of https://github.com/Proxmark/proxmark3
[proxmark3-svn] / client / cmdlft55xx.c
CommitLineData
54a942b0 1//-----------------------------------------------------------------------------\r
2//\r
3// This code is licensed to you under the terms of the GNU GPL, version 2 or,\r
4// at your option, any later version. See the LICENSE.txt file for the text of\r
5// the license.\r
6//-----------------------------------------------------------------------------\r
7// Low frequency T55xx commands\r
8//-----------------------------------------------------------------------------\r
9\r
10#include <stdio.h>\r
11#include <string.h>\r
12#include <inttypes.h>\r
54a942b0 13#include "proxmark3.h"\r
14#include "ui.h"\r
15#include "graph.h"\r
f38a1528 16#include "cmdmain.h"\r
54a942b0 17#include "cmdparser.h"\r
18#include "cmddata.h"\r
19#include "cmdlf.h"\r
20#include "cmdlft55xx.h"\r
f38a1528 21#include "util.h"\r
22#include "data.h"\r
c4e3b1b6 23#include "lfdemod.h"\r
54a942b0 24\r
8d0a3e87 25#define LF_TRACE_BUFF_SIZE 20000 // 32 x 32 x 10 (32 bit times numofblock (7), times clock skip..)\r
c6be64da 26#define LF_BITSSTREAM_LEN 1000 // more then 1000 bits shouldn't happend.. 8block * 4 bytes * 8bits = \r
54a942b0 27\r
4ecde0e1 28int usage_t55xx_rd(){\r
29 PrintAndLog("Usage: lf t55xx rd <block> <password>");\r
30 PrintAndLog(" <block>, block number to read. Between 0-7");\r
31 PrintAndLog(" <password>, OPTIONAL password (8 hex characters)");\r
32 PrintAndLog("");\r
33 PrintAndLog(" sample: lf t55xx rd 0 = try reading data from block 0");\r
34 PrintAndLog(" : lf t55xx rd 0 feedbeef = try reading data from block 0 using password");\r
35 PrintAndLog("");\r
36 return 0;\r
37}\r
38int usage_t55xx_wr(){\r
39 PrintAndLog("Usage: lf t55xx wr <block> <data> [password]");\r
40 PrintAndLog(" <block>, block number to read. Between 0-7");\r
41 PrintAndLog(" <data>, 4 bytes of data to write (8 hex characters)");\r
42 PrintAndLog(" [password], OPTIONAL password 4bytes (8 hex characters)");\r
43 PrintAndLog("");\r
44 PrintAndLog(" sample: lf t55xx wd 3 11223344 = try writing data 11223344 to block 3");\r
45 PrintAndLog(" : lf t55xx wd 3 11223344 feedbeef = try writing data 11223344 to block 3 using password feedbeef");\r
46 PrintAndLog("");\r
47 return 0;\r
48}\r
49int usage_t55xx_trace() {\r
50 PrintAndLog("Usage: lf t55xx trace [graph buffer data]");\r
51 PrintAndLog(" [graph buffer data], if set, use Graphbuffer otherwise read data from tag.");\r
52 PrintAndLog("");\r
53 PrintAndLog(" sample: lf t55xx trace");\r
54 PrintAndLog(" : lf t55xx trace 1");\r
55 PrintAndLog("");\r
56 return 0;\r
57}\r
58int usage_t55xx_info() {\r
59 PrintAndLog("Usage: lf t55xx info [graph buffer data]");\r
60 PrintAndLog(" [graph buffer data], if set, use Graphbuffer otherwise read data from tag.");\r
61 PrintAndLog("");\r
62 PrintAndLog(" sample: lf t55xx info");\r
63 PrintAndLog(" : lf t55xx info 1");\r
64 PrintAndLog("");\r
65 return 0;\r
66}\r
4ecde0e1 67int usage_t55xx_dump(){\r
68 PrintAndLog("Usage: lf t55xx dump <password>");\r
69 PrintAndLog(" <password>, OPTIONAL password 4bytes (8 hex characters)");\r
70 PrintAndLog("");\r
71 PrintAndLog(" sample: lf t55xx dump");\r
72 PrintAndLog(" : lf t55xx dump feedbeef");\r
73 PrintAndLog("");\r
74 return 0;\r
75}\r
0310364d 76\r
4ecde0e1 77static int CmdHelp(const char *Cmd);\r
c4e3b1b6 78\r
54a942b0 79int CmdReadBlk(const char *Cmd)\r
80{\r
c6be64da 81 int block = -1;\r
4ecde0e1 82 int password = 0xFFFFFFFF; //default to blank Block 7\r
385f3987 83 size_t bitlen;\r
385f3987 84 uint32_t blockData;\r
c4e3b1b6 85 uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};\r
385f3987 86 \r
c4e3b1b6 87 \r
4ecde0e1 88 char cmdp = param_getchar(Cmd, 0);\r
89 if (cmdp == 'h' || cmdp == 'H') {\r
90 usage_t55xx_rd();\r
91 return 0;\r
92 }\r
54a942b0 93\r
4ecde0e1 94 int res = sscanf(Cmd, "%d %x", &block, &password);\r
54a942b0 95\r
4ecde0e1 96 if ( res < 1 || res > 2 ){\r
97 usage_t55xx_rd();\r
98 return 1;\r
99 }\r
100 \r
101 if ((block < 0) | (block > 7)) {\r
b44e5233 102 PrintAndLog("Block must be between 0 and 7");\r
103 return 1;\r
4ecde0e1 104 } \r
54a942b0 105\r
4ecde0e1 106 UsbCommand c = {CMD_T55XX_READ_BLOCK, {0, block, 0}};\r
107 c.d.asBytes[0] = 0x0; \r
54a942b0 108\r
4ecde0e1 109 //Password mode\r
110 if ( res == 2 ) {\r
111 c.arg[2] = password;\r
112 c.d.asBytes[0] = 0x1; \r
c4e3b1b6 113 }\r
54a942b0 114\r
b44e5233 115 SendCommand(&c);\r
c4e3b1b6 116 if ( !WaitForResponseTimeout(CMD_ACK,NULL,1500) ) {\r
117 PrintAndLog("command execution time out");\r
385f3987 118 return 2;\r
c4e3b1b6 119 }\r
f38a1528 120 \r
385f3987 121 CmdSamples("12000");\r
a501c82b 122\r
385f3987 123 bitlen = getFromGraphBuf(bits);\r
c4e3b1b6 124\r
4e7af352 125 if ( !tryDemod(bits, bitlen) )\r
126 return 3;\r
127 \r
c4e3b1b6 128 //move bits back to DemodBuffer\r
129 setDemodBuf(bits, bitlen, 0);\r
4e7af352 130 printBitStream(bits, bitlen);\r
385f3987 131 \r
4e7af352 132 // // bits has the manchester encoded data.\r
133 // errCnt = manrawdecode(bits, &bitlen); \r
134 // if ( errCnt == -1 || bitlen < 32 ){ \r
135 // PrintAndLog("no data found");\r
136 // if (g_debugMode) \r
137 // PrintAndLog("errCnt: %d, bitlen: %d, clk: %d, invert: %d", errCnt, bitlen, clk, invert);\r
138 // return 4;\r
139 // }\r
385f3987 140\r
0310364d 141 blockData = PackBits(1, 32, bits);\r
385f3987 142\r
143 if ( block < 0)\r
0310364d 144 PrintAndLog(" Decoded : 0x%08X %s", blockData, sprint_bin(bits+1,32) );\r
385f3987 145 else\r
0310364d 146 PrintAndLog(" Block %d : 0x%08X %s", block, blockData, sprint_bin(bits+1,32) );\r
385f3987 147 \r
c4e3b1b6 148 return 0;\r
54a942b0 149}\r
150\r
4e7af352 151\r
152/*\r
153FSK1 / FSK1a\r
154size = fskdemod(dest, size, 32, 0, 8, 10); // fsk1 RF/32 \r
155size = fskdemod(dest, size, 32, 1, 8, 10); // fsk1a RF/32 \r
156\r
157FSK2 / FSK2a\r
158size = fskdemod(dest, size, 32, 0, 10, 8); // fsk2 RF/32 \r
159size = fskdemod(dest, size, 32, 1, 10, 8); // fsk2a RF/32 \r
160size = fskdemod(dest, size, 50, 1, 10, 8); // fsk2a RF/50 \r
161size = fskdemod(dest, size, 64, 1, 10, 8); // FSK2a RF/64 \r
162\r
163PSK1\r
164errCnt = pskRawDemod(bits, &bitlen, 32, 0);\r
165*/\r
166bool tryDemod(uint8_t bits[], size_t bitlen) {\r
167 \r
168 int invert = 0;\r
169 int clk = 0;\r
170 int errCnt, size;\r
171 int maxErr = 100;\r
172 uint8_t rflen, fchigh, fclow, dummy = 0;\r
173 uint16_t fcs=0;\r
174\r
175 // ASK - manchester demod\r
176 errCnt = askmandemod(bits, &bitlen, &clk, &invert, maxErr);\r
177 if ( analyseDemod(errCnt, bitlen, clk, invert) ) \r
178 return true;\r
179\r
180 // FSK demod\r
181 fcs = countFC(bits, bitlen, &dummy);\r
182 if (fcs == 0){\r
183 fchigh = 10;\r
184 fclow = 8;\r
185 }else{\r
186 fchigh = (fcs >> 8) & 0xFF;\r
187 fclow = fcs & 0xFF;\r
188 }\r
189 //get bit clock length\r
190 rflen = detectFSKClk(bits, bitlen, fchigh, fclow);\r
191 rflen = (rflen == 0) ? 50 : rflen;\r
192\r
193 size = fskdemod(bits, bitlen, rflen, invert, fchigh, fclow);\r
194 if ( analyseDemod(size, bitlen, clk, invert) ) \r
195 return true; \r
196 \r
197 // PSK demod\r
198 return false;\r
199}\r
200\r
201bool analyseDemod( int errCnt, size_t bitlen, uint8_t clock, uint8_t invert){\r
202 if (g_debugMode) \r
203 PrintAndLog("ErrorCount: %d, Bits Found: %d, Clock: %d, invert: %d", errCnt, bitlen, clock, invert);\r
204 //PrintAndLog("Args invert: %d - Clock:%d - fchigh:%d - fclow: %d",invert,rfLen,fchigh, fclow);\r
205 \r
206 //throw away static - allow 1 and -1 (in case of threshold command first)\r
207 if ( errCnt == -1 || bitlen < 32 ){ \r
208 PrintAndLog("no success demod");\r
209 return false;\r
210 }\r
211 return true;\r
212}\r
213\r
54a942b0 214int CmdWriteBlk(const char *Cmd)\r
54a942b0 215{\r
4ecde0e1 216 int block = 8; //default to invalid block\r
217 int data = 0xFFFFFFFF; //default to blank Block \r
218 int password = 0xFFFFFFFF; //default to blank Block 7\r
219 \r
220 char cmdp = param_getchar(Cmd, 0);\r
221 if (cmdp == 'h' || cmdp == 'H') {\r
222 usage_t55xx_wr();\r
223 return 0;\r
224 }\r
225 \r
226 int res = sscanf(Cmd, "%d %x %x",&block, &data, &password);\r
227 \r
228 if ( res < 2 || res > 3) {\r
229 usage_t55xx_wr();\r
230 return 1;\r
231 }\r
54a942b0 232\r
4ecde0e1 233 if (block > 7) {\r
b44e5233 234 PrintAndLog("Block must be between 0 and 7");\r
235 return 1;\r
f38a1528 236 }\r
4ecde0e1 237 \r
238 UsbCommand c = {CMD_T55XX_WRITE_BLOCK, {data, block, 0}};\r
239 c.d.asBytes[0] = 0x0; \r
54a942b0 240\r
4ecde0e1 241 if (res == 2) {\r
242 PrintAndLog("Writing block %d data %08X", block, data);\r
243 } else {\r
244 //Password mode\r
245 c.arg[2] = password;\r
246 c.d.asBytes[0] = 0x1; \r
247 PrintAndLog("Writing block %d data %08X password %08X", block, data, password);\r
248 }\r
249 \r
250 SendCommand(&c);\r
251 return 0;\r
54a942b0 252}\r
253\r
254int CmdReadTrace(const char *Cmd)\r
255{\r
0310364d 256 int invert = 0;\r
257 int clk = 0;\r
258 int errCnt;\r
259 size_t bitlen;\r
260 int maxErr = 100;\r
261 uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00};\r
f38a1528 262\r
0310364d 263 char cmdp = param_getchar(Cmd, 0);\r
264 \r
fbceacc5 265 if (strlen(Cmd) > 1 || cmdp == 'h' || cmdp == 'H') {\r
4ecde0e1 266 usage_t55xx_trace();\r
fbceacc5 267 return 0;\r
268 }\r
f38a1528 269\r
fbceacc5 270 if ( strlen(Cmd)==0){\r
c4e3b1b6 271 \r
fbceacc5 272 UsbCommand c = {CMD_T55XX_READ_TRACE, {0, 0, 0}};\r
273 SendCommand(&c);\r
274 WaitForResponse(CMD_ACK, NULL);\r
f38a1528 275\r
0310364d 276 CmdSamples("12000");\r
f38a1528 277 }\r
f38a1528 278 \r
0310364d 279 bitlen = getFromGraphBuf(bits);\r
280\r
281 //errCnt = askrawdemod(bits, &bitlen, &clk, &invert, maxErr, askAmp);\r
282 errCnt = askmandemod(bits, &bitlen, &clk, &invert, maxErr);\r
f38a1528 283 \r
0310364d 284 //throw away static - allow 1 and -1 (in case of threshold command first)\r
285 if ( errCnt == -1 || bitlen < 16 ){ \r
286 PrintAndLog("no data found");\r
287 if (g_debugMode) \r
288 PrintAndLog("errCnt: %d, bitlen: %d, clk: %d, invert: %d", errCnt, bitlen, clk, invert);\r
289 return 3;\r
290 }\r
291 if (g_debugMode) \r
292 PrintAndLog("Using Clock: %d - invert: %d - Bits Found: %d", clk, invert, bitlen);\r
293\r
294 //move bits back to DemodBuffer\r
295 setDemodBuf(bits, bitlen, 0);\r
296 \r
297 // bits has the manchester encoded data.\r
298 errCnt = manrawdecode(bits, &bitlen); \r
299 if ( errCnt == -1 || bitlen < 16 ){ \r
300 PrintAndLog("no data found");\r
301 if (g_debugMode) \r
302 PrintAndLog("errCnt: %d, bitlen: %d, clk: %d, invert: %d", errCnt, bitlen, clk, invert);\r
303 return 4;\r
304 }\r
305\r
f6c18637 306 RepaintGraphWindow();\r
b44e5233 307\r
f6c18637 308 uint8_t si = 5;\r
0310364d 309 uint32_t bl0 = PackBits(si, 32, bits);\r
310 uint32_t bl1 = PackBits(si+32, 32, bits);\r
f6c18637 311 \r
0310364d 312 uint32_t acl = PackBits(si, 8, bits); si += 8;\r
313 uint32_t mfc = PackBits(si, 8, bits); si += 8;\r
314 uint32_t cid = PackBits(si, 5, bits); si += 5;\r
315 uint32_t icr = PackBits(si, 3, bits); si += 3;\r
316 uint32_t year = PackBits(si, 4, bits); si += 4;\r
317 uint32_t quarter = PackBits(si, 2, bits); si += 2;\r
318 uint32_t lotid = PackBits(si, 12, bits); si += 12;\r
319 uint32_t wafer = PackBits(si, 5, bits); si += 5;\r
320 uint32_t dw = PackBits(si, 15, bits); \r
f6c18637 321 \r
322 PrintAndLog("");\r
323 PrintAndLog("-- T55xx Trace Information ----------------------------------");\r
324 PrintAndLog("-------------------------------------------------------------");\r
325 PrintAndLog(" ACL Allocation class (ISO/IEC 15963-1) : 0x%02X (%d)", acl, acl);\r
326 PrintAndLog(" MFC Manufacturer ID (ISO/IEC 7816-6) : 0x%02X (%d)", mfc, mfc);\r
327 PrintAndLog(" CID : 0x%02X (%d)", cid, cid);\r
328 PrintAndLog(" ICR IC Revision : %d",icr );\r
329 PrintAndLog(" Manufactured");\r
330 PrintAndLog(" Year/Quarter : %d/%d",2000+year, quarter );\r
77376577 331 PrintAndLog(" Lot ID : %d", lotid );\r
f6c18637 332 PrintAndLog(" Wafer number : %d", wafer);\r
333 PrintAndLog(" Die Number : %d", dw);\r
334 PrintAndLog("-------------------------------------------------------------");\r
77376577 335 PrintAndLog(" Raw Data - Page 1");\r
0310364d 336 PrintAndLog(" Block 0 : 0x%08X %s", bl0, sprint_bin(bits+5,32) );\r
337 PrintAndLog(" Block 0 : 0x%08X %s", bl1, sprint_bin(bits+37,32) );\r
f6c18637 338 PrintAndLog("-------------------------------------------------------------");\r
339 /*\r
340 TRACE - BLOCK O\r
341 Bits Definition HEX\r
342 1-8 ACL Allocation class (ISO/IEC 15963-1) 0xE0 \r
343 9-16 MFC Manufacturer ID (ISO/IEC 7816-6) 0x15 Atmel Corporation\r
344 17-21 CID 0x1 = Atmel ATA5577M1 0x2 = Atmel ATA5577M2 \r
345 22-24 ICR IC revision\r
346 25-28 YEAR (BCD encoded) 9 (= 2009)\r
347 29-30 QUARTER 1,2,3,4 \r
77376577 348 31-32 LOT ID\r
f6c18637 349 \r
350 TRACE - BLOCK 1\r
77376577 351 1-12 LOT ID \r
f6c18637 352 13-17 Wafer number\r
353 18-32 DW, die number sequential\r
354 */\r
355 \r
356 return 0;\r
357}\r
f38a1528 358\r
f6c18637 359int CmdInfo(const char *Cmd){\r
360 /*\r
361 Page 0 Block 0 Configuration data.\r
362 Normal mode\r
363 Extended mode\r
364 */\r
fbceacc5 365 char cmdp = param_getchar(Cmd, 0);\r
366\r
367 if (strlen(Cmd) > 1 || cmdp == 'h' || cmdp == 'H') {\r
4ecde0e1 368 usage_t55xx_info();\r
fbceacc5 369 return 0;\r
4ecde0e1 370 } else {\r
fbceacc5 371 CmdReadBlk("0");\r
081151ea 372 } \r
fbceacc5 373\r
c6be64da 374 uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};\r
8d0a3e87 375\r
376 manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bits, LF_BITSSTREAM_LEN);\r
f6c18637 377 \r
378 uint8_t si = 5;\r
8d0a3e87 379 uint32_t bl0 = PackBits(si, 32, bits);\r
f6c18637 380 \r
8d0a3e87 381 uint32_t safer = PackBits(si, 4, bits); si += 4; \r
382 uint32_t resv = PackBits(si, 7, bits); si += 7;\r
383 uint32_t dbr = PackBits(si, 3, bits); si += 3;\r
384 uint32_t extend = PackBits(si, 1, bits); si += 1;\r
385 uint32_t datamodulation = PackBits(si, 5, bits); si += 5;\r
386 uint32_t pskcf = PackBits(si, 2, bits); si += 2;\r
387 uint32_t aor = PackBits(si, 1, bits); si += 1; \r
388 uint32_t otp = PackBits(si, 1, bits); si += 1; \r
389 uint32_t maxblk = PackBits(si, 3, bits); si += 3;\r
390 uint32_t pwd = PackBits(si, 1, bits); si += 1; \r
391 uint32_t sst = PackBits(si, 1, bits); si += 1; \r
392 uint32_t fw = PackBits(si, 1, bits); si += 1;\r
393 uint32_t inv = PackBits(si, 1, bits); si += 1; \r
394 uint32_t por = PackBits(si, 1, bits); si += 1;\r
b44e5233 395 \r
f6c18637 396 PrintAndLog("");\r
99a71418 397 PrintAndLog("-- T55xx Configuration & Tag Information --------------------");\r
f6c18637 398 PrintAndLog("-------------------------------------------------------------");\r
399 PrintAndLog(" Safer key : %s", GetSaferStr(safer));\r
400 PrintAndLog(" reserved : %d", resv);\r
401 PrintAndLog(" Data bit rate : %s", GetBitRateStr(dbr));\r
402 PrintAndLog(" eXtended mode : %s", (extend) ? "Yes - Warning":"No");\r
403 PrintAndLog(" Modulation : %s", GetModulationStr(datamodulation) );\r
404 PrintAndLog(" PSK clock freq : %d", pskcf);\r
405 PrintAndLog(" AOR - Answer on Request : %s", (aor) ? "Yes":"No");\r
406 PrintAndLog(" OTP - One Time Pad : %s", (otp) ? "Yes - Warning":"No" );\r
407 PrintAndLog(" Max block : %d", maxblk);\r
408 PrintAndLog(" Password mode : %s", (pwd) ? "Yes":"No");\r
409 PrintAndLog(" Sequence Start Terminator : %s", (sst) ? "Yes":"No");\r
410 PrintAndLog(" Fast Write : %s", (fw) ? "Yes":"No");\r
411 PrintAndLog(" Inverse data : %s", (inv) ? "Yes":"No");\r
412 PrintAndLog(" POR-Delay : %s", (por) ? "Yes":"No");\r
413 PrintAndLog("-------------------------------------------------------------");\r
77376577 414 PrintAndLog(" Raw Data - Page 0");\r
8d0a3e87 415 PrintAndLog(" Block 0 : 0x%08X %s", bl0, sprint_bin(bits+5,32) );\r
f6c18637 416 PrintAndLog("-------------------------------------------------------------");\r
417 \r
418 return 0;\r
419}\r
420\r
77376577 421int CmdDump(const char *Cmd){\r
422\r
4ecde0e1 423 char s[20] = {0x00};\r
77376577 424 uint8_t pwd[4] = {0x00};\r
54a942b0 425\r
4ecde0e1 426 char cmdp = param_getchar(Cmd, 0);\r
149aeada 427 if ( cmdp == 'h' || cmdp == 'H') {\r
4ecde0e1 428 usage_t55xx_dump();\r
77376577 429 return 0;\r
430 }\r
4ecde0e1 431\r
432 bool hasPwd = ( strlen(Cmd) > 0); \r
77376577 433 if ( hasPwd ){\r
2ae8a312 434 if (param_gethex(Cmd, 0, pwd, 8)) {\r
435 PrintAndLog("password must include 8 HEX symbols");\r
c4e3b1b6 436 return 1;\r
77376577 437 }\r
438 }\r
a501c82b 439 \r
77376577 440 for ( int i = 0; i <8; ++i){\r
149aeada 441 memset(s,0,sizeof(s));\r
77376577 442 if ( hasPwd ) {\r
c6be64da 443 sprintf(s,"%d %02x%02x%02x%02x", i, pwd[0],pwd[1],pwd[2],pwd[3]);\r
77376577 444 } else {\r
445 sprintf(s,"%d", i);\r
77376577 446 }\r
4ecde0e1 447 CmdReadBlk(s);\r
77376577 448 }\r
449 return 0;\r
450}\r
451\r
7bd30f12 452int CmdIceFsk(const char *Cmd){\r
c6be64da 453\r
454 if (!HasGraphData()) return 0;\r
455\r
7bd30f12 456 iceFsk3(GraphBuffer, LF_TRACE_BUFF_SIZE);\r
7bd30f12 457 RepaintGraphWindow();\r
458 return 0;\r
459}\r
fbceacc5 460int CmdIceManchester(const char *Cmd){\r
72e930ef 461 ManchesterDemod( -1);\r
462 return 0;\r
463}\r
c6be64da 464int ManchesterDemod(int blockNum){\r
fbceacc5 465\r
c6be64da 466 if (!HasGraphData()) return 0;\r
467 \r
081151ea 468 uint8_t sizebyte = 32;\r
a501c82b 469 // the value 5 was selected during empirical studies of the decoded data. Some signal noise to skip.\r
081151ea 470 uint8_t offset = 5;\r
fbceacc5 471 uint32_t blockData;\r
c6be64da 472 uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};\r
fbceacc5 473 uint8_t * bitstream = bits;\r
474 \r
8d0a3e87 475 manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bits, LF_BITSSTREAM_LEN); \r
8d0a3e87 476 blockData = PackBits(offset, sizebyte, bits);\r
72e930ef 477\r
081151ea 478 if ( blockNum < 0)\r
479 PrintAndLog(" Decoded : 0x%08X %s", blockData, sprint_bin(bitstream+offset,sizebyte) );\r
480 else\r
481 PrintAndLog(" Block %d : 0x%08X %s", blockNum, blockData, sprint_bin(bitstream+offset,sizebyte) );\r
482 \r
fbceacc5 483 return 0;\r
484} \r
7bd30f12 485\r
f6c18637 486char * GetBitRateStr(uint32_t id){\r
487 static char buf[40];\r
488 char *retStr = buf;\r
489 switch (id){\r
490 case 0: \r
491 sprintf(retStr,"%d - RF/8",id);\r
492 break;\r
493 case 1:\r
494 sprintf(retStr,"%d - RF/16",id);\r
495 break;\r
496 case 2: \r
497 sprintf(retStr,"%d - RF/32",id);\r
498 break;\r
499 case 3:\r
500 sprintf(retStr,"%d - RF/40",id);\r
501 break;\r
502 case 4:\r
503 sprintf(retStr,"%d - RF/50",id);\r
504 break;\r
505 case 5:\r
506 sprintf(retStr,"%d - RF/64",id);\r
507 break;\r
508 case 6:\r
509 sprintf(retStr,"%d - RF/100",id);\r
510 break;\r
511 case 7:\r
512 sprintf(retStr,"%d - RF/128",id);\r
513 break;\r
514 default:\r
515 sprintf(retStr,"%d - (Unknown)",id);\r
516 break;\r
517 }\r
518\r
519 return buf;\r
520}\r
521\r
f6c18637 522char * GetSaferStr(uint32_t id){\r
523 static char buf[40];\r
524 char *retStr = buf;\r
525 \r
526 sprintf(retStr,"%d",id);\r
527 if (id == 6) {\r
528 sprintf(retStr,"%d - pasdwd",id);\r
529 }\r
530 if (id == 9 ){\r
531 sprintf(retStr,"%d - testmode ",id);\r
532 }\r
533 \r
534 return buf;\r
535}\r
536char * GetModulationStr( uint32_t id){\r
537 static char buf[40];\r
538 char *retStr = buf;\r
539 \r
540 switch (id){\r
541 case 0: \r
7bd30f12 542 sprintf(retStr,"%d - DIRECT (ASK/NRZ)",id);\r
f6c18637 543 break;\r
544 case 1:\r
545 sprintf(retStr,"%d - PSK 1 phase change when input changes",id);\r
546 break;\r
547 case 2: \r
548 sprintf(retStr,"%d - PSK 2 phase change on bitclk if input high",id);\r
549 break;\r
550 case 3:\r
551 sprintf(retStr,"%d - PSK 3 phase change on rising edge of input",id);\r
552 break;\r
553 case 4:\r
554 sprintf(retStr,"%d - FSK 1 RF/8 RF/5",id);\r
555 break;\r
556 case 5:\r
557 sprintf(retStr,"%d - FSK 2 RF/8 RF/10",id);\r
558 break;\r
559 case 6:\r
560 sprintf(retStr,"%d - FSK 1a RF/5 RF/8",id);\r
561 break;\r
562 case 7:\r
563 sprintf(retStr,"%d - FSK 2a RF/10 RF/8",id);\r
564 break;\r
565 case 8:\r
566 sprintf(retStr,"%d - Manschester",id);\r
567 break;\r
568 case 16:\r
569 sprintf(retStr,"%d - Biphase",id);\r
570 break;\r
571 case 17:\r
572 sprintf(retStr,"%d - Reserved",id);\r
573 break;\r
574 default:\r
575 sprintf(retStr,"0x%02X (Unknown)",id);\r
576 break;\r
577 }\r
578 return buf;\r
579}\r
580\r
581\r
582uint32_t PackBits(uint8_t start, uint8_t len, uint8_t* bits){\r
583 \r
584 int i = start;\r
585 int j = len-1;\r
3bc3598e 586 if (len > 32) {\r
587 return 0;\r
588 }\r
f6c18637 589 uint32_t tmp = 0;\r
590 for (; j >= 0; --j, ++i){\r
591 tmp |= bits[i] << j;\r
592 }\r
593 return tmp;\r
54a942b0 594}\r
595\r
596static command_t CommandTable[] =\r
597{\r
b44e5233 598 {"help", CmdHelp, 1, "This help"},\r
4ecde0e1 599 {"rd", CmdReadBlk, 0, "<block> [password] -- Read T55xx block data (page 0) [optional password]"},\r
600 {"wr", CmdWriteBlk, 0, "<block> <data> [password] -- Write T55xx block data (page 0) [optional password]"},\r
a61b4976 601 {"trace", CmdReadTrace, 0, "[1] Read T55xx traceability data (page 1/ blk 0-1)"},\r
602 {"info", CmdInfo, 0, "[1] Read T55xx configuration data (page 0/ blk 0)"},\r
4ecde0e1 603 {"dump", CmdDump, 0, "[password] Dump T55xx card block 0-7. [optional password]"},\r
72e930ef 604 {"man", CmdIceManchester, 0, "Manchester demod (with SST)"},\r
54a942b0 605 {NULL, NULL, 0, NULL}\r
606};\r
607\r
608int CmdLFT55XX(const char *Cmd)\r
609{\r
610 CmdsParse(CommandTable, Cmd);\r
611 return 0;\r
612}\r
613\r
614int CmdHelp(const char *Cmd)\r
615{\r
616 CmdsHelp(CommandTable);\r
617 return 0;\r
618}\r
Impressum, Datenschutz