]> git.zerfleddert.de Git - proxmark3-svn/commitdiff
Merge remote-tracking branch 'upstream/master' 236/head
authormarshmellow42 <marshmellowrf@gmail.com>
Tue, 14 Mar 2017 18:48:31 +0000 (14:48 -0400)
committermarshmellow42 <marshmellowrf@gmail.com>
Tue, 14 Mar 2017 18:48:31 +0000 (14:48 -0400)
1  2 
client/cmdlfem4x.c
client/util.c
client/util.h

diff --combined client/cmdlfem4x.c
index f2c5d4f7e12d51b8985c7b1a30f9ce2561c73191,d2ccfae8ef05768320979b3ea0e4730d1f51f73a..6a076e3386a26cd29cefa43c35b0e7e921c4ff76
@@@ -14,6 -14,7 +14,7 @@@
  #include "proxmark3.h"
  #include "ui.h"
  #include "util.h"
+ #include "data.h"
  #include "graph.h"
  #include "cmdparser.h"
  #include "cmddata.h"
@@@ -762,10 -763,9 +763,10 @@@ int CmdEM4x05dump(const char *Cmd) 
  int usage_lf_em_write(void) {
        PrintAndLog("Write EM4x05/EM4x69.  Tag must be on antenna. ");
        PrintAndLog("");
 -      PrintAndLog("Usage:  lf em 4x05writeword [h] <address> <data> <pwd>");
 +      PrintAndLog("Usage:  lf em 4x05writeword [h] [s] <address> <data> <pwd>");
        PrintAndLog("Options:");
        PrintAndLog("       h         - this help");
 +      PrintAndLog("       s         - swap data bit order before write");
        PrintAndLog("       address   - memory address to write to. (0-15)");
        PrintAndLog("       data      - data to write (hex)");  
        PrintAndLog("       pwd       - password (hex) (optional)");
  int CmdEM4x05WriteWord(const char *Cmd) {
        uint8_t ctmp = param_getchar(Cmd, 0);
        if ( strlen(Cmd) == 0 || ctmp == 'H' || ctmp == 'h' ) return usage_lf_em_write();
 -      
 +
        bool usePwd = false;
 -              
 +
        uint8_t addr = 16; // default to invalid address
        uint32_t data = 0xFFFFFFFF; // default to blank data
        uint32_t pwd = 0xFFFFFFFF; // default to blank password
 -      
 -      addr = param_get8ex(Cmd, 0, 16, 10);
 -      data = param_get32ex(Cmd, 1, 0, 16);
 -      pwd =  param_get32ex(Cmd, 2, 1, 16);
 -      
 -      
 +      char swap = 0;
 +
 +      int p = 0;
 +      swap = param_getchar(Cmd, 0);
 +      if (swap == 's' || swap=='S') p++;
 +      addr = param_get8ex(Cmd, p++, 16, 10);
 +      data = param_get32ex(Cmd, p++, 0, 16);
 +      pwd  = param_get32ex(Cmd, p++, 1, 16);
 +
 +      if (swap == 's' || swap=='S') data = SwapBits(data, 32);
 +
        if ( (addr > 15) ) {
                PrintAndLog("Address must be between 0 and 15");
                return 1;
                PrintAndLog("Writing address %d data %08X", addr, data);        
        else {
                usePwd = true;
 -              PrintAndLog("Writing address %d data %08X using password %08X", addr, data, pwd);               
 +              PrintAndLog("Writing address %d data %08X using password %08X", addr, data, pwd);
        }
 -      
 +
        uint16_t flag = (addr << 8 ) | usePwd;
 -      
 +
        UsbCommand c = {CMD_EM4X_WRITE_WORD, {flag, data, pwd}};
        clearCommandBuffer();
        SendCommand(&c);
 -      UsbCommand resp;        
 +      UsbCommand resp;
        if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)){
                PrintAndLog("Error occurred, device did not respond during write operation.");
                return -1;
        if ( !downloadSamplesEM() ) {
                return -1;
        }
 -      //check response for 00001010 for write confirmation!   
 +      //check response for 00001010 for write confirmation!
        //attempt demod:
        uint32_t dummy = 0;
        int result = demodEM4x05resp(&dummy,false);
diff --combined client/util.c
index 60054b9410d9c310217eca720f460f45bc87b1f1,81b2d844f4376bdda269f6e3850a5c9925915216..7c70d55d5c98bb16d7b6472da681611e4e290d97
@@@ -8,15 -8,26 +8,26 @@@
  // utilities
  //-----------------------------------------------------------------------------
  
- #include <ctype.h>
+ #if !defined(_WIN32)
+ #define _POSIX_C_SOURCE       199309L                 // need nanosleep()
+ #endif
  #include "util.h"
+ #include <stdint.h>
+ #include <string.h>
+ #include <ctype.h>
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <time.h>
+ #include "data.h"
  #define MAX_BIN_BREAK_LENGTH   (3072+384+1)
  
  #ifndef _WIN32
  #include <termios.h>
  #include <sys/ioctl.h> 
  
  int ukbhit(void)
  {
    int cnt = 0;
@@@ -42,6 -53,7 +53,7 @@@
  }
  
  #else
  #include <conio.h>
  int ukbhit(void) {
        return kbhit();
@@@ -245,15 -257,6 +257,15 @@@ void num_to_bytebitsLSBF(uint64_t n, si
        }
  }
  
 +// Swap bit order on a uint32_t value.  Can be limited by nrbits just use say 8bits reversal
 +// And clears the rest of the bits.
 +uint32_t SwapBits(uint32_t value, int nrbits) {
 +      uint32_t newvalue = 0;
 +      for(int i = 0; i < nrbits; i++) {
 +              newvalue ^= ((value >> i) & 1) << (nrbits - 1 - i);
 +      }
 +      return newvalue;
 +}
  
  // aa,bb,cc,dd,ee,ff,gg,hh, ii,jj,kk,ll,mm,nn,oo,pp
  // to
@@@ -600,3 -603,38 +612,38 @@@ void clean_ascii(unsigned char *buf, si
        buf[i] = '.';
    }
  }
+ // Timer functions
+ #if !defined (_WIN32)
+ #include <errno.h>
+ static void nsleep(uint64_t n) {
+   struct timespec timeout;
+   timeout.tv_sec = n/1000000000;
+   timeout.tv_nsec = n%1000000000;
+   while (nanosleep(&timeout, &timeout) && errno == EINTR);
+ }
+ void msleep(uint32_t n) {
+       nsleep(1000000 * n);
+ }
+ #endif // _WIN32
+ // a milliseconds timer for performance measurement
+ uint64_t msclock() {
+ #if defined(_WIN32)
+ #include <sys/types.h>
+       struct _timeb t;
+       if (_ftime_s(&t)) {
+               return 0;
+       } else {
+               return 1000 * t.time + t.millitm;
+       }
+ #else
+       struct timespec t;
+       clock_gettime(CLOCK_MONOTONIC, &t);
+       return (t.tv_sec * 1000 + t.tv_nsec / 1000000);
+ #endif
+ }
diff --combined client/util.h
index c206fb0a28b33cacfcf5ac222244d46cf9bb9a70,1739498eeaf8d4ab4844951ecb332d64f90f10a9..27f9348e64132089f096a36606f8de9416e5359d
@@@ -8,13 -8,11 +8,11 @@@
  // utilities
  //-----------------------------------------------------------------------------
  
- #include <stdio.h>
- #include <stdint.h>  //included in data.h
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <time.h>    //time, gmtime
- #include "data.h"    //for FILE_PATH_SIZE
+ #ifndef UTIL_H__
+ #define UTIL_H__
+ #include <stdint.h>
+ #include <stddef.h>
  
  #ifndef ROTR
  # define ROTR(x,n) (((uintmax_t)(x) >> (n)) | ((uintmax_t)(x) << ((sizeof(x) * 8) - (n))))
  #ifndef MAX
  # define MAX(a, b) (((a) > (b)) ? (a) : (b))
  #endif
  #define EVEN                        0
  #define ODD                         1
  
- int ukbhit(void);
+ extern int ukbhit(void);
+ extern void AddLogLine(char *fileName, char *extData, char *c);
+ extern void AddLogHex(char *fileName, char *extData, const uint8_t * data, const size_t len);
+ extern void AddLogUint64(char *fileName, char *extData, const uint64_t data);
+ extern void AddLogCurrentDT(char *fileName);
+ extern void FillFileNameByUID(char *fileName, uint8_t * uid, char *ext, int byteCount);
+ extern void print_hex(const uint8_t * data, const size_t len);
+ extern char *sprint_hex(const uint8_t * data, const size_t len);
+ extern char *sprint_bin(const uint8_t * data, const size_t len);
+ extern char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks);
+ extern char *sprint_hex_ascii(const uint8_t *data, const size_t len);
+ extern char *sprint_ascii(const uint8_t *data, const size_t len);
+ extern void num_to_bytes(uint64_t n, size_t len, uint8_t* dest);
+ extern uint64_t bytes_to_num(uint8_t* src, size_t len);
+ extern void num_to_bytebits(uint64_t  n, size_t len, uint8_t *dest);
+ extern void num_to_bytebitsLSBF(uint64_t n, size_t len, uint8_t *dest);
+ extern char *printBits(size_t const size, void const * const ptr);
++extern uint32_t SwapBits(uint32_t value, int nrbits);
+ extern uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize);
+ extern void SwapEndian64ex(const uint8_t *src, const size_t len, const uint8_t blockSize, uint8_t *dest);
  
