]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/cmdlfio.c
1b43d7dd9c0faf4f74910917665803d1d102c727
11 #include "cmdparser.h"
15 #include "lfdemod.h" //for IOdemodFSK + bytebits_to_byte
16 #include "util.h" //for sprint_bin_break
18 static int CmdHelp(const char *Cmd
);
20 int CmdIOReadFSK(const char *Cmd
)
23 if(Cmd
[0]=='1') findone
=1;
25 UsbCommand c
={CMD_IO_DEMOD_FSK
};
32 //IO-Prox demod - FSK RF/64 with preamble of 000000001
33 //print ioprox ID and some format details
34 int CmdFSKdemodIO(const char *Cmd
)
37 //something in graphbuffer?
38 if (GraphTraceLen
< 65) {
39 if (g_debugMode
)PrintAndLog("DEBUG: not enough samples in GraphBuffer");
42 uint8_t BitStream
[MAX_GRAPH_TRACE_LEN
]={0};
43 size_t BitLen
= getFromGraphBuf(BitStream
);
44 if (BitLen
==0) return 0;
46 //get binary from fsk wave
47 idx
= IOdemodFSK(BitStream
,BitLen
);
51 PrintAndLog("DEBUG: Just Noise Detected");
52 } else if (idx
== -2) {
53 PrintAndLog("DEBUG: not enough samples");
54 } else if (idx
== -3) {
55 PrintAndLog("DEBUG: error during fskdemod");
56 } else if (idx
== -4) {
57 PrintAndLog("DEBUG: Preamble not found");
58 } else if (idx
== -5) {
59 PrintAndLog("DEBUG: Separator bits not found");
61 PrintAndLog("DEBUG: Error demoding fsk %d", idx
);
68 PrintAndLog("DEBUG: IO Prox Data not found - FSK Bits: %d",BitLen
);
69 if (BitLen
> 92) PrintAndLog("%s", sprint_bin_break(BitStream
,92,16));
76 //01234567 8 90123456 7 89012345 6 78901234 5 67890123 4 56789012 3 45678901 23
77 //-----------------------------------------------------------------------------
78 //00000000 0 11110000 1 facility 1 version* 1 code*one 1 code*two 1 ???????? 11
80 //XSF(version)facility:codeone+codetwo (raw)
83 if (g_debugMode
) PrintAndLog("not enough bits found - bitlen: %d",BitLen
);
86 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]);
87 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]);
88 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]);
89 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]);
90 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]);
91 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]);
92 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]);
94 uint32_t code
= bytebits_to_byte(BitStream
+idx
,32);
95 uint32_t code2
= bytebits_to_byte(BitStream
+idx
+32,32);
96 uint8_t version
= bytebits_to_byte(BitStream
+idx
+27,8); //14,4
97 uint8_t facilitycode
= bytebits_to_byte(BitStream
+idx
+18,8) ;
98 uint16_t number
= (bytebits_to_byte(BitStream
+idx
+36,8)<<8)|(bytebits_to_byte(BitStream
+idx
+45,8)); //36,9
99 uint8_t crc
= bytebits_to_byte(BitStream
+idx
+54,8);
100 uint16_t calccrc
= 0;
102 for (uint8_t i
=1; i
<6; ++i
){
103 calccrc
+= bytebits_to_byte(BitStream
+idx
+9*i
,8);
106 calccrc
= 0xff - calccrc
;
108 char *crcStr
= (crc
== calccrc
) ? "crc ok": "!crc";
110 PrintAndLog("IO Prox XSF(%02d)%02x:%05d (%08x%08x) [%02x %s]",version
,facilitycode
,number
,code
,code2
, crc
, crcStr
);
111 setDemodBuf(BitStream
,64,idx
);
113 PrintAndLog("DEBUG: idx: %d, Len: %d, Printing demod buffer:",idx
,64);
119 int CmdIOClone(const char *Cmd
)
121 unsigned int hi
= 0, lo
= 0;
126 //if (1 == sscanf(str, "0x%"SCNx32, &hi)) {
127 // value now contains the value in the string--decimal 255, in this case.
130 while (sscanf(&Cmd
[i
++], "%1x", &n
) == 1) {
131 hi
= (hi
<< 4) | (lo
>> 28);
132 lo
= (lo
<< 4) | (n
& 0xf);
135 PrintAndLog("Cloning tag with ID %08x %08x", hi
, lo
);
136 PrintAndLog("Press pm3-button to abort simulation");
137 c
.cmd
= CMD_IO_CLONE_TAG
;
145 static command_t CommandTable
[] =
147 {"help", CmdHelp
, 1, "This help"},
148 {"demod", CmdFSKdemodIO
, 1, "Demodulate IO Prox tag from the GraphBuffer"},
149 {"read", CmdIOReadFSK
, 0, "['1'] Realtime IO FSK demodulate from antenna (option '1' for one tag only)"},
150 {"clone", CmdIOClone
, 0, "Clone ioProx Tag"},
151 {NULL
, NULL
, 0, NULL
}
154 int CmdLFIO(const char *Cmd
)
156 CmdsParse(CommandTable
, Cmd
);
160 int CmdHelp(const char *Cmd
)
162 CmdsHelp(CommandTable
);