]> cvs.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdhflegic.c
Merge pull request #227 from pwpiwi/client_fixes
[proxmark3-svn] / client / cmdhflegic.c
index 2719029a36ba057936dc2ce02300e4b80db1a583..777f524f2c1ffaf52391a71fcec7264ee0c2ff97 100644 (file)
 
 #include <stdio.h>
 #include <string.h>
-//#include "proxusb.h"
+#include <inttypes.h>
 #include "proxmark3.h"
 #include "data.h"
 #include "ui.h"
 #include "cmdparser.h"
 #include "cmdhflegic.h"
 #include "cmdmain.h"
-
+#include "util.h"
 static int CmdHelp(const char *Cmd);
 
 static command_t CommandTable[] = 
@@ -52,35 +52,20 @@ int CmdHelp(const char *Cmd)
  */
 int CmdLegicDecode(const char *Cmd)
 {
-  int h, i, j, k, n;
+  int i, j, k, n;
   int segment_len = 0;
   int segment_flag = 0;
   int stamp_len = 0;
   int crc = 0;
   int wrp = 0;
   int wrc = 0;
-  int data_buf[1032]; // receiver buffer
+  uint8_t data_buf[1052]; // receiver buffer
   char out_string[3076]; // just use big buffer - bad practice
   char token_type[4];
-  int delivered = 0;
-
-  h = 0;
   
   // copy data from proxmark into buffer
-  for (i = 0; i < 256; i += 12, h += 48) {
-    UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}};
-    SendCommand(&c);
-    WaitForResponse(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K, NULL);
-    
-    for (j = 0; j < 48; j += 8) {
-      for (k = 0; k < 8; k++) {
-        data_buf[h+j+k] = sample_buf[j+k];
-      }
-      delivered += 8;
-      if (delivered >= 1024)
-        break;
-    }
-  }
+   GetFromBigBuf(data_buf,sizeof(data_buf),0);
+   WaitForResponse(CMD_ACK,NULL);
     
   // Output CDF System area (9 bytes) plus remaining header area (12 bytes)
   
@@ -234,7 +219,24 @@ int CmdLegicRFRead(const char *Cmd)
 
 int CmdLegicLoad(const char *Cmd)
 {
-    FILE *f = fopen(Cmd, "r");
+       char filename[FILE_PATH_SIZE] = {0x00};
+       int len = 0;
+       
+       if (param_getchar(Cmd, 0) == 'h' || param_getchar(Cmd, 0)== 0x00) {
+               PrintAndLog("It loads datasamples from the file `filename`");
+               PrintAndLog("Usage:  hf legic load <file name>");
+               PrintAndLog(" sample: hf legic load filename");
+               return 0;
+       }
+
+       len = strlen(Cmd);      
+       if (len > FILE_PATH_SIZE) {
+               PrintAndLog("Filepath too long (was %s bytes), max allowed is %s ", len, FILE_PATH_SIZE);
+               return 0;
+       }
+       memcpy(filename, Cmd, len);
+
+    FILE *f = fopen(filename, "r");
     if(!f) {
         PrintAndLog("couldn't open '%s'", Cmd);
         return -1;
@@ -264,51 +266,49 @@ int CmdLegicLoad(const char *Cmd)
 
 int CmdLegicSave(const char *Cmd)
 {
-  int n;
   int requested = 1024;
   int offset = 0;
-  char filename[1024];
-  sscanf(Cmd, " %s %i %i", filename, &requested, &offset);
-  if (offset % 4 != 0) {
-    PrintAndLog("Offset must be a multiple of 4");
-    return 0;
-  }
-  offset = offset/4;
-
   int delivered = 0;
+  char filename[FILE_PATH_SIZE];
+  uint8_t got[1024];
+  
+  sscanf(Cmd, " %s %i %i", filename, &requested, &offset);
 
+  /* If no length given save entire legic read buffer */
+  /* round up to nearest 8 bytes so the saved data can be used with legicload */
   if (requested == 0) {
-    n = 12;
-    requested = 12;
-  } else {
-    n = requested/4;
+    requested = 1024;
   }
-
+  if (requested % 8 != 0) {
+    int remainder = requested % 8;
+    requested = requested + 8 - remainder;
+  }
+  if (offset + requested > sizeof(got)) {
+    PrintAndLog("Tried to read past end of buffer, <bytes> + <offset> > 1024");
+    return 0;
+  }
+  
   FILE *f = fopen(filename, "w");
   if(!f) {
     PrintAndLog("couldn't open '%s'", Cmd+1);
     return -1;
   }
 
-  for (int i = offset; i < n+offset; i += 12) {
-    UsbCommand c = {CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K, {i, 0, 0}};
-    SendCommand(&c);
-    WaitForResponse(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K, NULL);
-    for (int j = 0; j < 48; j += 8) {
-      fprintf(f, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
-        sample_buf[j+0],
-        sample_buf[j+1],
-        sample_buf[j+2],
-        sample_buf[j+3],
-        sample_buf[j+4],
-        sample_buf[j+5],
-        sample_buf[j+6],
-        sample_buf[j+7]
-      );
-      delivered += 8;
-      if (delivered >= requested)
-        break;
-    }
+  GetFromBigBuf(got,requested,offset);
+  WaitForResponse(CMD_ACK,NULL);
+
+  for (int j = 0; j < requested; j += 8) {
+    fprintf(f, "%02x %02x %02x %02x %02x %02x %02x %02x\n",
+      got[j+0],
+      got[j+1],
+      got[j+2],
+      got[j+3],
+      got[j+4],
+      got[j+5],
+      got[j+6],
+      got[j+7]
+    );
+    delivered += 8;
     if (delivered >= requested)
       break;
   }
@@ -324,7 +324,7 @@ int CmdLegicRfSim(const char *Cmd)
    c.arg[0] = 6;
    c.arg[1] = 3;
    c.arg[2] = 0;
-   sscanf(Cmd, " %lli %lli %lli", &c.arg[0], &c.arg[1], &c.arg[2]);
+   sscanf(Cmd, " %" SCNi64 " %" SCNi64 " %" SCNi64, &c.arg[0], &c.arg[1], &c.arg[2]);
    SendCommand(&c);
    return 0;
 }
@@ -332,7 +332,7 @@ int CmdLegicRfSim(const char *Cmd)
 int CmdLegicRfWrite(const char *Cmd)
 {
     UsbCommand c={CMD_WRITER_LEGIC_RF};
-    int res = sscanf(Cmd, " 0x%"llx" 0x%"llx, &c.arg[0], &c.arg[1]);
+    int res = sscanf(Cmd, " 0x%" SCNx64 " 0x%" SCNx64, &c.arg[0], &c.arg[1]);
        if(res != 2) {
                PrintAndLog("Please specify the offset and length as two hex strings");
         return -1;
@@ -344,7 +344,7 @@ int CmdLegicRfWrite(const char *Cmd)
 int CmdLegicRfFill(const char *Cmd)
 {
     UsbCommand cmd ={CMD_WRITER_LEGIC_RF};
-    int res = sscanf(Cmd, " 0x%llx 0x%llx 0x%llx", &cmd.arg[0], &cmd.arg[1], &cmd.arg[2]);
+    int res = sscanf(Cmd, " 0x%" SCNx64 " 0x%" SCNx64 " 0x%" SCNx64, &cmd.arg[0], &cmd.arg[1], &cmd.arg[2]);
     if(res != 3) {
         PrintAndLog("Please specify the offset, length and value as two hex strings");
         return -1;
Impressum, Datenschutz