From: marshmellow42 Date: Tue, 14 Mar 2017 18:48:31 +0000 (-0400) Subject: Merge remote-tracking branch 'upstream/master' X-Git-Tag: v3.0.0~44^2~2 X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/c9ad641b61c6fc5e4b77b181ad9b58b8723f56c6?hp=-c Merge remote-tracking branch 'upstream/master' --- c9ad641b61c6fc5e4b77b181ad9b58b8723f56c6 diff --combined client/cmdlfem4x.c index f2c5d4f7,d2ccfae8..6a076e33 --- a/client/cmdlfem4x.c +++ b/client/cmdlfem4x.c @@@ -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]
"); + PrintAndLog("Usage: lf em 4x05writeword [h] [s]
"); 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)"); @@@ -778,23 -778,18 +779,23 @@@ 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; @@@ -803,15 -798,15 +804,15 @@@ 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; @@@ -819,7 -814,7 +820,7 @@@ 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 60054b94,81b2d844..7c70d55d --- a/client/util.c +++ b/client/util.c @@@ -8,15 -8,26 +8,26 @@@ // utilities //----------------------------------------------------------------------------- - #include + #if !defined(_WIN32) + #define _POSIX_C_SOURCE 199309L // need nanosleep() + #endif + #include "util.h" + + #include + #include + #include + #include + #include + #include + #include "data.h" + #define MAX_BIN_BREAK_LENGTH (3072+384+1) #ifndef _WIN32 #include #include - int ukbhit(void) { int cnt = 0; @@@ -42,6 -53,7 +53,7 @@@ } #else + #include 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 + + 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 + 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 c206fb0a,1739498e..27f9348e --- a/client/util.h +++ b/client/util.h @@@ -8,13 -8,11 +8,11 @@@ // utilities //----------------------------------------------------------------------------- - #include - #include //included in data.h - #include - #include - #include - #include //time, gmtime - #include "data.h" //for FILE_PATH_SIZE + #ifndef UTIL_H__ + #define UTIL_H__ + + #include + #include #ifndef ROTR # define ROTR(x,n) (((uintmax_t)(x) >> (n)) | ((uintmax_t)(x) << ((sizeof(x) * 8) - (n)))) @@@ -25,55 -23,68 +23,69 @@@ #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 + # 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__