]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/cmdlfviking.c
779156c8d9d4301708c6c1ab0a0153c6ab5c4e62
   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 (AKA FDI Matalec Transit) 
   8 // ASK/Manchester, RF/32, 64 bits (complete) 
   9 //----------------------------------------------------------------------------- 
  13 #include "proxmark3.h" 
  14 #include "cmdlfviking.h" 
  18 #include "cmdparser.h" 
  23 static int CmdHelp(const char *Cmd
); 
  25 int usage_lf_viking_clone(void) { 
  26         PrintAndLog("clone a Viking AM tag to a T55x7 tag."); 
  27         PrintAndLog("Usage: lf viking clone <Card ID - 8 hex digits> <Q5>"); 
  28   PrintAndLog("Options :"); 
  29   PrintAndLog("  <Card Number>  : 8 digit hex viking card number"); 
  30   PrintAndLog("  <Q5>           : specify write to Q5 (t5555 instead of t55x7)"); 
  32   PrintAndLog("Sample  : lf viking clone 1A337 Q5"); 
  36 int usage_lf_viking_sim(void) { 
  37   PrintAndLog("Enables simulation of viking card with specified card number."); 
  38   PrintAndLog("Simulation runs until the button is pressed or another USB command is issued."); 
  39   PrintAndLog("Per viking format, the card number is 8 digit hex number.  Larger values are truncated."); 
  41   PrintAndLog("Usage:  lf viking sim <Card-Number>"); 
  42   PrintAndLog("Options :"); 
  43   PrintAndLog("  <Card Number>   : 8 digit hex viking card number"); 
  45   PrintAndLog("Sample  : lf viking sim 1A337"); 
  49 uint64_t getVikingBits(uint32_t id
) { 
  51         uint8_t checksum 
= ((id
>>24) & 0xFF) ^ ((id
>>16) & 0xFF) ^ ((id
>>8) & 0xFF) ^ (id 
& 0xFF) ^ 0xF2 ^ 0xA8; 
  52         return ((uint64_t)0xF2 << 56) | ((uint64_t)id 
<< 8) | checksum
; 
  56 //see ASKDemod for what args are accepted 
  57 int CmdVikingDemod(const char *Cmd
) { 
  58         if (!ASKDemod(Cmd
, false, false, 1)) { 
  59                 if (g_debugMode
) PrintAndLog("ASKDemod failed"); 
  62         size_t size 
= DemodBufferLen
; 
  63         //call lfdemod.c demod for Viking 
  64         int ans 
= VikingDemod_AM(DemodBuffer
, &size
); 
  66                 if (g_debugMode
) PrintAndLog("Error Viking_Demod %d", ans
); 
  70         uint32_t raw1 
= bytebits_to_byte(DemodBuffer
+ans
, 32); 
  71         uint32_t raw2 
= bytebits_to_byte(DemodBuffer
+ans
+32, 32); 
  72         uint32_t cardid 
= bytebits_to_byte(DemodBuffer
+ans
+24, 32); 
  73         uint8_t  checksum 
= bytebits_to_byte(DemodBuffer
+ans
+32+24, 8); 
  74         PrintAndLog("Viking Tag Found: Card ID %08X, Checksum: %02X", cardid
, (unsigned int) checksum
); 
  75         PrintAndLog("Raw: %08X%08X", raw1
,raw2
); 
  76         setDemodBuf(DemodBuffer
, 64, ans
); 
  77         setClockGrid(g_DemodClock
, g_DemodStartIdx 
+ (ans
*g_DemodClock
)); 
  82 //see ASKDemod for what args are accepted 
  83 int CmdVikingRead(const char *Cmd
) { 
  86         // demod and output viking ID    
  87         return CmdVikingDemod(Cmd
); 
  90 int CmdVikingClone(const char *Cmd
) { 
  94         char cmdp 
= param_getchar(Cmd
, 0); 
  95         if (strlen(Cmd
) == 0 || cmdp 
== 'h' || cmdp 
== 'H') return usage_lf_viking_clone(); 
  97         id 
= param_get32ex(Cmd
, 0, 0, 16); 
  98         if (id 
== 0) return usage_lf_viking_clone(); 
  99         if (param_getchar(Cmd
, 1)=='Q' || param_getchar(Cmd
, 1)=='q') 
 102         rawID 
= getVikingBits(id
); 
 103         PrintAndLog("Cloning - ID: %08X, Raw: %08X%08X",id
,(uint32_t)(rawID 
>> 32),(uint32_t) (rawID 
& 0xFFFFFFFF)); 
 104         UsbCommand c 
= {CMD_VIKING_CLONE_TAG
,{rawID 
>> 32, rawID 
& 0xFFFFFFFF, Q5
}}; 
 105         clearCommandBuffer(); 
 108         WaitForResponse(CMD_ACK
,NULL
); 
 112 int CmdVikingSim(const char *Cmd
) { 
 115         uint8_t clk 
= 32, encoding 
= 1, separator 
= 0, invert 
= 0; 
 116         char cmdp 
= param_getchar(Cmd
, 0); 
 118         if (strlen(Cmd
) == 0 || cmdp 
== 'h' || cmdp 
== 'H') return usage_lf_viking_sim(); 
 119         id 
= param_get32ex(Cmd
, 0, 0, 16); 
 120         if (id 
== 0) return usage_lf_viking_sim(); 
 122         rawID 
= getVikingBits(id
); 
 126   arg1 
= clk 
<< 8 | encoding
; 
 127   arg2 
= invert 
<< 8 | separator
; 
 129   UsbCommand c 
= {CMD_ASK_SIM_TAG
, {arg1
, arg2
, size
}}; 
 130   PrintAndLog("preparing to sim ask data: %d bits", size
); 
 131   num_to_bytebits(rawID
, 64, c
.d
.asBytes
); 
 132         clearCommandBuffer(); 
 137 static command_t CommandTable
[] = { 
 138         {"help",  CmdHelp
,        1, "This help"}, 
 139         {"demod", CmdVikingDemod
, 1, "Demodulate a Viking tag from the GraphBuffer"}, 
 140         {"read",  CmdVikingRead
,  0, "Attempt to read and Extract tag data from the antenna"}, 
 141         {"clone", CmdVikingClone
, 0, "<8 digit ID number> clone viking tag"}, 
 142         {"sim",   CmdVikingSim
,   0, "<8 digit ID number> simulate viking tag"}, 
 143         {NULL
, NULL
, 0, NULL
} 
 146 int CmdLFViking(const char *Cmd
) { 
 147         CmdsParse(CommandTable
, Cmd
); 
 151 int CmdHelp(const char *Cmd
) { 
 152         CmdsHelp(CommandTable
);