]>
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;
56 //get binary from fsk wave
57 idx
= IOdemodFSK(BitStream
,BitLen
);
61 PrintAndLog("DEBUG: Just Noise Detected");
62 } else if (idx
== -2) {
63 PrintAndLog("DEBUG: not enough samples");
64 } else if (idx
== -3) {
65 PrintAndLog("DEBUG: error during fskdemod");
66 } else if (idx
== -4) {
67 PrintAndLog("DEBUG: Preamble not found");
68 } else if (idx
== -5) {
69 PrintAndLog("DEBUG: Separator bits not found");
71 PrintAndLog("DEBUG: Error demoding fsk %d", idx
);
78 PrintAndLog("DEBUG: IO Prox Data not found - FSK Bits: %d",BitLen
);
79 if (BitLen
> 92) PrintAndLog("%s", sprint_bin_break(BitStream
,92,16));
86 //01234567 8 90123456 7 89012345 6 78901234 5 67890123 4 56789012 3 45678901 23
87 //-----------------------------------------------------------------------------
88 //00000000 0 11110000 1 facility 1 version* 1 code*one 1 code*two 1 ???????? 11
90 //XSF(version)facility:codeone+codetwo (raw)
93 if (g_debugMode
) PrintAndLog("not enough bits found - bitlen: %d",BitLen
);
96 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]);
97 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]);
98 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]);
99 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]);
100 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]);
101 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]);
102 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]);
104 uint32_t code
= bytebits_to_byte(BitStream
+idx
,32);
105 uint32_t code2
= bytebits_to_byte(BitStream
+idx
+32,32);
106 uint8_t version
= bytebits_to_byte(BitStream
+idx
+27,8); //14,4
107 uint8_t facilitycode
= bytebits_to_byte(BitStream
+idx
+18,8) ;
108 uint16_t number
= (bytebits_to_byte(BitStream
+idx
+36,8)<<8)|(bytebits_to_byte(BitStream
+idx
+45,8)); //36,9
109 uint8_t crc
= bytebits_to_byte(BitStream
+idx
+54,8);
110 uint16_t calccrc
= 0;
112 for (uint8_t i
=1; i
<6; ++i
){
113 calccrc
+= bytebits_to_byte(BitStream
+idx
+9*i
,8);
116 calccrc
= 0xff - calccrc
;
118 char *crcStr
= (crc
== calccrc
) ? "crc ok": "!crc";
120 PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x) [%02x %s]",version
,facilitycode
,number
,code
,code2
, crc
, crcStr
);
121 setDemodBuf(BitStream
,64,idx
);
122 setClockGrid(g_DemodClock
, g_DemodStartIdx
+ (idx
*g_DemodClock
));
125 PrintAndLog("DEBUG: idx: %d, Len: %d, Printing demod buffer:",idx
,64);
131 int CmdIOClone(const char *Cmd
)
133 unsigned int hi
= 0, lo
= 0;
138 //if (1 == sscanf(str, "0x%"SCNx32, &hi)) {
139 // value now contains the value in the string--decimal 255, in this case.
142 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
143 hi
= (hi
<< 4) | (lo
>> 28);
144 lo
= (lo
<< 4) | (n
& 0xf);
147 PrintAndLog("Cloning tag with ID %08x %08x", hi
, lo
);
148 PrintAndLog("Press pm3-button to abort simulation");
149 c
.cmd
= CMD_IO_CLONE_TAG
;
157 static command_t CommandTable
[] =
159 {"help", CmdHelp
, 1, "This help"},
160 {"demod", CmdFSKdemodIO
, 1, "Demodulate IO Prox tag from the GraphBuffer"},
161 {"read", CmdIOReadFSK
, 0, "['1'] Realtime IO FSK demodulate from antenna (option '1' for one tag only)"},
162 {"clone", CmdIOClone
, 0, "Clone ioProx Tag"},
163 {NULL
, NULL
, 0, NULL
}
166 int CmdLFIO(const char *Cmd
)
168 CmdsParse(CommandTable
, Cmd
);
172 int CmdHelp(const char *Cmd
)
174 CmdsHelp(CommandTable
);