]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/cmdlfio.c
  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
);