\r
int size = GetCardSize(); \r
char cmdp = param_getchar(Cmd, 0);\r
- \r
- PrintAndLog("Got %d",size);\r
- \r
- return;\r
- \r
+\r
if ( size > -1) \r
- cmdp = (char)48+size;\r
- \r
+ cmdp = (char)(48+size);\r
+\r
+ PrintAndLog("Got %d",cmdp);\r
+ \r
switch (cmdp) {\r
case '0' : numSectors = 5; break;\r
case '1' : \r
}\r
\r
if ((fin = fopen("dumpkeys.bin","rb")) == NULL) {\r
- PrintAndLog("Could not find file dumpkeys.bin");\r
+ PrintAndLog("Could not find file dumpkeys.bin"); \r
return 1;\r
}\r
\r
for (sectorNo=0; sectorNo<numSectors; sectorNo++) {\r
if (fread( keyA[sectorNo], 1, 6, fin ) == 0) {\r
PrintAndLog("File reading error.");\r
+ fclose(fin);\r
return 2;\r
}\r
}\r
for (sectorNo=0; sectorNo<numSectors; sectorNo++) {\r
if (fread( keyB[sectorNo], 1, 6, fin ) == 0) {\r
PrintAndLog("File reading error.");\r
+ fclose(fin);\r
return 2;\r
}\r
}\r
\r
+ fclose(fin);\r
+ \r
PrintAndLog("|-----------------------------------------|");\r
PrintAndLog("|------ Reading sector access bits...-----|");\r
PrintAndLog("|-----------------------------------------|");\r
uint8_t isOK = resp.arg[0] & 0xff;\r
uint8_t *data = resp.d.asBytes;\r
if (isOK){\r
- rights[sectorNo][0] = ((data[7] & 0x10)>>4) | ((data[8] & 0x1)<<1) | ((data[8] & 0x10)>>2);\r
- rights[sectorNo][1] = ((data[7] & 0x20)>>5) | ((data[8] & 0x2)<<0) | ((data[8] & 0x20)>>3);\r
- rights[sectorNo][2] = ((data[7] & 0x40)>>6) | ((data[8] & 0x4)>>1) | ((data[8] & 0x40)>>4);\r
- rights[sectorNo][3] = ((data[7] & 0x80)>>7) | ((data[8] & 0x8)>>2) | ((data[8] & 0x80)>>5);\r
+ rights[sectorNo][0] = ((data[7] & 0x10)>>2) | ((data[8] & 0x1)<<1) | ((data[8] & 0x10)>>4); // C1C2C3 for data area 0\r
+ rights[sectorNo][1] = ((data[7] & 0x20)>>3) | ((data[8] & 0x2)<<0) | ((data[8] & 0x20)>>5); // C1C2C3 for data area 1\r
+ rights[sectorNo][2] = ((data[7] & 0x40)>>4) | ((data[8] & 0x4)>>1) | ((data[8] & 0x40)>>6); // C1C2C3 for data area 2\r
+ rights[sectorNo][3] = ((data[7] & 0x80)>>5) | ((data[8] & 0x8)>>2) | ((data[8] & 0x80)>>7); // C1C2C3 for sector trailer\r
} else {\r
PrintAndLog("Could not get access rights for sector %2d. Trying with defaults...", sectorNo);\r
- rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = rights[sectorNo][3] = 0x01;\r
+ rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = 0x00;\r
+ rights[sectorNo][3] = 0x01;\r
}\r
} else {\r
PrintAndLog("Command execute timeout when trying to read access rights for sector %2d. Trying with defaults...", sectorNo);\r
- rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = rights[sectorNo][3] = 0x01;\r
+ rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = 0x00;\r
+ rights[sectorNo][3] = 0x01;\r
}\r
}\r
\r
received = WaitForResponseTimeout(CMD_ACK,&resp,1500);\r
} else { // data block. Check if it can be read with key A or key B\r
uint8_t data_area = sectorNo<32?blockNo:blockNo/5;\r
- if ((rights[sectorNo][data_area] == 3) || (rights[sectorNo][data_area] == 5)) { // only key B would work\r
+ if ((rights[sectorNo][data_area] == 0x03) || (rights[sectorNo][data_area] == 0x05)) { // only key B would work\r
UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + blockNo, 1, 0}};\r
memcpy(c.d.asBytes, keyB[sectorNo], 6);\r
SendCommand(&c);\r
received = WaitForResponseTimeout(CMD_ACK,&resp,1500);\r
- } else if (rights[sectorNo][data_area] == 7) { // no key would work\r
+ } else if (rights[sectorNo][data_area] == 0x07) { // no key would work\r
isOK = false;\r
PrintAndLog("Access rights do not allow reading of sector %2d block %3d", sectorNo, blockNo);\r
} else { // key A would work\r
PrintAndLog("Dumped %d blocks (%d bytes) to file dumpdata.bin", numblocks, 16*numblocks);\r
}\r
\r
- fclose(fin);\r
return 0;\r
}\r
\r
\r
int CmdHF14AMfChk(const char *Cmd)\r
{\r
+ if (strlen(Cmd)<3) {\r
+ PrintAndLog("Usage: hf mf chk <block number>|<*card memory> <key type (A/B/?)> [t|d] [<key (12 hex symbols)>] [<dic (*.dic)>]");\r
+ PrintAndLog(" * - all sectors");\r
+ PrintAndLog("card memory - 0 - MINI(320 bytes), 1 - 1K, 2 - 2K, 4 - 4K, <other> - 1K");\r
+ PrintAndLog("d - write keys to binary file\n");\r
+ PrintAndLog("t - write keys to emulator memory");\r
+ PrintAndLog(" sample: hf mf chk 0 A 1234567890ab keys.dic");\r
+ PrintAndLog(" hf mf chk *1 ? t");\r
+ PrintAndLog(" hf mf chk *1 ? d");\r
+ return 0;\r
+ }\r
+ \r
FILE * f;\r
char filename[256]={0};\r
char buf[13];\r
num_to_bytes(defaultKeys[defaultKeyCounter], 6, (uint8_t*)(keyBlock + defaultKeyCounter * 6));\r
}\r
\r
- if (strlen(Cmd)<3) {\r
- PrintAndLog("Usage: hf mf chk <block number>|<*card memory> <key type (A/B/?)> [t] [<key (12 hex symbols)>] [<dic (*.dic)>]");\r
- PrintAndLog(" * - all sectors");\r
- PrintAndLog("card memory - 0 - MINI(320 bytes), 1 - 1K, 2 - 2K, 4 - 4K, <other> - 1K");\r
- PrintAndLog("d - write keys to binary file\n");\r
- PrintAndLog(" sample: hf mf chk 0 A 1234567890ab keys.dic");\r
- PrintAndLog(" hf mf chk *1 ? t");\r
- return 0;\r
- } \r
- \r
if (param_getchar(Cmd, 0)=='*') {\r
blockNo = 3;\r
switch(param_getchar(Cmd+1, 0)) {\r
keycnt++;\r
memset(buf, 0, sizeof(buf));\r
}\r
+ fclose(f);\r
} else {\r
PrintAndLog("File: %s: not found or locked.", filename);\r
free(keyBlock);\r
return 1;\r
- fclose(f);\r
+ \r
}\r
}\r
}\r
break;\r
}\r
PrintAndLog("File reading error.");\r
+ fclose(f);\r
return 2;\r
}\r
if (strlen(buf) < 32){\r
\r
if ((blockNum != 16*4) && (blockNum != 32*4 + 8*16)) {\r
PrintAndLog("File content error. There must be 64 or 256 blocks.");\r
+ fclose(f);\r
return 4;\r
}\r
PrintAndLog("Loaded %d blocks from file: %s", blockNum, filename);\r
int CmdHF14AMfCSetUID(const char *Cmd)\r
{\r
uint8_t wipeCard = 0;\r
- uint8_t uid[8];\r
- uint8_t oldUid[8];\r
+ uint8_t uid[8] = {0x00};\r
+ uint8_t oldUid[8] = {0x00};\r
int res;\r
\r
if (strlen(Cmd) < 1 || param_getchar(Cmd, 0) == 'h') {\r
\r
\r
// NXP MIFARE Mini 0.3k\r
- if ( (atqa && 0xff0f == 0x0004) && (sak == 0x09) ) return 0;\r
+ if ( ( (atqa & 0xff0f) == 0x0004) && (sak == 0x09) ) return 0;\r
\r
// MIFARE Classic 1K\r
- if ( (atqa && 0xff0f == 0x0004) && (sak == 0x08) ) return 1;\r
+ if ( ((atqa & 0xff0f) == 0x0004) && (sak == 0x08) ) return 1;\r
\r
// MIFARE Classik 4K\r
- if ( (atqa && 0xff0f == 0x0002) && (sak == 0x18) ) return 4;\r
+ if ( ((atqa & 0xff0f) == 0x0002) && (sak == 0x18) ) return 4;\r
\r
// SmartMX with MIFARE 1K emulation \r
- if ( (atqa && 0xf0ff == 0x0004) ) return 1;\r
+ if ( ((atqa & 0xf0ff) == 0x0004) ) return 1;\r
\r
// SmartMX with MIFARE 4K emulation \r
- if ( (atqa && 0xf0ff == 0x0002) ) return 4; \r
+ if ( ((atqa & 0xf0ff) == 0x0002) ) return 4; \r
\r
// Infineon MIFARE CLASSIC 1K\r
- if ( (atqa && 0xffff == 0x0004) && (sak == 0x88) ) return 1;\r
+ if ( ((atqa & 0xffff) == 0x0004) && (sak == 0x88) ) return 1;\r
\r
// MFC 4K emulated by Nokia 6212 Classic\r
- if ( (atqa && 0xffff == 0x0002) && (sak == 0x38) ) return 4;\r
+ if ( ((atqa & 0xffff) == 0x0002) && (sak == 0x38) ) return 4;\r
\r
// MFC 4K emulated by Nokia 6131 NFC\r
- if ( (atqa && 0xffff == 0x0008) && (sak == 0x38) ) return 4;\r
+ if ( ((atqa & 0xffff) == 0x0008) && (sak == 0x38) ) return 4;\r
\r
+ \r
+ PrintAndLog("BEFOOO 1K %02X", (atqa & 0xff0f));\r
+ \r
// MIFARE Plus (4 Byte UID or 4 Byte RID)\r
// MIFARE Plus (7 Byte UID)\r
if (\r
- (atqa && 0xffff == 0x0002) ||\r
- (atqa && 0xffff == 0x0004) ||\r
- (atqa && 0xffff == 0x0042) || \r
- (atqa && 0xffff == 0x0044) \r
+ ((atqa & 0xffff) == 0x0002) |\r
+ ((atqa & 0xffff) == 0x0004) |\r
+ ((atqa & 0xffff) == 0x0042) | \r
+ ((atqa & 0xffff) == 0x0044) \r
)\r
{\r
switch(sak){\r
case 0x08:\r
- case 0x10:\r
+ case 0x10: {\r
//case 0x20:\r
+ PrintAndLog("2");\r
return 2;\r
break;\r
+ }\r
case 0x11:\r
- case 0x18:\r
+ case 0x18:{\r
//case 0x20:\r
+ PrintAndLog("4");\r
return 4;\r
break;\r
+ }\r
}\r
}\r
\r