]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdlfpcf7931.c
I just merged @marshmellow's branch "iclass" and that was a lot of new functionality...
[proxmark3-svn] / client / cmdlfpcf7931.c
index 0d8fb93d4c2d89024d26507f8039e2657a66b4b5..9a40dcd8d0f0bda94fff35c2482ee335a417fe0b 100644 (file)
@@ -1,13 +1,13 @@
 //-----------------------------------------------------------------------------
 // Copyright (C) 2012 Chalk <chalk.secu at gmail.com>
-//
+//               2015 Dake <thomas.cayrou at gmail.com>
+
 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
 // at your option, any later version. See the LICENSE.txt file for the text of
 // the license.
 //-----------------------------------------------------------------------------
 // Low frequency PCF7931 commands
 //-----------------------------------------------------------------------------
-
 #include <stdio.h>
 #include <string.h>
 #include "proxmark3.h"
 
 static int CmdHelp(const char *Cmd);
 
+struct pcf7931_config configPcf = {{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},17500,{0,0}};
+
+int usage_pcf7931_read()
+{
+       PrintAndLog("Usage: lf pcf7931 read [h] ");
+       PrintAndLog("This command tries to read a PCF7931 tag.");
+       PrintAndLog("Options:        ");
+       PrintAndLog("       h             This help");
+       PrintAndLog("Examples:");
+       PrintAndLog("      lf pcf7931 read");
+       return 0;
+}
+
 int CmdLFPCF7931Read(const char *Cmd)
 {
-  UsbCommand c = {CMD_PCF7931_READ};
-  SendCommand(&c);
-  UsbCommand resp;
-  WaitForResponse(CMD_ACK,&resp);
+       uint8_t cmdp = 0;
+       
+       if (param_getchar(Cmd, cmdp) == 'H' ||  param_getchar(Cmd, cmdp) == 'h')
+               return usage_pcf7931_read();
+       
+       UsbCommand c = {CMD_PCF7931_READ};
+       clearCommandBuffer();
+       SendCommand(&c);
+       UsbCommand resp;
+       WaitForResponse(CMD_ACK,&resp);
+       return 0;
+}
+
+int CmdLFPCF7931Config(const char *Cmd)
+{ 
+  int res = 0;
+  // res = sscanf(Cmd, 
+                       // "%02x %02x %hu %hu %hu %hu %hu %hhu %hd %hd", 
+                       // &configPcf.password[0], 
+                       // &configPcf.password[1], 
+                       // &configPcf.password[2], 
+                       // &configPcf.password[3], 
+                       // &configPcf.password[4], 
+                       // &configPcf.password[5], 
+                       // &configPcf.password[6], 
+                       // &configPcf.init_delay, 
+                       // &configPcf.offset[0], 
+                       // &configPcf.offset[1]);
+
+  if (res >= 7 || res < 1){
+      if(res == 7) configPcf.init_delay = 17500; //default value
+      
+      if(res<=8){
+        configPcf.offset[0] = 0; //default value
+        configPcf.offset[1] = 0; //default value
+      }
+     
+      if(res < 1){
+         PrintAndLog("Usage: <password byte 1 (in hex, lsb first)> <password byte 2  (in hex, lsb first)> [...] <password byte 7  (in hex, lsb first)> <tag initialization delay (in us)> <optional : offset on the low pulses width (in us)> <optional : offset on the low pulses position (in us)>");
+         PrintAndLog("The time offsets could be usefull to correct slew rate generated by the antenna.");
+      }
+
+      PrintAndLog("Current configuration :");
+      PrintAndLog("Password (LSB first on each byte) : %02x %02x %02x %02x %02x %02x %02x", configPcf.password[0], configPcf.password[1], configPcf.password[2], configPcf.password[3], configPcf.password[4], configPcf.password[5], configPcf.password[6]);
+      PrintAndLog("Tag initialization delay : %d us", configPcf.init_delay);
+      PrintAndLog("Offsets : %d us on the low pulses width, %d us on the low pulses positions", configPcf.offset[0], configPcf.offset[1]);
+
+      return 0;
+  }
+
+  //default values
+  configPcf.password[0] = 0xFF;  
+  configPcf.password[1] = 0xFF;  
+  configPcf.password[2] = 0xFF;  
+  configPcf.password[3] = 0xFF;  
+  configPcf.password[4] = 0xFF;  
+  configPcf.password[5] = 0xFF;  
+  configPcf.password[6] = 0xFF;
+
+  configPcf.init_delay = 17500;
+  configPcf.offset[0] = 0; 
+  configPcf.offset[1] = 0; 
+
+  PrintAndLog("Incorrect format");
+  PrintAndLog("Examples of right usage : lf pcf7931 config 11 22 33 44 55 66 77 20000");
+  PrintAndLog("                          lf pcf7931 config FF FF FF FF FF FF FF 17500 -10 30");
+  return 0;
+}
+
+int CmdLFPCF7931Write(const char *Cmd)
+{
+  UsbCommand c = {CMD_PCF7931_WRITE};
+
+  int res = 0;
+  res = sscanf(Cmd, "%" SCNu64 " %" SCNu64 " %" SCNu64 , &c.arg[0], &c.arg[1], &c.arg[2]);
+
+  if(res < 1) {
+       PrintAndLog("Please specify the block address in hex");
+       return 1;
+  }
+  if (res == 1){ 
+       PrintAndLog("Please specify the byte address in hex");
+       return 2;
+  }
+  if(res == 2) {
+       PrintAndLog("Please specify the data in hex (1 byte)");
+       return 3;
+  }
+  if(res == 3) {
+
+       memcpy(c.d.asDwords, configPcf.password, 7);
+       
+    c.d.asDwords[7] = (configPcf.offset[0]+128);
+    c.d.asDwords[8] = (configPcf.offset[1]+128);
+    c.d.asDwords[9] = configPcf.init_delay;
+
+       clearCommandBuffer();
+    SendCommand(&c);
+    return 0;
+  }
+
+  PrintAndLog("INCORRECT FORMAT");
   return 0;
 }
 
+
 static command_t CommandTable[] = 
 {
-  {"help", CmdHelp, 1, "This help"},
-  {"read", CmdLFPCF7931Read, 1, "Read content of a PCF7931 transponder"},
-  {NULL, NULL, 0, NULL}
+       {"help",        CmdHelp,                        1, "This help"},
+       {"read",        CmdLFPCF7931Read,       1, "Read content of a PCF7931 transponder"},
+       {"write",       CmdLFPCF7931Write,      1, "Write data on a PCF7931 transponder. Usage : lf pcf7931 write <bloc address> <byte address> <data>"},
+       {"config",      CmdLFPCF7931Config, 1, "Configure the password, the tags initialization delay and time offsets (optional)"},
+       {NULL, NULL, 0, NULL}
 };
 
 int CmdLFPCF7931(const char *Cmd)
 {
-  CmdsParse(CommandTable, Cmd);
-  return 0;
+       CmdsParse(CommandTable, Cmd);
+       return 0;
 }
 
 int CmdHelp(const char *Cmd)
 {
-  CmdsHelp(CommandTable);
-  return 0;
+       CmdsHelp(CommandTable);
+       return 0;
 }
Impressum, Datenschutz