]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/cmdlfviking.c
   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"); 
  49 uint64_t getVikingBits(uint32_t id
) { 
  50         uint8_t checksum 
= (id
>>24) ^ ((id
>>16) & 0xFF) ^ ((id
>>8) & 0xFF) ^ (id 
& 0xFF) ^ 0xF2 ^ 0xA8; 
  51         uint64_t ret 
= (uint64_t)0xF2 << 56; 
  57 //see ASKDemod for what args are accepted 
  58 int CmdVikingRead(const char *Cmd
) { 
  61         // get samples silently 
  62         getSamples("30000",false); 
  63         // demod and output viking ID    
  64         return CmdVikingDemod(Cmd
); 
  67 int CmdVikingClone(const char *Cmd
) { 
  71         char cmdp 
= param_getchar(Cmd
, 0); 
  72         if (strlen(Cmd
) < 0 || cmdp 
== 'h' || cmdp 
== 'H') return usage_lf_viking_clone(); 
  74         id 
= param_get32ex(Cmd
, 0, 0, 16); 
  75         if (id 
== 0) return usage_lf_viking_clone(); 
  77         cmdp 
= param_getchar(Cmd
, 1); 
  78         if ( cmdp 
== 'Q' || cmdp 
== 'q') 
  81         rawID 
= getVikingBits(id
); 
  83         UsbCommand c 
= {CMD_VIKING_CLONE_TAG
,{rawID 
>> 32, rawID 
& 0xFFFF, Q5
}}; 
  87         WaitForResponse(CMD_ACK
,NULL
); 
  91 int CmdVikingSim(const char *Cmd
) { 
  94         uint8_t clk 
= 32, encoding 
= 1, separator 
= 0, invert 
= 0; 
  96         char cmdp 
= param_getchar(Cmd
, 0); 
  97         if (strlen(Cmd
) < 0 || cmdp 
== 'h' || cmdp 
== 'H') return usage_lf_viking_sim(); 
  99         id 
= param_get32ex(Cmd
, 0, 0, 16); 
 100         if (id 
== 0) return usage_lf_viking_sim(); 
 102         rawID 
= getVikingBits(id
); 
 106         arg1 
= clk 
<< 8 | encoding
; 
 107         arg2 
= invert 
<< 8 | separator
; 
 109         UsbCommand c 
= {CMD_ASK_SIM_TAG
, {arg1
, arg2
, size
}}; 
 110         PrintAndLog("preparing to sim ask data: %d bits", size
); 
 111         num_to_bytebits(rawID
, 64, c
.d
.asBytes
); 
 112         clearCommandBuffer(); 
 117 static command_t CommandTable
[] = { 
 118     {"help",    CmdHelp
,                1, "This help"}, 
 119         {"read",        CmdVikingRead
,  0, "Attempt to read and Extract tag data"}, 
 120         {"clone",       CmdVikingClone
, 0, "<8 digit ID number> clone viking tag"}, 
 121         {"sim",         CmdVikingSim
,   0, "<8 digit ID number> simulate viking tag"}, 
 122     {NULL
, NULL
, 0, NULL
} 
 125 int CmdLFViking(const char *Cmd
) { 
 126     CmdsParse(CommandTable
, Cmd
); 
 130 int CmdHelp(const char *Cmd
) { 
 131     CmdsHelp(CommandTable
);