]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/cmdlfcotag.c
ca163480595dd39f2c5e35633638035d0a3d2439
   1 //----------------------------------------------------------------------------- 
   4 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   5 // at your option, any later version. See the LICENSE.txt file for the text of 
   7 //----------------------------------------------------------------------------- 
   8 // Low frequency COTAG commands 
   9 //----------------------------------------------------------------------------- 
  13 #include "proxmark3.h" 
  16 #include "cmdlfcotag.h" 
  21 static int CmdHelp(const char *Cmd
); 
  23 int usage_lf_cotag_read(void){ 
  24         PrintAndLog("Usage: lf COTAG read [h] <signaldata>"); 
  25         PrintAndLog("Options:"); 
  26         PrintAndLog("      h          : This help"); 
  27         PrintAndLog("      <0|1|2>    : 0 - HIGH/LOW signal; maxlength bigbuff"); 
  28         PrintAndLog("                 : 1 - translation of HI/LO into bytes with manchester 0,1"); 
  29         PrintAndLog("                 : 2 - raw signal; maxlength bigbuff"); 
  31         PrintAndLog("Sample:"); 
  32         PrintAndLog("        lf cotag read 0"); 
  33         PrintAndLog("        lf cotag read 1"); 
  37 // COTAG demod should be able to use GraphBuffer, 
  38 // when data load samples 
  39 int CmdCOTAGDemod(const char *Cmd
) { 
  41         uint8_t bits
[COTAG_BITS
] = {0}; 
  42         size_t bitlen 
= COTAG_BITS
; 
  43         memcpy(bits
, DemodBuffer
, COTAG_BITS
); 
  46         int err 
= manrawdecode(bits
, &bitlen
, 1, &alignPos
); 
  48                 if (g_debugMode
) PrintAndLog("DEBUG: Error - COTAG too many errors: %d", err
); 
  52         setDemodBuf(bits
, bitlen
, 0); 
  55         uint16_t cn 
= bytebits_to_byteLSBF(bits
+1, 16); 
  56         uint32_t fc 
= bytebits_to_byteLSBF(bits
+1+16, 8); 
  58         uint32_t raw1 
= bytebits_to_byteLSBF(bits
, 32); 
  59         uint32_t raw2 
= bytebits_to_byteLSBF(bits
+32, 32); 
  60         uint32_t raw3 
= bytebits_to_byteLSBF(bits
+64, 32); 
  61         uint32_t raw4 
= bytebits_to_byteLSBF(bits
+96, 32); 
  64         fc 161:   1010 0001 -> LSB 1000 0101 
  65         cn 33593  1000 0011 0011 1001 -> LSB 1001 1100 1100 0001 
  66         cccc cccc cccc cccc                     ffffffff 
  67           0 1001 1100 1100 0001 1000 0101 0000 0000 100001010000000001111011100000011010000010000000000000000000000000000000000000000000000000000000100111001100000110000101000 
  68         1001 1100 1100 0001                     10000101                                                                                          
  70         PrintAndLog("COTAG Found: FC %u, CN: %u Raw: %08X%08X%08X%08X", fc
, cn
, raw1 
,raw2
, raw3
, raw4
); 
  74 // When reading a COTAG. 
  75 // 0 = HIGH/LOW signal - maxlength bigbuff 
  76 // 1 = translation for HI/LO into bytes with manchester 0,1 - length 300 
  77 // 2 = raw signal -  maxlength bigbuff           
  78 int CmdCOTAGRead(const char *Cmd
) { 
  80         if (Cmd
[0] == 'h' || Cmd
[0] == 'H') return usage_lf_cotag_read(); 
  82         uint32_t rawsignal 
= 1; 
  83         sscanf(Cmd
, "%u", &rawsignal
); 
  85         UsbCommand c 
= {CMD_COTAG
, {rawsignal
, 0, 0}}; 
  88         if ( !WaitForResponseTimeout(CMD_ACK
, NULL
, 7000) ) { 
  89                 PrintAndLog("command execution time out"); 
  98                         getSamples(0, true); break; 
 102                         DemodBufferLen 
= COTAG_BITS
; 
 103                         if (!GetFromBigBuf(DemodBuffer
, COTAG_BITS
, 0, &response
, 1000, true)) { 
 104                                 PrintAndLog("timeout while waiting for reply."); 
 107                         return CmdCOTAGDemod(""); 
 113 static command_t CommandTable
[] = { 
 114         {"help",      CmdHelp
,         1, "This help"}, 
 115         {"demod",     CmdCOTAGDemod
,   1, "Tries to decode a COTAG signal"}, 
 116         {"read",      CmdCOTAGRead
,    0, "Attempt to read and extract tag data"}, 
 117         {NULL
, NULL
, 0, NULL
} 
 120 int CmdLFCOTAG(const char *Cmd
) { 
 121         clearCommandBuffer(); 
 122         CmdsParse(CommandTable
, Cmd
); 
 126 int CmdHelp(const char *Cmd
) { 
 127         CmdsHelp(CommandTable
);