\r
int CmdHF14AMfCSetBlk(const char *Cmd)\r
{\r
- uint8_t memBlock[16] = {0x00};\r
+ uint8_t block[16] = {0x00};\r
uint8_t blockNo = 0;\r
- bool wipeCard = FALSE;\r
+ uint8_t params = MAGIC_SINGLE;\r
int res;\r
\r
if (strlen(Cmd) < 1 || param_getchar(Cmd, 0) == 'h') {\r
\r
blockNo = param_get8(Cmd, 0);\r
\r
- if (param_gethex(Cmd, 1, memBlock, 32)) {\r
+ if (param_gethex(Cmd, 1, block, 32)) {\r
PrintAndLog("block data must include 32 HEX symbols");\r
return 1;\r
}\r
\r
char ctmp = param_getchar(Cmd, 2);\r
- wipeCard = (ctmp == 'w' || ctmp == 'W');\r
- PrintAndLog("--block number:%2d data:%s", blockNo, sprint_hex(memBlock, 16));\r
+ if (ctmp == 'w' || ctmp == 'W')\r
+ params |= MAGIC_WIPE;\r
+ \r
+ PrintAndLog("--block number:%2d data:%s", blockNo, sprint_hex(block, 16));\r
\r
- res = mfCSetBlock(blockNo, memBlock, NULL, wipeCard, CSETBLOCK_SINGLE_OPER);\r
+ res = mfCSetBlock(blockNo, block, NULL, params);\r
if (res) {\r
PrintAndLog("Can't write block. error=%d", res);\r
return 1;\r
int CmdHF14AMfCLoad(const char *Cmd)\r
{\r
FILE * f;\r
- char filename[FILE_PATH_SIZE] = {0x00};\r
+ char filename[FILE_PATH_SIZE];\r
char * fnameptr = filename;\r
char buf[64] = {0x00};\r
uint8_t buf8[64] = {0x00};\r
uint8_t fillFromEmulator = 0;\r
int i, len, blockNum, flags=0;\r
\r
+ memset(filename, 0, sizeof(filename));\r
+ \r
char ctmp = param_getchar(Cmd, 0);\r
\r
if (ctmp == 'h' || ctmp == 'H' || ctmp == 0x00) {\r
PrintAndLog("Cant get block: %d", blockNum);\r
return 2;\r
}\r
- if (blockNum == 0) flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC; // switch on field and send magic sequence\r
+ if (blockNum == 0) flags = MAGIC_INIT + MAGIC_WUPC; // switch on field and send magic sequence\r
if (blockNum == 1) flags = 0; // just write\r
- if (blockNum == 16 * 4 - 1) flags = CSETBLOCK_HALT + CSETBLOCK_RESET_FIELD; // Done. Magic Halt and switch off field.\r
+ if (blockNum == 16 * 4 - 1) flags = MAGIC_HALT + MAGIC_OFF; // Done. Magic Halt and switch off field.\r
\r
- if (mfCSetBlock(blockNum, buf8, NULL, 0, flags)) {\r
+ if (mfCSetBlock(blockNum, buf8, NULL, flags)) {\r
PrintAndLog("Cant set magic card block: %d", blockNum);\r
return 3;\r
}\r
for (i = 0; i < 32; i += 2)\r
sscanf(&buf[i], "%02x", (unsigned int *)&buf8[i / 2]);\r
\r
- if (blockNum == 0) flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC; // switch on field and send magic sequence\r
+ if (blockNum == 0) flags = MAGIC_INIT + MAGIC_WUPC; // switch on field and send magic sequence\r
if (blockNum == 1) flags = 0; // just write\r
- if (blockNum == 16 * 4 - 1) flags = CSETBLOCK_HALT + CSETBLOCK_RESET_FIELD; // Done. Switch off field.\r
+ if (blockNum == 16 * 4 - 1) flags = MAGIC_HALT + MAGIC_OFF; // Done. Switch off field.\r
\r
- if (mfCSetBlock(blockNum, buf8, NULL, 0, flags)) {\r
+ if (mfCSetBlock(blockNum, buf8, NULL, flags)) {\r
PrintAndLog("Can't set magic card block: %d", blockNum);\r
return 3;\r
}\r
}\r
fclose(f);\r
\r
+ // 64 or 256blocks.\r
if (blockNum != 16 * 4 && blockNum != 32 * 4 + 8 * 16){\r
PrintAndLog("File content error. There must be 64 blocks");\r
return 4;\r
}\r
\r
int CmdHF14AMfCGetBlk(const char *Cmd) {\r
- uint8_t memBlock[16];\r
+ uint8_t data[16];\r
uint8_t blockNo = 0;\r
int res;\r
- memset(memBlock, 0x00, sizeof(memBlock));\r
+ memset(data, 0x00, sizeof(data));\r
+ char ctmp = param_getchar(Cmd, 0);\r
\r
- if (strlen(Cmd) < 1 || param_getchar(Cmd, 0) == 'h') {\r
+ if (strlen(Cmd) < 1 || ctmp == 'h' || ctmp == 'H') {\r
PrintAndLog("Usage: hf mf cgetblk <block number>");\r
PrintAndLog("sample: hf mf cgetblk 1");\r
PrintAndLog("Get block data from magic Chinese card (only works with such cards)\n");\r
\r
PrintAndLog("--block number:%2d ", blockNo);\r
\r
- res = mfCGetBlock(blockNo, memBlock, CSETBLOCK_SINGLE_OPER);\r
+ res = mfCGetBlock(blockNo, data, MAGIC_SINGLE);\r
if (res) {\r
- PrintAndLog("Can't read block. error=%d", res);\r
- return 1;\r
- }\r
+ PrintAndLog("Can't read block. error=%d", res);\r
+ return 1;\r
+ }\r
\r
- PrintAndLog("block data:%s", sprint_hex(memBlock, 16));\r
+ PrintAndLog("data:%s", sprint_hex(data, sizeof(data)));\r
return 0;\r
}\r
\r
int CmdHF14AMfCGetSc(const char *Cmd) {\r
- uint8_t memBlock[16] = {0x00};\r
+ uint8_t data[16];\r
uint8_t sectorNo = 0;\r
int i, res, flags;\r
-\r
- if (strlen(Cmd) < 1 || param_getchar(Cmd, 0) == 'h') {\r
+ memset(data, 0x00, sizeof(data));\r
+ char ctmp = param_getchar(Cmd, 0);\r
+ \r
+ if (strlen(Cmd) < 1 || ctmp == 'h' || ctmp == 'H') {\r
PrintAndLog("Usage: hf mf cgetsc <sector number>");\r
PrintAndLog("sample: hf mf cgetsc 0");\r
PrintAndLog("Get sector data from magic Chinese card (only works with such cards)\n");\r
}\r
\r
PrintAndLog("--sector number:%d ", sectorNo);\r
+ PrintAndLog("block | data");\r
\r
- flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC;\r
+ flags = MAGIC_INIT + MAGIC_WUPC;\r
for (i = 0; i < 4; i++) {\r
if (i == 1) flags = 0;\r
- if (i == 3) flags = CSETBLOCK_HALT + CSETBLOCK_RESET_FIELD;\r
+ if (i == 3) flags = MAGIC_HALT + MAGIC_OFF;\r
\r
- res = mfCGetBlock(sectorNo * 4 + i, memBlock, flags);\r
+ res = mfCGetBlock(sectorNo * 4 + i, data, flags);\r
if (res) {\r
PrintAndLog("Can't read block. %d error=%d", sectorNo * 4 + i, res);\r
return 1;\r
- }\r
- \r
- PrintAndLog("block %3d data:%s", sectorNo * 4 + i, sprint_hex(memBlock, 16));\r
+ } \r
+ PrintAndLog(" %3d | %s", sectorNo * 4 + i, sprint_hex(data, sizeof(data)));\r
}\r
return 0;\r
}\r
int CmdHF14AMfCSave(const char *Cmd) {\r
\r
FILE * f;\r
- char filename[FILE_PATH_SIZE] = {0x00};\r
+ char filename[FILE_PATH_SIZE];\r
char * fnameptr = filename;\r
uint8_t fillFromEmulator = 0;\r
- uint8_t buf[64] = {0x00};\r
+ uint8_t buf[64];\r
int i, j, len, flags;\r
\r
- // memset(filename, 0, sizeof(filename));\r
- // memset(buf, 0, sizeof(buf));\r
+ memset(filename, 0, sizeof(filename));\r
+ memset(buf, 0, sizeof(buf));\r
char ctmp = param_getchar(Cmd, 0);\r
\r
if ( ctmp == 'h' || ctmp == 'H' ) {\r
\r
if (fillFromEmulator) {\r
// put into emulator\r
- flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC;\r
+ flags = MAGIC_INIT + MAGIC_WUPC;\r
for (i = 0; i < 16 * 4; i++) {\r
if (i == 1) flags = 0;\r
- if (i == 16 * 4 - 1) flags = CSETBLOCK_HALT + CSETBLOCK_RESET_FIELD;\r
+ if (i == 16 * 4 - 1) flags = MAGIC_HALT + MAGIC_OFF;\r
\r
if (mfCGetBlock(i, buf, flags)) {\r
PrintAndLog("Cant get block: %d", i);\r
len = strlen(Cmd);\r
if (len > FILE_PATH_SIZE - 4) len = FILE_PATH_SIZE - 4;\r
\r
+ // get filename based on UID\r
if (len < 1) {\r
- // get filename\r
- if (mfCGetBlock(0, buf, CSETBLOCK_SINGLE_OPER)) {\r
+ \r
+ if (mfCGetBlock(0, buf, MAGIC_SINGLE)) {\r
PrintAndLog("Cant get block: %d", 0);\r
len = sprintf(fnameptr, "dump");\r
fnameptr += len;\r
fnameptr += len;\r
}\r
\r
+ // add .eml extension\r
sprintf(fnameptr, ".eml"); \r
\r
// open file\r
}\r
\r
// put hex\r
- flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC;\r
+ flags = MAGIC_INIT + MAGIC_WUPC;\r
for (i = 0; i < 16 * 4; i++) {\r
if (i == 1) flags = 0;\r
- if (i == 16 * 4 - 1) flags = CSETBLOCK_HALT + CSETBLOCK_RESET_FIELD;\r
+ if (i == 16 * 4 - 1) flags = MAGIC_HALT + MAGIC_OFF;\r
\r
if (mfCGetBlock(i, buf, flags)) {\r
PrintAndLog("Cant get block: %d", i);\r
fprintf(f, "%02x", buf[j]); \r
fprintf(f,"\n");\r
}\r
+ fflush(f);\r
fclose(f);\r
- \r
PrintAndLog("Saved to file: %s", filename);\r
- \r
return 0;\r
}\r
}\r
{\r
// flush\r
WaitForResponseTimeout(CMD_ACK,NULL,100);\r
-\r
- CmdsParse(CommandTable, Cmd);\r
- return 0;\r
+ CmdsParse(CommandTable, Cmd);\r
+ return 0;\r
}\r
\r
int CmdHelp(const char *Cmd)\r
{\r
- CmdsHelp(CommandTable);\r
- return 0;\r
+ CmdsHelp(CommandTable);\r
+ return 0;\r
}\r