]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/cmdlfviking.c
551718e42f8dbe2879b180fef318bd492108031c
   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 Viking tag commands 
   8 //----------------------------------------------------------------------------- 
  12 #include "proxmark3.h" 
  16 #include "cmdparser.h" 
  20 #include "cmdlfviking.h" 
  22 static int CmdHelp(const char *Cmd
); 
  24 int usage_lf_viking_clone(void) { 
  25         PrintAndLog("clone a Viking AM tag to a T55x7 tag."); 
  26         PrintAndLog("Usage: lf viking clone <Card ID - 8 hex digits> <Q5>"); 
  27   PrintAndLog("Options :"); 
  28   PrintAndLog("  <Card Number>  : 8 digit hex viking card number"); 
  29   PrintAndLog("  <Q5>           : specify write to Q5 (t5555 instead of t55x7)"); 
  31   PrintAndLog("Sample  : lf viking clone 1A337 Q5"); 
  35 int usage_lf_viking_sim(void) { 
  36   PrintAndLog("Enables simulation of viking card with specified card number."); 
  37   PrintAndLog("Simulation runs until the button is pressed or another USB command is issued."); 
  38   PrintAndLog("Per viking format, the card number is 8 digit hex number.  Larger values are truncated."); 
  40   PrintAndLog("Usage:  lf viking sim <Card-Number>"); 
  41   PrintAndLog("Options :"); 
  42   PrintAndLog("  <Card Number>   : 8 digit hex viking card number"); 
  44   PrintAndLog("Sample  : lf viking sim 1A337"); 
  48 uint64_t getVikingBits(uint32_t id
) { 
  50         uint8_t checksum 
= (id
>>24) ^ ((id
>>16) & 0xFF) ^ ((id
>>8) & 0xFF) ^ (id 
& 0xFF) ^ 0xF2 ^ 0xA8; 
  51         return (0xF2 << 56) | (id 
<< 8) | checksum
; 
  54 //see ASKDemod for what args are accepted 
  55 int CmdVikingRead(const char *Cmd
) { 
  58         // get samples silently 
  59         getSamples("30000",false); 
  60         // demod and output viking ID    
  61         return CmdVikingDemod(Cmd
); 
  64 int CmdVikingClone(const char *Cmd
) { 
  68         char cmdp 
= param_getchar(Cmd
, 0); 
  69         if (strlen(Cmd
) < 0 || cmdp 
== 'h' || cmdp 
== 'H') return usage_lf_viking_clone(); 
  71         id 
= param_get32ex(Cmd
, 0, 0, 16) 
  72         if (id 
== 0) return usage_lf_viking_clone(); 
  73         if (param_getchar(Cmd
, 1)=='Q' || param_getchar(Cmd
, 1)=='q') 
  76         rawID 
= getVikingBits(id
); 
  78         UsbCommand c 
= {CMD_VIKING_CLONE_TAG
,{rawID 
>> 32, rawID 
& 0xFFFF, Q5
}}; 
  82         WaitForResponse(CMD_ACK
,NULL
); 
  86 int CmdVikingSim(const char *Cmd
) { 
  89         uint8_t clk 
= 32, encoding 
= 1, separator 
= 0, invert 
= 0; 
  91         if (strlen(Cmd
) < 0 || cmdp 
== 'h' || cmdp 
== 'H') return usage_lf_viking_sim(); 
  92         id 
= param_get32ex(Cmd
, 0, 0, 16) 
  93         if (id 
== 0) return usage_lf_viking_sim(); 
  95         rawID 
= getVikingBits(id
); 
  99   arg1 
= clk 
<< 8 | encoding
; 
 100   arg2 
= invert 
<< 8 | separator
; 
 102   UsbCommand c 
= {CMD_ASK_SIM_TAG
, {arg1
, arg2
, size
}}; 
 103   PrintAndLog("preparing to sim ask data: %d bits", size
); 
 104   num_to_bytebits(rawID
, 64, c
.d
.asBytes
); 
 105         clearCommandBuffer(); 
 109 static command_t CommandTable
[] = { 
 110         {"help",  CmdHelp
,        1, "This help"}, 
 111         {"read",  CmdVikingRead
,  0, "Attempt to read and Extract tag data"}, 
 112         {"clone", CmdVikingClone
, 0, "<8 digit ID number> clone viking tag"}, 
 113         {"sim",   CmdVikingSim
,   0, "<8 digit ID number> simulate viking tag"}, 
 114         {NULL
, NULL
, 0, NULL
} 
 117 int CmdLFViking(const char *Cmd
) { 
 118         CmdsParse(CommandTable
, Cmd
); 
 122 int CmdHelp(const char *Cmd
) { 
 123         CmdsHelp(CommandTable
);