- void AddLogLine(char *fileName, char *extData, char *c);
- void AddLogHex(char *fileName, char *extData, const uint8_t * data, const size_t len);
- void AddLogUint64(char *fileName, char *extData, const uint64_t data);
- void AddLogCurrentDT(char *fileName);
- void FillFileNameByUID(char *fileName, uint8_t * uid, char *ext, int byteCount);
+ extern char param_getchar(const char *line, int paramnum);
+ extern int param_getptr(const char *line, int *bg, int *en, int paramnum);
+ extern uint8_t param_get8(const char *line, int paramnum);
+ extern uint8_t param_get8ex(const char *line, int paramnum, int deflt, int base);
+ extern uint32_t param_get32ex(const char *line, int paramnum, int deflt, int base);
+ extern uint64_t param_get64ex(const char *line, int paramnum, int deflt, int base);
+ extern uint8_t param_getdec(const char *line, int paramnum, uint8_t *destination);
+ extern uint8_t param_isdec(const char *line, int paramnum);
+ extern int param_gethex(const char *line, int paramnum, uint8_t * data, int hexcnt);
+ extern int param_gethex_ex(const char *line, int paramnum, uint8_t * data, int *hexcnt);
+ extern int param_getstr(const char *line, int paramnum, char * str);
  
void print_hex(const uint8_t * data, const size_t len);
char * sprint_hex(const uint8_t * data, const size_t len);
char * sprint_bin(const uint8_t * data, const size_t len);
char * sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks);
char * sprint_hex_ascii(const uint8_t *data, const size_t len);
char * sprint_ascii(const uint8_t *data, const size_t len);
extern int hextobinarray( char *target,  char *source);
extern int hextobinstring( char *target,  char *source);
extern int binarraytohex( char *target,  char *source,  int length);
extern void binarraytobinstring(char *target,  char *source,  int length);
extern uint8_t GetParity( uint8_t *string, uint8_t type,  int length);
extern void wiegand_add_parity(uint8_t *target, uint8_t *source, uint8_t length);
  
