//-----------------------------------------------------------------------------\r
\r
#include "cmdhfmf.h"\r
-#include "proxmark3.h"\r
\r
static int CmdHelp(const char *Cmd);\r
\r
break;\r
}\r
\r
- UsbCommand * resp = WaitForResponseTimeout(CMD_ACK, 2000);\r
- if (resp != NULL) {\r
- isOK = resp->arg[0] & 0xff;\r
+ UsbCommand resp;\r
+ if (WaitForResponseTimeout(CMD_ACK,&resp,2000)) {\r
+ isOK = resp.arg[0] & 0xff;\r
\r
- uid = (uint32_t)bytes_to_num(resp->d.asBytes + 0, 4);\r
- nt = (uint32_t)bytes_to_num(resp->d.asBytes + 4, 4);\r
- par_list = bytes_to_num(resp->d.asBytes + 8, 8);\r
- ks_list = bytes_to_num(resp->d.asBytes + 16, 8);\r
+ uid = (uint32_t)bytes_to_num(resp.d.asBytes + 0, 4);\r
+ nt = (uint32_t)bytes_to_num(resp.d.asBytes + 4, 4);\r
+ par_list = bytes_to_num(resp.d.asBytes + 8, 8);\r
+ ks_list = bytes_to_num(resp.d.asBytes + 16, 8);\r
\r
printf("\n\n");\r
PrintAndLog("isOk:%02x", isOK);\r
if (isOK != 1) return 1;\r
\r
// execute original function from util nonce2key\r
- if (nonce2key(uid, nt, par_list, ks_list, &r_key)) return 2;\r
- printf("------------------------------------------------------------------\n");\r
- PrintAndLog("Key found:%012llx \n", r_key);\r
+ if (nonce2key(uid, nt, par_list, ks_list, &r_key))\r
+ {\r
+ isOK = 2;\r
+ PrintAndLog("Key not found (lfsr_common_prefix list is null). Nt=%08x", nt); \r
+ } else {\r
+ printf("------------------------------------------------------------------\n");\r
+ PrintAndLog("Key found:%012"llx" \n", r_key);\r
\r
- num_to_bytes(r_key, 6, keyBlock);\r
- isOK = mfCheckKeys(0, 0, 1, keyBlock, &r_key);\r
+ num_to_bytes(r_key, 6, keyBlock);\r
+ isOK = mfCheckKeys(0, 0, 1, keyBlock, &r_key);\r
+ }\r
if (!isOK) \r
- PrintAndLog("Found valid key:%012llx", r_key);\r
+ PrintAndLog("Found valid key:%012"llx, r_key);\r
else\r
{\r
- PrintAndLog("Found invalid key. ( Nt=%08x ,Trying use it to run again...", nt); \r
+ if (isOK != 2) PrintAndLog("Found invalid key. ( Nt=%08x ,Trying use it to run again...", nt); \r
c.arg[0] = nt;\r
goto start;\r
}\r
memcpy(c.d.asBytes, key, 6);\r
memcpy(c.d.asBytes + 10, bldata, 16);\r
SendCommand(&c);\r
- UsbCommand * resp = WaitForResponseTimeout(CMD_ACK, 1500);\r
-\r
- if (resp != NULL) {\r
- uint8_t isOK = resp->arg[0] & 0xff;\r
\r
+ UsbCommand resp;\r
+ if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
+ uint8_t isOK = resp.arg[0] & 0xff;\r
PrintAndLog("isOk:%02x", isOK);\r
} else {\r
PrintAndLog("Command execute timeout");\r
UsbCommand c = {CMD_MIFARE_READBL, {blockNo, keyType, 0}};\r
memcpy(c.d.asBytes, key, 6);\r
SendCommand(&c);\r
- UsbCommand * resp = WaitForResponseTimeout(CMD_ACK, 1500);\r
\r
- if (resp != NULL) {\r
- uint8_t isOK = resp->arg[0] & 0xff;\r
- uint8_t * data = resp->d.asBytes;\r
+ UsbCommand resp;\r
+ if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
+ uint8_t isOK = resp.arg[0] & 0xff;\r
+ uint8_t * data = resp.d.asBytes;\r
\r
if (isOK)\r
PrintAndLog("isOk:%02x data:%s", isOK, sprint_hex(data, 16));\r
UsbCommand c = {CMD_MIFARE_READSC, {sectorNo, keyType, 0}};\r
memcpy(c.d.asBytes, key, 6);\r
SendCommand(&c);\r
- UsbCommand * resp = WaitForResponseTimeout(CMD_ACK, 1500);\r
PrintAndLog(" ");\r
\r
- if (resp != NULL) {\r
- isOK = resp->arg[0] & 0xff;\r
- data = resp->d.asBytes;\r
+ UsbCommand resp;\r
+ if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
+ isOK = resp.arg[0] & 0xff;\r
+ data = resp.d.asBytes;\r
\r
PrintAndLog("isOk:%02x", isOK);\r
if (isOK) \r
PrintAndLog("Command1 execute timeout");\r
}\r
\r
- // response2\r
- resp = WaitForResponseTimeout(CMD_ACK, 500);\r
+ // response2\r
PrintAndLog(" ");\r
-\r
- if (resp != NULL) {\r
- isOK = resp->arg[0] & 0xff;\r
- data = resp->d.asBytes;\r
+ if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
+ isOK = resp.arg[0] & 0xff;\r
+ data = resp.d.asBytes;\r
\r
if (isOK) \r
for (i = 0; i < 2; i++) {\r
FILE *fin;\r
FILE *fout;\r
\r
- UsbCommand *resp;\r
+ UsbCommand resp;\r
\r
if ((fin = fopen("dumpkeys.bin","rb")) == NULL) {\r
PrintAndLog("Could not find file dumpkeys.bin");\r
// Read key file\r
\r
for (i=0 ; i<16 ; i++) {\r
- fread ( keyA[i], 1, 6, fin );\r
+ if (fread( keyA[i], 1, 6, fin ) == 0) {\r
+ PrintAndLog("File reading error.");\r
+ return 2;\r
+ }\r
}\r
for (i=0 ; i<16 ; i++) {\r
- fread ( keyB[i], 1, 6, fin );\r
+ if (fread( keyB[i], 1, 6, fin ) == 0) {\r
+ PrintAndLog("File reading error.");\r
+ return 2;\r
+ }\r
}\r
\r
// Read access rights to sectors\r
UsbCommand c = {CMD_MIFARE_READBL, {4*i + 3, 0, 0}};\r
memcpy(c.d.asBytes, keyA[i], 6);\r
SendCommand(&c);\r
- resp = WaitForResponseTimeout(CMD_ACK, 1500);\r
\r
- if (resp != NULL) {\r
- uint8_t isOK = resp->arg[0] & 0xff;\r
- uint8_t *data = resp->d.asBytes;\r
+ if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
+ uint8_t isOK = resp.arg[0] & 0xff;\r
+ uint8_t *data = resp.d.asBytes;\r
if (isOK){\r
rights[i][0] = ((data[7] & 0x10)>>4) | ((data[8] & 0x1)<<1) | ((data[8] & 0x10)>>2);\r
rights[i][1] = ((data[7] & 0x20)>>5) | ((data[8] & 0x2)<<0) | ((data[8] & 0x20)>>3);\r
PrintAndLog("|----- Dumping all blocks to file... -----|");\r
PrintAndLog("|-----------------------------------------|");\r
\r
+ \r
for (i=0 ; i<16 ; i++) {\r
for (j=0 ; j<4 ; j++) {\r
- if (j == 3){\r
+ bool received = false;\r
+ \r
+ if (j == 3){\r
UsbCommand c = {CMD_MIFARE_READBL, {i*4 + j, 0, 0}};\r
memcpy(c.d.asBytes, keyA[i], 6);\r
SendCommand(&c);\r
- resp = WaitForResponseTimeout(CMD_ACK, 1500);\r
+ received = WaitForResponseTimeout(CMD_ACK,&resp,1500);\r
}\r
else{\r
if ((rights[i][j] == 6) | (rights[i][j] == 5)) {\r
UsbCommand c = {CMD_MIFARE_READBL, {i*4+j, 1, 0}};\r
memcpy(c.d.asBytes, keyB[i], 6);\r
SendCommand(&c);\r
- resp = WaitForResponseTimeout(CMD_ACK, 1500);\r
+ received = WaitForResponseTimeout(CMD_ACK,&resp,1500);\r
}\r
else if (rights[i][j] == 7) {\r
PrintAndLog("Access rights do not allow reading of sector %d block %d",i,j);\r
UsbCommand c = {CMD_MIFARE_READBL, {i*4+j, 0, 0}};\r
memcpy(c.d.asBytes, keyA[i], 6);\r
SendCommand(&c);\r
- resp = WaitForResponseTimeout(CMD_ACK, 1500);\r
+ received = WaitForResponseTimeout(CMD_ACK,&resp,1500);\r
}\r
}\r
\r
- if (resp != NULL) {\r
- uint8_t isOK = resp->arg[0] & 0xff;\r
- uint8_t *data = resp->d.asBytes;\r
+ if (received) {\r
+ uint8_t isOK = resp.arg[0] & 0xff;\r
+ uint8_t *data = resp.d.asBytes;\r
if (j == 3) {\r
data[0] = (keyA[i][0]);\r
data[1] = (keyA[i][1]);\r
}\r
\r
for (i=0 ; i<16 ; i++) {\r
- fread(keyA[i], 1, 6, fkeys);\r
+ if (fread(keyA[i], 1, 6, fkeys) == 0) {\r
+ PrintAndLog("File reading error.");\r
+ return 2;\r
+ }\r
}\r
for (i=0 ; i<16 ; i++) {\r
- fread(keyB[i], 1, 6, fkeys);\r
+ if (fread(keyB[i], 1, 6, fkeys) == 0) {\r
+ PrintAndLog("File reading error.");\r
+ return 2;\r
+ }\r
}\r
\r
PrintAndLog("Restoring dumpdata.bin to card");\r
UsbCommand c = {CMD_MIFARE_WRITEBL, {i*4 + j, keyType, 0}};\r
memcpy(c.d.asBytes, key, 6);\r
\r
- fread(bldata, 1, 16, fdump);\r
+ if (fread(bldata, 1, 16, fdump) == 0) {\r
+ PrintAndLog("File reading error.");\r
+ return 2;\r
+ }\r
\r
if (j == 3) {\r
bldata[0] = (keyA[i][0]);\r
\r
memcpy(c.d.asBytes + 10, bldata, 16);\r
SendCommand(&c);\r
- UsbCommand *resp = WaitForResponseTimeout(CMD_ACK, 1500);\r
\r
- if (resp != NULL) {\r
- uint8_t isOK = resp->arg[0] & 0xff;\r
+ UsbCommand resp;\r
+ if (WaitForResponseTimeout(CMD_ACK,&resp,1500)) {\r
+ uint8_t isOK = resp.arg[0] & 0xff;\r
PrintAndLog("isOk:%02x", isOK);\r
} else {\r
PrintAndLog("Command execute timeout");\r
if (res)\r
res = mfCheckKeys(trgBlockNo, trgKeyType, 8, &keyBlock[6 * 8], &key64);\r
if (!res) {\r
- PrintAndLog("Found valid key:%012llx", key64);\r
+ PrintAndLog("Found valid key:%012"llx, key64);\r
\r
// transfer key to the emulator\r
if (transferToEml) {\r
if (res)\r
res = mfCheckKeys(trgBlockNo, trgKeyType, 8, &keyBlock[6 * 8], &key64);\r
if (!res) {\r
- PrintAndLog("Found valid key:%012llx", key64); \r
+ PrintAndLog("Found valid key:%012"llx, key64);\r
e_sector[trgBlockNo / 4].foundKey[trgKeyType] = 1;\r
e_sector[trgBlockNo / 4].Key[trgKeyType] = key64;\r
}\r
PrintAndLog("|sec|key A |res|key B |res|");\r
PrintAndLog("|---|----------------|---|----------------|---|");\r
for (i = 0; i < SectorsCnt; i++) {\r
- PrintAndLog("|%03d| %012llx | %d | %012llx | %d |", i, \r
+ PrintAndLog("|%03d| %012"llx" | %d | %012"llx" | %d |", i,\r
e_sector[i].Key[0], e_sector[i].foundKey[0], e_sector[i].Key[1], e_sector[i].foundKey[1]);\r
}\r
PrintAndLog("|---|----------------|---|----------------|---|");\r
if ( (f = fopen( filename , "r")) ) {\r
while( !feof(f) ){\r
memset(buf, 0, sizeof(buf));\r
- fgets(buf, sizeof(buf), f);\r
- \r
+ if (fgets(buf, sizeof(buf), f) == NULL) {\r
+ PrintAndLog("File reading error.");\r
+ return 2;\r
+ }\r
+ \r
if (strlen(buf) < 12 || buf[11] == '\n')\r
continue;\r
\r
}\r
memset(keyBlock + 6 * keycnt, 0, 6);\r
num_to_bytes(strtoll(buf, NULL, 16), 6, keyBlock + 6*keycnt);\r
- PrintAndLog("chk custom key[%d] %012llx", keycnt, bytes_to_num(keyBlock + 6*keycnt, 6));\r
+ PrintAndLog("chk custom key[%d] %012"llx, keycnt, bytes_to_num(keyBlock + 6*keycnt, 6));\r
keycnt++;\r
}\r
} else {\r
res = mfCheckKeys(b, t, size, keyBlock +6*c, &key64);\r
if (res !=1) {\r
if (!res) {\r
- PrintAndLog("Found valid key:[%012llx]",key64);\r
+ PrintAndLog("Found valid key:[%012"llx"]",key64);\r
if (transferToEml) {\r
uint8_t block[16];\r
mfEmlGetMem(block, get_trailer_block(b), 1);\r
} \r
\r
blockNo = param_get8(Cmd, 0);\r
- if (blockNo >= 32 * 4 + 8 * 16) {\r
- PrintAndLog("Block number must be in [0..255] as in MIFARE classic.");\r
- return 1;\r
- }\r
\r
PrintAndLog(" ");\r
if (!mfEmlGetMem(data, blockNo, 3)) {\r
} \r
\r
blockNo = param_get8(Cmd, 0);\r
- if (blockNo >= 32 * 4 + 8 * 16) {\r
- PrintAndLog("Block number must be in [0..255] as in MIFARE classic.");\r
- return 1;\r
- }\r
\r
if (param_gethex(Cmd, 1, memBlock, 32)) {\r
PrintAndLog("block data must include 32 HEX symbols");\r
blockNum = 0;\r
while(!feof(f)){\r
memset(buf, 0, sizeof(buf));\r
- fgets(buf, sizeof(buf), f);\r
+ if (fgets(buf, sizeof(buf), f) == NULL) {\r
+ PrintAndLog("File reading error.");\r
+ return 2;\r
+ }\r
\r
if (strlen(buf) < 32){\r
if(strlen(buf) && feof(f))\r
}\r
keyA = bytes_to_num(data, 6);\r
keyB = bytes_to_num(data + 10, 6);\r
- PrintAndLog("|%03d| %012llx | %012llx |", i, keyA, keyB);\r
+ PrintAndLog("|%03d| %012"llx" | %012"llx" |", i, keyA, keyB);\r
}\r
PrintAndLog("|---|----------------|----------------|");\r
\r
} \r
\r
blockNo = param_get8(Cmd, 0);\r
- if (blockNo >= 32 * 4 + 8 * 16) {\r
- PrintAndLog("Block number must be in [0..255] as in MIFARE classic.");\r
- return 1;\r
- }\r
\r
if (param_gethex(Cmd, 1, memBlock, 32)) {\r
PrintAndLog("block data must include 32 HEX symbols");\r
flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC;\r
while(!feof(f)){\r
memset(buf, 0, sizeof(buf));\r
- fgets(buf, sizeof(buf), f);\r
+ if (fgets(buf, sizeof(buf), f) == NULL) {\r
+ PrintAndLog("File reading error.");\r
+ return 2;\r
+ }\r
\r
if (strlen(buf) < 32){\r
if(strlen(buf) && feof(f))\r
} \r
\r
blockNo = param_get8(Cmd, 0);\r
- if (blockNo >= 32 * 4 + 8 * 16) {\r
- PrintAndLog("Block number must be in [0..255] as in MIFARE classic.");\r
- return 1;\r
- }\r
\r
PrintAndLog("--block number:%02x ", blockNo);\r
\r
\r
int CmdHF14AMfSniff(const char *Cmd){\r
// params\r
- bool wantLogToFile = 1;\r
- bool wantDecrypt = 1;\r
- bool wantSaveToEml = 0;\r
+ bool wantLogToFile = 0;\r
+ bool wantDecrypt = 0;\r
+ //bool wantSaveToEml = 0; TODO\r
bool wantSaveToEmlFile = 0;\r
\r
//var \r
uint8_t atqa[2];\r
uint8_t sak;\r
bool isTag;\r
+ uint32_t parity;\r
uint8_t buf[3000];\r
uint8_t * bufPtr = buf;\r
memset(buf, 0x00, 3000);\r
char ctmp = param_getchar(Cmd, i);\r
if (ctmp == 'l' || ctmp == 'L') wantLogToFile = true;\r
if (ctmp == 'd' || ctmp == 'D') wantDecrypt = true;\r
- if (ctmp == 'e' || ctmp == 'E') wantSaveToEml = true;\r
+ //if (ctmp == 'e' || ctmp == 'E') wantSaveToEml = true; TODO\r
if (ctmp == 'f' || ctmp == 'F') wantSaveToEmlFile = true;\r
}\r
\r
break;\r
}\r
\r
- UsbCommand * resp = WaitForResponseTimeout(CMD_ACK, 2000);\r
- if (resp != NULL) {\r
- res = resp->arg[0] & 0xff;\r
- len = resp->arg[1];\r
- num = resp->arg[2];\r
+ UsbCommand resp;\r
+ if (WaitForResponseTimeout(CMD_ACK,&resp,2000)) {\r
+ res = resp.arg[0] & 0xff;\r
+ len = resp.arg[1];\r
+ num = resp.arg[2];\r
\r
if (res == 0) return 0;\r
if (res == 1) {\r
bufPtr = buf;\r
memset(buf, 0x00, 3000);\r
}\r
- memcpy(bufPtr, resp->d.asBytes, len);\r
+ memcpy(bufPtr, resp.d.asBytes, len);\r
bufPtr += len;\r
pckNum++;\r
}\r
num = 0;\r
while (bufPtr - buf + 9 < blockLen) {\r
isTag = bufPtr[3] & 0x80 ? true:false;\r
- bufPtr += 8;\r
+ bufPtr += 4;\r
+ parity = *((uint32_t *)(bufPtr));\r
+ bufPtr += 4;\r
len = bufPtr[0];\r
bufPtr++;\r
if ((len == 14) && (bufPtr[0] = 0xff) && (bufPtr[1] = 0xff)) {\r
} else {\r
PrintAndLog("%s(%d):%s", isTag ? "TAG":"RDR", num, sprint_hex(bufPtr, len));\r
if (wantLogToFile) AddLogHex(logHexFileName, isTag ? "TAG: ":"RDR: ", bufPtr, len);\r
- if (wantDecrypt) mfTraceDecode(bufPtr, len, wantSaveToEmlFile);\r
+ if (wantDecrypt) mfTraceDecode(bufPtr, len, parity, wantSaveToEmlFile);\r
}\r
bufPtr += len;\r
num++;\r
int CmdHFMF(const char *Cmd)\r
{\r
// flush\r
- while (WaitForResponseTimeout(CMD_ACK, 500) != NULL) ;\r
+ WaitForResponseTimeout(CMD_ACK,NULL,100);\r
\r
CmdsParse(CommandTable, Cmd);\r
return 0;\r