hf mf csave compatibility for 4k

This commit is contained in:
Fl0-0 2017-07-07 11:37:17 +02:00
commit fa3a25f042

View file

@ -2096,32 +2096,38 @@ int CmdHF14AMfCSave(const char *Cmd) {
char * fnameptr = filename; char * fnameptr = filename;
uint8_t fillFromEmulator = 0; uint8_t fillFromEmulator = 0;
uint8_t buf[64] = {0x00}; uint8_t buf[64] = {0x00};
int i, j, len, flags, gen = 0; int i, j, len, flags, gen = 0, numblock = 64;
// memset(filename, 0, sizeof(filename)); // memset(filename, 0, sizeof(filename));
// memset(buf, 0, sizeof(buf)); // memset(buf, 0, sizeof(buf));
if (param_getchar(Cmd, 0) == 'h') { if (param_getchar(Cmd, 0) == 'h') {
PrintAndLog("It saves `magic Chinese` card dump into the file `filename.eml` or `cardID.eml`"); PrintAndLog("It saves `magic Chinese` card dump into the file `filename.eml` or `cardID.eml`");
PrintAndLog("or into emulator memory (option `e`)"); PrintAndLog("or into emulator memory (option `e`). 4K card: (option `4`)");
PrintAndLog("Usage: hf mf esave [file name w/o `.eml`][e]"); PrintAndLog("Usage: hf mf esave [file name w/o `.eml`][e][4]");
PrintAndLog(" sample: hf mf esave "); PrintAndLog(" sample: hf mf esave ");
PrintAndLog(" hf mf esave filename"); PrintAndLog(" hf mf esave filename");
PrintAndLog(" hf mf esave e \n"); PrintAndLog(" hf mf esave e");
PrintAndLog(" hf mf esave 4");
PrintAndLog(" hf mf esave filename 4");
PrintAndLog(" hf mf esave e 4\n");
return 0; return 0;
} }
char ctmp = param_getchar(Cmd, 0); char ctmp = param_getchar(Cmd, 0);
if (ctmp == 'e' || ctmp == 'E') fillFromEmulator = 1; if (ctmp == 'e' || ctmp == 'E') fillFromEmulator = 1;
if (ctmp == '4') numblock = 256;
ctmp = param_getchar(Cmd, 1);
if (ctmp == '4') numblock = 256;
gen = mfCIdentify(); gen = mfCIdentify();
PrintAndLog("Saving magic mifare %dK", numblock == 256 ? 4:1);
if (fillFromEmulator) { if (fillFromEmulator) {
// put into emulator // put into emulator
flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC; flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC;
for (i = 0; i < 16 * 4; i++) { for (i = 0; i < numblock; i++) {
if (i == 1) flags = 0; if (i == 1) flags = 0;
if (i == 16 * 4 - 1) flags = CSETBLOCK_HALT + CSETBLOCK_RESET_FIELD; if (i == numblock - 1) flags = CSETBLOCK_HALT + CSETBLOCK_RESET_FIELD;
if (gen == 2) if (gen == 2)
/* generation 1b magic card */ /* generation 1b magic card */
@ -2139,10 +2145,13 @@ int CmdHF14AMfCSave(const char *Cmd) {
} }
return 0; return 0;
} else { } else {
len = strlen(Cmd); param_getstr(Cmd, 0, filename);
len = strlen(filename);
if (len > FILE_PATH_SIZE - 5) len = FILE_PATH_SIZE - 5; if (len > FILE_PATH_SIZE - 5) len = FILE_PATH_SIZE - 5;
if (len < 1) { ctmp = param_getchar(Cmd, 0);
if (len < 1 || (ctmp == '4')) {
// get filename // get filename
flags = CSETBLOCK_SINGLE_OPER; flags = CSETBLOCK_SINGLE_OPER;
@ -2159,7 +2168,7 @@ int CmdHF14AMfCSave(const char *Cmd) {
sprintf(fnameptr, "%02x", buf[j]); sprintf(fnameptr, "%02x", buf[j]);
} }
} else { } else {
memcpy(filename, Cmd, len); //memcpy(filename, Cmd, len);
fnameptr += len; fnameptr += len;
} }
@ -2175,9 +2184,9 @@ int CmdHF14AMfCSave(const char *Cmd) {
// put hex // put hex
flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC; flags = CSETBLOCK_INIT_FIELD + CSETBLOCK_WUPC;
for (i = 0; i < 16 * 4; i++) { for (i = 0; i < numblock; i++) {
if (i == 1) flags = 0; if (i == 1) flags = 0;
if (i == 16 * 4 - 1) flags = CSETBLOCK_HALT + CSETBLOCK_RESET_FIELD; if (i == numblock - 1) flags = CSETBLOCK_HALT + CSETBLOCK_RESET_FIELD;
if (gen == 2) if (gen == 2)
/* generation 1b magic card */ /* generation 1b magic card */