]>
git.zerfleddert.de Git - proxmark3-svn/blob - client/cmdlfio.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 ioProx commands
8 // FSK2a, rf/64, 64 bits (complete)
9 //-----------------------------------------------------------------------------
17 #include "proxmark3.h"
21 #include "cmdparser.h"
25 #include "lfdemod.h" //for IOdemodFSK + bytebits_to_byte
26 #include "util.h" //for sprint_bin_break
28 static int CmdHelp(const char *Cmd
);
30 int CmdIOReadFSK(const char *Cmd
)
33 if(Cmd
[0]=='1') findone
=1;
35 UsbCommand c
={CMD_IO_DEMOD_FSK
};
42 //IO-Prox demod - FSK RF/64 with preamble of 000000001
43 //print ioprox ID and some format details
44 int CmdFSKdemodIO(const char *Cmd
)
47 //something in graphbuffer?
48 if (GraphTraceLen
< 65) {
49 if (g_debugMode
)PrintAndLog("DEBUG: not enough samples in GraphBuffer");
52 uint8_t BitStream
[MAX_GRAPH_TRACE_LEN
]={0};
53 size_t BitLen
= getFromGraphBuf(BitStream
);
54 if (BitLen
==0) return 0;
57 //get binary from fsk wave
58 idx
= IOdemodFSK(BitStream
,BitLen
, &waveIdx
);
62 PrintAndLog("DEBUG: Just Noise Detected");
63 } else if (idx
== -2) {
64 PrintAndLog("DEBUG: not enough samples");
65 } else if (idx
== -3) {
66 PrintAndLog("DEBUG: error during fskdemod");
67 } else if (idx
== -4) {
68 PrintAndLog("DEBUG: Preamble not found");
69 } else if (idx
== -5) {
70 PrintAndLog("DEBUG: Separator bits not found");
72 PrintAndLog("DEBUG: Error demoding fsk %d", idx
);
79 PrintAndLog("DEBUG: IO Prox Data not found - FSK Bits: %d",BitLen
);
80 if (BitLen
> 92) PrintAndLog("%s", sprint_bin_break(BitStream
,92,16));
87 //01234567 8 90123456 7 89012345 6 78901234 5 67890123 4 56789012 3 45678901 23
88 //-----------------------------------------------------------------------------
89 //00000000 0 11110000 1 facility 1 version* 1 code*one 1 code*two 1 ???????? 11
91 //XSF(version)facility:codeone+codetwo (raw)
94 if (g_debugMode
) PrintAndLog("not enough bits found - bitlen: %d",BitLen
);
97 PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream
[idx
], BitStream
[idx
+1], BitStream
[idx
+2], BitStream
[idx
+3], BitStream
[idx
+4], BitStream
[idx
+5], BitStream
[idx
+6], BitStream
[idx
+7], BitStream
[idx
+8]);
98 PrintAndLog("%d%d%d%d%d%d%d%d %d",BitStream
[idx
+9], BitStream
[idx
+10], BitStream
[idx
+11],BitStream
[idx
+12],BitStream
[idx
+13],BitStream
[idx
+14],BitStream
[idx
+15],BitStream
[idx
+16],BitStream
[idx
+17]);
99 PrintAndLog("%d%d%d%d%d%d%d%d %d facility",BitStream
[idx
+18], BitStream
[idx
+19], BitStream
[idx
+20],BitStream
[idx
+21],BitStream
[idx
+22],BitStream
[idx
+23],BitStream
[idx
+24],BitStream
[idx
+25],BitStream
[idx
+26]);
100 PrintAndLog("%d%d%d%d%d%d%d%d %d version",BitStream
[idx
+27], BitStream
[idx
+28], BitStream
[idx
+29],BitStream
[idx
+30],BitStream
[idx
+31],BitStream
[idx
+32],BitStream
[idx
+33],BitStream
[idx
+34],BitStream
[idx
+35]);
101 PrintAndLog("%d%d%d%d%d%d%d%d %d code1",BitStream
[idx
+36], BitStream
[idx
+37], BitStream
[idx
+38],BitStream
[idx
+39],BitStream
[idx
+40],BitStream
[idx
+41],BitStream
[idx
+42],BitStream
[idx
+43],BitStream
[idx
+44]);
102 PrintAndLog("%d%d%d%d%d%d%d%d %d code2",BitStream
[idx
+45], BitStream
[idx
+46], BitStream
[idx
+47],BitStream
[idx
+48],BitStream
[idx
+49],BitStream
[idx
+50],BitStream
[idx
+51],BitStream
[idx
+52],BitStream
[idx
+53]);
103 PrintAndLog("%d%d%d%d%d%d%d%d %d%d checksum",BitStream
[idx
+54],BitStream
[idx
+55],BitStream
[idx
+56],BitStream
[idx
+57],BitStream
[idx
+58],BitStream
[idx
+59],BitStream
[idx
+60],BitStream
[idx
+61],BitStream
[idx
+62],BitStream
[idx
+63]);
105 uint32_t code
= bytebits_to_byte(BitStream
+idx
,32);
106 uint32_t code2
= bytebits_to_byte(BitStream
+idx
+32,32);
107 uint8_t version
= bytebits_to_byte(BitStream
+idx
+27,8); //14,4
108 uint8_t facilitycode
= bytebits_to_byte(BitStream
+idx
+18,8) ;
109 uint16_t number
= (bytebits_to_byte(BitStream
+idx
+36,8)<<8)|(bytebits_to_byte(BitStream
+idx
+45,8)); //36,9
110 uint8_t crc
= bytebits_to_byte(BitStream
+idx
+54,8);
111 uint16_t calccrc
= 0;
113 for (uint8_t i
=1; i
<6; ++i
){
114 calccrc
+= bytebits_to_byte(BitStream
+idx
+9*i
,8);
117 calccrc
= 0xff - calccrc
;
119 char *crcStr
= (crc
== calccrc
) ? "crc ok": "!crc";
121 PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x) [%02x %s]",version
,facilitycode
,number
,code
,code2
, crc
, crcStr
);
122 setDemodBuf(BitStream
,64,idx
);
123 setClockGrid(64, waveIdx
+ (idx
*64));
126 PrintAndLog("DEBUG: idx: %d, Len: %d, Printing demod buffer:",idx
,64);
132 int CmdIOClone(const char *Cmd
)
134 unsigned int hi
= 0, lo
= 0;
139 //if (1 == sscanf(str, "0x%"SCNx32, &hi)) {
140 // value now contains the value in the string--decimal 255, in this case.
143 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
144 hi
= (hi
<< 4) | (lo
>> 28);
145 lo
= (lo
<< 4) | (n
& 0xf);
148 PrintAndLog("Cloning tag with ID %08x %08x", hi
, lo
);
149 PrintAndLog("Press pm3-button to abort simulation");
150 c
.cmd
= CMD_IO_CLONE_TAG
;
158 static command_t CommandTable
[] =
160 {"help", CmdHelp
, 1, "This help"},
161 {"demod", CmdFSKdemodIO
, 1, "Demodulate IO Prox tag from the GraphBuffer"},
162 {"read", CmdIOReadFSK
, 0, "['1'] Realtime IO FSK demodulate from antenna (option '1' for one tag only)"},
163 {"clone", CmdIOClone
, 0, "Clone ioProx Tag"},
164 {NULL
, NULL
, 0, NULL
}
167 int CmdLFIO(const char *Cmd
)
169 CmdsParse(CommandTable
, Cmd
);
173 int CmdHelp(const char *Cmd
)
175 CmdsHelp(CommandTable
);