diff --git a/client/cmdhfmf.c b/client/cmdhfmf.c index b14dde768..1e43ff81e 100644 --- a/client/cmdhfmf.c +++ b/client/cmdhfmf.c @@ -330,7 +330,9 @@ int usage_hf14_cload(void){ PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " h this help"); PrintAndLogEx(NORMAL, " e load card with data from emulator memory"); - PrintAndLogEx(NORMAL, " load card with data from file"); + PrintAndLogEx(NORMAL, " j load card with data from json file"); + PrintAndLogEx(NORMAL, " b load card with data from binary file"); + PrintAndLogEx(NORMAL, " load card with data from eml file"); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " hf mf cload mydump"); PrintAndLogEx(NORMAL, " hf mf cload e"); @@ -2631,12 +2633,21 @@ int CmdHF14AMfCLoad(const char *Cmd) { uint8_t buf8[16] = {0x00}; uint8_t fillFromEmulator = 0; int blockNum, flags = 0; + bool fillFromJson = false; + bool fillFromBin = false; + char fileName[50] = {0}; char ctmp = tolower(param_getchar(Cmd, 0)); - if ( strlen(Cmd) == 1 ) { + if ( param_getlength(Cmd, 0) == 1 ) { if (ctmp == 'h' || ctmp == 0x00) return usage_hf14_cload(); if (ctmp == 'e' ) fillFromEmulator = 1; + if (ctmp == 'j' ) fillFromJson = true; + if (ctmp == 'b' ) fillFromBin = true; } + + if (fillFromJson || fillFromBin) + param_getstr(Cmd, 1, fileName, sizeof(fileName)); + if (fillFromEmulator) { for (blockNum = 0; blockNum < 16 * 4; blockNum += 1) { @@ -2658,10 +2669,19 @@ int CmdHF14AMfCLoad(const char *Cmd) { return 0; } - uint8_t *data = calloc(1, 4096); + size_t maxdatalen = 4096; + uint8_t *data = calloc(1, maxdatalen); size_t datalen = 0; - //int res = loadFile(Cmd, "bin", data, &datalen); - int res = loadFileEML( Cmd, "eml", data, &datalen); + int res = 0; + if (fillFromBin) { + res = loadFile(fileName, "bin", data, &datalen); + } else { + if (fillFromJson) { + res = loadFileJSON(fileName, "json", data, maxdatalen, &datalen); + } else { + res = loadFileEML( Cmd, "eml", data, &datalen); + } + } if ( res ) { free(data); return 1; diff --git a/client/loclass/fileutils.c b/client/loclass/fileutils.c index f110e02fc..c64da6b22 100644 --- a/client/loclass/fileutils.c +++ b/client/loclass/fileutils.c @@ -158,7 +158,7 @@ int saveFileJSON(const char *preferredName, const char *suffix, JSONFileType fty JsonSaveBufAsHexCompact(root, "raw", data, datalen); break; case jsfCardMemory: - JsonSaveStr(root, "FileType", "mifare card dump"); + JsonSaveStr(root, "FileType", "mfcard"); for (int i = 0; i < (datalen / 16); i++) { char path[30] = {0}; sprintf(path, "$.blocks.%d", i); @@ -335,7 +335,7 @@ out: } int loadFileJSON(const char *preferredName, const char *suffix, void* data, size_t maxdatalen, size_t* datalen) { - datalen = 0; + *datalen = 0; json_t *root; json_error_t error; @@ -360,8 +360,39 @@ int loadFileJSON(const char *preferredName, const char *suffix, void* data, size goto out; } - JsonLoadBufAsHex(root, "$.raw", data, maxdatalen, datalen); + uint8_t *udata = (uint8_t *)data; + char ctype[100] = {0}; + JsonLoadStr(root, "$.FileType", ctype); + if (!strcmp(ctype, "raw")) { + JsonLoadBufAsHex(root, "$.raw", udata, maxdatalen, datalen); + } + + if (!strcmp(ctype, "mfcard")) { + printf("--mfcard--\n"); + size_t sptr = 0; + for (int i = 0; i < 256; i++) { + if (sptr + 16 > maxdatalen) { + retval = 5; + goto out; + } + + char path[30] = {0}; + sprintf(path, "$.blocks.%d", i); + + size_t len = 0; + JsonLoadBufAsHex(root, path, &udata[sptr], 16, &len); + if (!len) + break; + printf("--- (%d) (%d) %s \n", i, len, sprint_hex(&udata[sptr], len)); + + sptr += len; + } + + *datalen = sptr; + } + + PrintAndLog("Loaded JSON: (%s) OK.", fileName); out: json_decref(root); free(fileName);