]>
git.zerfleddert.de Git - proxmark3-svn/blob - client/cmdlfpac.c
1 //-----------------------------------------------------------------------------
3 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
4 // at your option, any later version. See the LICENSE.txt file for the text of
6 //-----------------------------------------------------------------------------
7 // Low frequency Stanley/PAC tag commands
8 // NRZ, RF/32, 128 bits long (unknown cs)
9 //-----------------------------------------------------------------------------
13 #include "proxmark3.h"
17 #include "cmdparser.h"
21 #include "lfdemod.h" // preamble test
23 static int CmdHelp(const char *Cmd
);
26 // find PAC preamble in already demoded data
27 int PacFind(uint8_t *dest
, size_t *size
) {
28 if (*size
< 128) return -1; //make sure buffer has data
30 uint8_t preamble
[] = {1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,1,0};
31 if (!preambleSearch(dest
, preamble
, sizeof(preamble
), size
, &startIdx
))
32 return -2; //preamble not found
33 if (*size
!= 128) return -3; //wrong demoded size
34 //return start position
38 //see NRZDemod for what args are accepted
39 int CmdPacDemod(const char *Cmd
) {
42 if (!NRZrawDemod(Cmd
, false)) {
43 if (g_debugMode
) PrintAndLog("DEBUG: Error - PAC: NRZ Demod failed");
46 size_t size
= DemodBufferLen
;
47 int ans
= PacFind(DemodBuffer
, &size
);
51 PrintAndLog("DEBUG: Error - PAC: too few bits found");
53 PrintAndLog("DEBUG: Error - PAC: preamble not found");
55 PrintAndLog("DEBUG: Error - PAC: Size not correct: %d", size
);
57 PrintAndLog("DEBUG: Error - PAC: ans: %d", ans
);
61 setDemodBuf(DemodBuffer
, 128, ans
);
62 setClockGrid(g_DemodClock
, g_DemodStartIdx
+ (ans
*g_DemodClock
));
65 uint32_t raw1
= bytebits_to_byte(DemodBuffer
, 32);
66 uint32_t raw2
= bytebits_to_byte(DemodBuffer
+32, 32);
67 uint32_t raw3
= bytebits_to_byte(DemodBuffer
+64, 32);
68 uint32_t raw4
= bytebits_to_byte(DemodBuffer
+96, 32);
70 // preamble then appears to have marker bits of "10" CS?
71 // 11111111001000000 10 01001100 10 00001101 10 00001101 10 00001101 10 00001101 10 00001101 10 00001101 10 00001101 10 00001101 10 10001100 10 100000001
72 // unknown checksum 9 bits at the end
74 PrintAndLog("PAC/Stanley Tag Found -- Raw: %08X%08X%08X%08X", raw1
,raw2
, raw3
, raw4
);
75 PrintAndLog("\nHow the Raw ID is translated by the reader is unknown");
79 int CmdPacRead(const char *Cmd
) {
80 lf_read(true, 4096*2 + 20);
81 return CmdPacDemod(Cmd
);
84 static command_t CommandTable
[] = {
85 {"help", CmdHelp
, 1, "This help"},
86 {"demod", CmdPacDemod
,1, "Attempt to read and extract tag data from the GraphBuffer"},
87 {"read", CmdPacRead
, 0, "Attempt to read and extract tag data from the antenna"},
91 int CmdLFPac(const char *Cmd
) {
93 CmdsParse(CommandTable
, Cmd
);
97 int CmdHelp(const char *Cmd
) {
98 CmdsHelp(CommandTable
);