- void num_to_bytes(uint64_t n, size_t len, uint8_t* dest);
- uint64_t bytes_to_num(uint8_t* src, size_t len);
- void num_to_bytebits(uint64_t n, size_t len, uint8_t *dest);
- void num_to_bytebitsLSBF(uint64_t n, size_t len, uint8_t *dest);
- char * printBits(size_t const size, void const * const ptr);
- uint32_t SwapBits(uint32_t value, int nrbits);
- uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize);
- void SwapEndian64ex(const uint8_t *src, const size_t len, const uint8_t blockSize, uint8_t *dest);
+ extern void xor(unsigned char *dst, unsigned char *src, size_t len);
+ extern int32_t le24toh(uint8_t data[3]);
+ extern uint32_t le32toh (uint8_t *data);
+ extern void rol(uint8_t *data, const size_t len);
  
- char param_getchar(const char *line, int paramnum);
- int param_getptr(const char *line, int *bg, int *en, int paramnum);
- uint8_t param_get8(const char *line, int paramnum);
- uint8_t param_get8ex(const char *line, int paramnum, int deflt, int base);
- uint32_t param_get32ex(const char *line, int paramnum, int deflt, int base);
- uint64_t param_get64ex(const char *line, int paramnum, int deflt, int base);
- uint8_t param_getdec(const char *line, int paramnum, uint8_t *destination);
- uint8_t param_isdec(const char *line, int paramnum);
- int param_gethex(const char *line, int paramnum, uint8_t * data, int hexcnt);
- int param_gethex_ex(const char *line, int paramnum, uint8_t * data, int *hexcnt);
- int param_getstr(const char *line, int paramnum, char * str);
+ extern void clean_ascii(unsigned char *buf, size_t len);
  
-  int hextobinarray( char *target,  char *source);
-  int hextobinstring( char *target,  char *source);
-  int binarraytohex( char *target,  char *source,  int length);
- void binarraytobinstring(char *target,  char *source,  int length);
- uint8_t GetParity( uint8_t *string, uint8_t type,  int length);
- void wiegand_add_parity(uint8_t *target, uint8_t *source, uint8_t length);
+ // timer functions/macros
+ #ifdef _WIN32
+ # include <windows.h>
+ # define sleep(n) Sleep(1000 *(n))
+ # define msleep(n) Sleep((n))
+ #else
+ extern void msleep(uint32_t n);               // sleep n milliseconds
+ #endif // _WIN32
  
- void xor(unsigned char *dst, unsigned char *src, size_t len);
- int32_t le24toh(uint8_t data[3]);
- uint32_t le32toh (uint8_t *data);
- void rol(uint8_t *data, const size_t len);
+ extern uint64_t msclock();                    // a milliseconds clock
  
- void clean_ascii(unsigned char *buf, size_t len);
+ #endif // UTIL_H__
Impressum, Datenschutz