From: pwpiwi Date: Wed, 7 Jun 2017 20:32:41 +0000 (+0200) Subject: Merge branch 'master' of https://github.com/Proxmark/proxmark3 X-Git-Tag: v3.0.1~6 X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/f9a12dfac2941332998cca262de1b2c101e13fe8?hp=59d86bafb73b420c7c26131626c48243488a4f2b Merge branch 'master' of https://github.com/Proxmark/proxmark3 --- diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index b18a2fe6..d648beee 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -2418,8 +2418,8 @@ void Mifare1ksim(uint8_t flags, uint8_t exitAfterNReads, uint8_t arg2, uint8_t * //Here, we collect UID,sector,keytype,NT,AR,NR,NT2,AR2,NR2 // This will be used in the reader-only attack. - //allow collecting up to 8 sets of nonces to allow recovery of up to 8 keys - #define ATTACK_KEY_COUNT 8 // keep same as define in cmdhfmf.c -> readerAttack() + //allow collecting up to 7 sets of nonces to allow recovery of up to 7 keys + #define ATTACK_KEY_COUNT 7 // keep same as define in cmdhfmf.c -> readerAttack() (Cannot be more than 7) nonces_t ar_nr_resp[ATTACK_KEY_COUNT*2]; //*2 for 2 separate attack types (nml, moebius) memset(ar_nr_resp, 0x00, sizeof(ar_nr_resp)); diff --git a/client/Makefile b/client/Makefile index dbb0ba22..f6af8602 100644 --- a/client/Makefile +++ b/client/Makefile @@ -179,15 +179,30 @@ MULTIARCHOBJS = $(MULTIARCHSRCS:%.c=$(OBJDIR)/%_NOSIMD.o) \ $(MULTIARCHSRCS:%.c=$(OBJDIR)/%_MMX.o) \ $(MULTIARCHSRCS:%.c=$(OBJDIR)/%_SSE2.o) \ $(MULTIARCHSRCS:%.c=$(OBJDIR)/%_AVX.o) \ - $(MULTIARCHSRCS:%.c=$(OBJDIR)/%_AVX2.o) \ - $(MULTIARCHSRCS:%.c=$(OBJDIR)/%_AVX512.o) + $(MULTIARCHSRCS:%.c=$(OBJDIR)/%_AVX2.o) + +GCC_GTEQ_490 := $(shell expr `gcc -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$/&00/'` \>= 40900) +HARD_SWITCH_NOSIMD = -mno-mmx -mno-sse2 -mno-avx -mno-avx2 +HARD_SWITCH_MMX = -mmmx -mno-sse2 -mno-avx -mno-avx2 +HARD_SWITCH_SSE2 = -mmmx -msse2 -mno-avx -mno-avx2 +HARD_SWITCH_AVX = -mmmx -msse2 -mavx -mno-avx2 +HARD_SWITCH_AVX2 = -mmmx -msse2 -mavx -mavx2 +HARD_SWITCH_AVX512 = -mmmx -msse2 -mavx -mavx2 -mavx512f +ifeq "$(GCC_GTEQ_490)" "1" + HARD_SWITCH_NOSIMD += -mno-avx512f + HARD_SWITCH_MMX += -mno-avx512f + HARD_SWITCH_SSE2 += -mno-avx512f + HARD_SWITCH_AVX += -mno-avx512f + HARD_SWITCH_AVX2 += -mno-avx512f + MULTIARCHOBJS += $(MULTIARCHSRCS:%.c=$(OBJDIR)/%_AVX512.o) +endif BINS = proxmark3 flasher fpga_compress WINBINS = $(patsubst %, %.exe, $(BINS)) CLEAN = $(BINS) $(WINBINS) $(COREOBJS) $(CMDOBJS) $(ZLIBOBJS) $(QTGUIOBJS) $(MULTIARCHOBJS) $(OBJDIR)/*.o *.moc.cpp ui/ui_overlays.h # need to assign dependancies to build these first... -all: ui/ui_overlays.h lua_build $(BINS) +all: lua_build $(BINS) all-static: LDLIBS:=-static $(LDLIBS) all-static: proxmark3 flasher fpga_compress @@ -202,6 +217,8 @@ flasher: $(OBJDIR)/flash.o $(OBJDIR)/flasher.o $(COREOBJS) fpga_compress: $(OBJDIR)/fpga_compress.o $(ZLIBOBJS) $(LD) $(LDFLAGS) $(ZLIBFLAGS) $^ $(LDLIBS) -o $@ +proxgui.cpp: ui/ui_overlays.h + proxguiqt.moc.cpp: proxguiqt.h $(MOC) -o$@ $^ @@ -225,22 +242,22 @@ lua_build: .PHONY: all clean $(OBJDIR)/%_NOSIMD.o : %.c $(OBJDIR)/%.d - $(CC) $(DEPFLAGS) $(CFLAGS) -mno-mmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f -c -o $@ $< + $(CC) $(DEPFLAGS) $(CFLAGS) $(HARD_SWITCH_NOSIMD) -c -o $@ $< $(OBJDIR)/%_MMX.o : %.c $(OBJDIR)/%.d - $(CC) $(DEPFLAGS) $(CFLAGS) -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f -c -o $@ $< + $(CC) $(DEPFLAGS) $(CFLAGS) $(HARD_SWITCH_MMX) -c -o $@ $< $(OBJDIR)/%_SSE2.o : %.c $(OBJDIR)/%.d - $(CC) $(DEPFLAGS) $(CFLAGS) -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f -c -o $@ $< + $(CC) $(DEPFLAGS) $(CFLAGS) $(HARD_SWITCH_SSE2) -c -o $@ $< $(OBJDIR)/%_AVX.o : %.c $(OBJDIR)/%.d - $(CC) $(DEPFLAGS) $(CFLAGS) -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f -c -o $@ $< + $(CC) $(DEPFLAGS) $(CFLAGS) $(HARD_SWITCH_AVX) -c -o $@ $< $(OBJDIR)/%_AVX2.o : %.c $(OBJDIR)/%.d - $(CC) $(DEPFLAGS) $(CFLAGS) -mmmx -msse2 -mavx -mavx2 -mno-avx512f -c -o $@ $< + $(CC) $(DEPFLAGS) $(CFLAGS) $(HARD_SWITCH_AVX2) -c -o $@ $< $(OBJDIR)/%_AVX512.o : %.c $(OBJDIR)/%.d - $(CC) $(DEPFLAGS) $(CFLAGS) -mmmx -msse2 -mavx -mavx2 -mavx512f -c -o $@ $< + $(CC) $(DEPFLAGS) $(CFLAGS) $(HARD_SWITCH_AVX512) -c -o $@ $< %.o: %.c $(OBJDIR)/%.o : %.c $(OBJDIR)/%.d diff --git a/client/cmdhf14a.c b/client/cmdhf14a.c index 812db8ee..58d1e8b2 100644 --- a/client/cmdhf14a.c +++ b/client/cmdhf14a.c @@ -561,72 +561,72 @@ int CmdHF14ASnoop(const char *Cmd) { if (ctmp == 'r' || ctmp == 'R') param |= 0x02; } - UsbCommand c = {CMD_SNOOP_ISO_14443a, {param, 0, 0}}; - SendCommand(&c); - return 0; + UsbCommand c = {CMD_SNOOP_ISO_14443a, {param, 0, 0}}; + SendCommand(&c); + return 0; } int CmdHF14ACmdRaw(const char *cmd) { - UsbCommand c = {CMD_READER_ISO_14443a, {0, 0, 0}}; - bool reply=1; - bool crc = false; - bool power = false; - bool active = false; - bool active_select = false; - uint16_t numbits = 0; + UsbCommand c = {CMD_READER_ISO_14443a, {0, 0, 0}}; + bool reply=1; + bool crc = false; + bool power = false; + bool active = false; + bool active_select = false; + uint16_t numbits = 0; bool bTimeout = false; uint32_t timeout = 0; bool topazmode = false; - char buf[5]=""; - int i = 0; - uint8_t data[USB_CMD_DATA_SIZE]; + char buf[5]=""; + int i = 0; + uint8_t data[USB_CMD_DATA_SIZE]; uint16_t datalen = 0; uint32_t temp; - if (strlen(cmd)<2) { - PrintAndLog("Usage: hf 14a raw [-r] [-c] [-p] [-f] [-b] [-t] <0A 0B 0C ... hex>"); - PrintAndLog(" -r do not read response"); - PrintAndLog(" -c calculate and append CRC"); - PrintAndLog(" -p leave the signal field ON after receive"); - PrintAndLog(" -a active signal field ON without select"); - PrintAndLog(" -s active signal field ON with select"); - PrintAndLog(" -b number of bits to send. Useful for send partial byte"); + if (strlen(cmd)<2) { + PrintAndLog("Usage: hf 14a raw [-r] [-c] [-p] [-f] [-b] [-t] <0A 0B 0C ... hex>"); + PrintAndLog(" -r do not read response"); + PrintAndLog(" -c calculate and append CRC"); + PrintAndLog(" -p leave the signal field ON after receive"); + PrintAndLog(" -a active signal field ON without select"); + PrintAndLog(" -s active signal field ON with select"); + PrintAndLog(" -b number of bits to send. Useful for send partial byte"); PrintAndLog(" -t timeout in ms"); PrintAndLog(" -T use Topaz protocol to send command"); - return 0; - } + return 0; + } - - // strip - while (*cmd==' ' || *cmd=='\t') cmd++; - - while (cmd[i]!='\0') { - if (cmd[i]==' ' || cmd[i]=='\t') { i++; continue; } - if (cmd[i]=='-') { - switch (cmd[i+1]) { - case 'r': - reply = false; - break; - case 'c': - crc = true; - break; - case 'p': - power = true; - break; - case 'a': - active = true; - break; - case 's': - active_select = true; - break; - case 'b': - sscanf(cmd+i+2,"%d",&temp); - numbits = temp & 0xFFFF; - i+=3; - while(cmd[i]!=' ' && cmd[i]!='\0') { i++; } - i-=2; - break; + + // strip + while (*cmd==' ' || *cmd=='\t') cmd++; + + while (cmd[i]!='\0') { + if (cmd[i]==' ' || cmd[i]=='\t') { i++; continue; } + if (cmd[i]=='-') { + switch (cmd[i+1]) { + case 'r': + reply = false; + break; + case 'c': + crc = true; + break; + case 'p': + power = true; + break; + case 'a': + active = true; + break; + case 's': + active_select = true; + break; + case 'b': + sscanf(cmd+i+2,"%d",&temp); + numbits = temp & 0xFFFF; + i+=3; + while(cmd[i]!=' ' && cmd[i]!='\0') { i++; } + i-=2; + break; case 't': bTimeout = true; sscanf(cmd+i+2,"%d",&temp); @@ -635,93 +635,95 @@ int CmdHF14ACmdRaw(const char *cmd) { while(cmd[i]!=' ' && cmd[i]!='\0') { i++; } i-=2; break; - case 'T': + case 'T': topazmode = true; break; - default: - PrintAndLog("Invalid option"); - return 0; - } - i+=2; - continue; - } - if ((cmd[i]>='0' && cmd[i]<='9') || - (cmd[i]>='a' && cmd[i]<='f') || - (cmd[i]>='A' && cmd[i]<='F') ) { - buf[strlen(buf)+1]=0; - buf[strlen(buf)]=cmd[i]; - i++; - - if (strlen(buf)>=2) { - sscanf(buf,"%x",&temp); - data[datalen]=(uint8_t)(temp & 0xff); - *buf=0; - if (++datalen>sizeof(data)){ + default: + PrintAndLog("Invalid option"); + return 0; + } + i+=2; + continue; + } + if ((cmd[i]>='0' && cmd[i]<='9') || + (cmd[i]>='a' && cmd[i]<='f') || + (cmd[i]>='A' && cmd[i]<='F') ) { + buf[strlen(buf)+1]=0; + buf[strlen(buf)]=cmd[i]; + i++; + + if (strlen(buf)>=2) { + sscanf(buf,"%x",&temp); + data[datalen]=(uint8_t)(temp & 0xff); + *buf=0; + if (datalen > sizeof(data)-1) { if (crc) PrintAndLog("Buffer is full, we can't add CRC to your data"); break; + } else { + datalen++; } - } - continue; - } - PrintAndLog("Invalid char on input"); - return 0; - } + } + continue; + } + PrintAndLog("Invalid char on input"); + return 0; + } - if(crc && datalen>0 && datalen0 && datalen MAX_TIMEOUT) { - timeout = MAX_TIMEOUT; - PrintAndLog("Set timeout to 40542 seconds (11.26 hours). The max we can wait for response"); - } + #define MAX_TIMEOUT 40542464 // = (2^32-1) * (8*16) / 13560000Hz * 1000ms/s + c.arg[0] |= ISO14A_SET_TIMEOUT; + if(timeout > MAX_TIMEOUT) { + timeout = MAX_TIMEOUT; + PrintAndLog("Set timeout to 40542 seconds (11.26 hours). The max we can wait for response"); + } c.arg[2] = 13560000 / 1000 / (8*16) * timeout; // timeout in ETUs (time to transfer 1 bit, approx. 9.4 us) } - if(power) { - c.arg[0] |= ISO14A_NO_DISCONNECT; - } + if(power) { + c.arg[0] |= ISO14A_NO_DISCONNECT; + } if(datalen > 0) { - c.arg[0] |= ISO14A_RAW; - } + c.arg[0] |= ISO14A_RAW; + } if(topazmode) { c.arg[0] |= ISO14A_TOPAZMODE; - } - - // Max buffer is USB_CMD_DATA_SIZE - c.arg[1] = (datalen & 0xFFFF) | (numbits << 16); - memcpy(c.d.asBytes,data,datalen); - - SendCommand(&c); - - if (reply) { - if(active_select) - waitCmd(1); - if(datalen>0) - waitCmd(0); - } // if reply - return 0; + } + + // Max buffer is USB_CMD_DATA_SIZE (512) + c.arg[1] = (datalen & 0xFFFF) | ((uint32_t)numbits << 16); + memcpy(c.d.asBytes,data,datalen); + + SendCommand(&c); + + if (reply) { + if(active_select) + waitCmd(1); + if(datalen>0) + waitCmd(0); + } // if reply + return 0; } diff --git a/client/cmdhfmf.c b/client/cmdhfmf.c index 5b4a0b2a..3fde208f 100644 --- a/client/cmdhfmf.c +++ b/client/cmdhfmf.c @@ -970,6 +970,7 @@ int CmdHF14AMfChk(const char *Cmd) break; default: PrintAndLog("Key type must be A , B or ?"); + free(keyBlock); return 1; }; @@ -1120,7 +1121,8 @@ int CmdHF14AMfChk(const char *Cmd) } void readerAttack(nonces_t ar_resp[], bool setEmulatorMem, bool doStandardAttack) { - #define ATTACK_KEY_COUNT 8 // keep same as define in iso14443a.c -> Mifare1ksim() + #define ATTACK_KEY_COUNT 7 // keep same as define in iso14443a.c -> Mifare1ksim() + // cannot be more than 7 or it will overrun c.d.asBytes(512) uint64_t key = 0; typedef struct { uint64_t keyA; diff --git a/client/cmdhfmfu.c b/client/cmdhfmfu.c index ed8c588d..81502250 100644 --- a/client/cmdhfmfu.c +++ b/client/cmdhfmfu.c @@ -1474,7 +1474,7 @@ int CmdHF14AMfucAuth(const char *Cmd){ //Change key to user defined one if (cmdp == 'k' || cmdp == 'K'){ keyNo = param_get8(Cmd, 1); - if(keyNo > KEYS_3DES_COUNT) + if(keyNo > KEYS_3DES_COUNT-1) errors = true; } diff --git a/client/cmdlfpresco.c b/client/cmdlfpresco.c index 8ac3a71e..29fc81f2 100644 --- a/client/cmdlfpresco.c +++ b/client/cmdlfpresco.c @@ -68,8 +68,8 @@ int GetWiegandFromPresco(const char *Cmd, uint32_t *sitecode, uint32_t *usercode *fullcode = param_get32ex(Cmd, cmdp+1, 0, 10); cmdp+=2; break; - case 'P': - case 'p': + case 'D': + case 'd': //param get string int param_getstr(const char *line, int paramnum, char * str) stringlen = param_getstr(Cmd, cmdp+1, id); if (stringlen < 2) return -1; @@ -91,7 +91,7 @@ int GetWiegandFromPresco(const char *Cmd, uint32_t *sitecode, uint32_t *usercode if(cmdp == 0) errors = 1; //Validations - if(errors) return -1; + if(errors || (stringlen == 0 && !hex) ) return -1; if (!hex) { for (int index =0; index < strlen(id); ++index) { diff --git a/client/proxguiqt.h b/client/proxguiqt.h index 73f9286c..8a3b8cfc 100644 --- a/client/proxguiqt.h +++ b/client/proxguiqt.h @@ -128,7 +128,7 @@ public: void run(); private: char *script_cmds_file = NULL; - bool usb_present = false; + bool usb_present; }; #endif // PROXGUI_QT