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