diff --git a/client/cmdflashmem.c b/client/cmdflashmem.c index 28f0d6853..b77161951 100644 --- a/client/cmdflashmem.c +++ b/client/cmdflashmem.c @@ -212,7 +212,7 @@ static int CmdFlashMemLoad(const char *Cmd) { switch (d) { case DICTIONARY_MIFARE: start_index = DEFAULT_MF_KEYS_OFFSET; - res = loadFileDICTIONARY(filename, "dic", data + 2, &datalen, 6, &keycount); + res = loadFileDICTIONARY(filename, data + 2, &datalen, 6, &keycount); if (res || !keycount) { free(data); return 1; @@ -223,7 +223,7 @@ static int CmdFlashMemLoad(const char *Cmd) { break; case DICTIONARY_T55XX: start_index = DEFAULT_T55XX_KEYS_OFFSET; - res = loadFileDICTIONARY(filename, "dic", data + 2, &datalen, 4, &keycount); + res = loadFileDICTIONARY(filename, data + 2, &datalen, 4, &keycount); if (res || !keycount) { free(data); return 1; @@ -234,7 +234,7 @@ static int CmdFlashMemLoad(const char *Cmd) { break; case DICTIONARY_ICLASS: start_index = DEFAULT_ICLASS_KEYS_OFFSET; - res = loadFileDICTIONARY(filename, "dic", data + 2, &datalen, 8, &keycount); + res = loadFileDICTIONARY(filename, data + 2, &datalen, 8, &keycount); if (res || !keycount) { free(data); return 1; @@ -244,8 +244,8 @@ static int CmdFlashMemLoad(const char *Cmd) { datalen += 2; break; case DICTIONARY_NONE: - res = loadFile(filename, "bin", data, FLASH_MEM_MAX_SIZE, &datalen); - //int res = loadFileEML( filename, "eml", data, &datalen); + res = loadFile(filename, ".bin", data, FLASH_MEM_MAX_SIZE, &datalen); + //int res = loadFileEML( filename, data, &datalen); if (res) { free(data); return 1; diff --git a/client/cmdhfmf.c b/client/cmdhfmf.c index 8471ff45a..db1b7d798 100644 --- a/client/cmdhfmf.c +++ b/client/cmdhfmf.c @@ -2584,8 +2584,8 @@ int CmdHF14AMfELoad(const char *Cmd) { uint8_t *data = calloc(4096, sizeof(uint8_t)); size_t datalen = 0; - //int res = loadFile(filename, "bin", data, maxdatalen, &datalen); - int res = loadFileEML(filename, "eml", data, &datalen); + //int res = loadFile(filename, ".bin", data, maxdatalen, &datalen); + int res = loadFileEML(filename, data, &datalen); if (res) { free(data); return 1; @@ -2880,12 +2880,12 @@ static int CmdHF14AMfCLoad(const char *Cmd) { size_t datalen = 0; int res = 0; if (fillFromBin) { - res = loadFile(fileName, "bin", data, maxdatalen, &datalen); + res = loadFile(fileName, ".bin", data, maxdatalen, &datalen); } else { if (fillFromJson) { - res = loadFileJSON(fileName, "json", data, maxdatalen, &datalen); + res = loadFileJSON(fileName, data, maxdatalen, &datalen); } else { - res = loadFileEML(Cmd, "eml", data, &datalen); + res = loadFileEML(Cmd, data, &datalen); } } diff --git a/client/cmdlfhitag.c b/client/cmdlfhitag.c index e7eaea6dd..f901a042c 100644 --- a/client/cmdlfhitag.c +++ b/client/cmdlfhitag.c @@ -295,7 +295,7 @@ static int CmdLFHitagSim(const char *Cmd) { break; case 'e': param_getstr(Cmd, cmdp + 1, filename, sizeof(filename)); - res = loadFileEML(filename, "eml", data, &datalen); + res = loadFileEML(filename, data, &datalen); if (res > 0 || datalen != maxdatalen) { PrintAndLogDevice(FAILED, "error, bytes read mismatch file size"); errors = true; @@ -306,7 +306,7 @@ static int CmdLFHitagSim(const char *Cmd) { break; case 'j': param_getstr(Cmd, cmdp + 1, filename, sizeof(filename)); - res = loadFileJSON(filename, "json", data, maxdatalen, &datalen); + res = loadFileJSON(filename, data, maxdatalen, &datalen); if (res > 0) { errors = true; break; @@ -316,7 +316,7 @@ static int CmdLFHitagSim(const char *Cmd) { break; case 'b': param_getstr(Cmd, cmdp + 1, filename, sizeof(filename)); - res = loadFile(filename, "bin", data, maxdatalen, &datalen); + res = loadFile(filename, ".bin", data, maxdatalen, &datalen); if (res > 0) { errors = true; break; @@ -611,7 +611,7 @@ static int CmdLFHitagCheckChallenges(const char *Cmd) { return usage_hitag_checkchallenges(); case 'f': param_getstr(Cmd, cmdp + 1, filename, sizeof(filename)); - res = loadFile(filename, "cc", data, 8 * 60, &datalen); + res = loadFile(filename, ".cc", data, 8 * 60, &datalen); if (res > 0) { errors = true; break; diff --git a/client/cmdlft55xx.c b/client/cmdlft55xx.c index 6934e20e3..52abba90b 100644 --- a/client/cmdlft55xx.c +++ b/client/cmdlft55xx.c @@ -1906,7 +1906,7 @@ static int CmdT55xxChkPwds(const char *Cmd) { return 1; } - int res = loadFileDICTIONARY(filename, "dic", keyBlock, &datalen, 4, &keycount); + int res = loadFileDICTIONARY(filename, keyBlock, &datalen, 4, &keycount); if (res || keycount == 0) { PrintAndLogEx(WARNING, "No keys found in file"); free(keyBlock); diff --git a/client/loclass/fileutils.c b/client/loclass/fileutils.c index 52be1d4b8..5370c0c5b 100644 --- a/client/loclass/fileutils.c +++ b/client/loclass/fileutils.c @@ -274,14 +274,11 @@ out: int loadFile(const char *preferredName, const char *suffix, void *data, size_t maxdatalen, size_t *datalen) { - if (preferredName == NULL) return 1; - if (suffix == NULL) return 1; if (data == NULL) return 1; + char *fileName = filenamemcopy(preferredName, suffix); + if (fileName == NULL) return 1; int retval = 0; - int size = sizeof(char) * (strlen(preferredName) + strlen(suffix) + 10); - char *fileName = calloc(size, sizeof(char)); - sprintf(fileName, "%s.%s", preferredName, suffix); FILE *f = fopen(fileName, "rb"); if (!f) { @@ -336,17 +333,14 @@ out: return retval; } -int loadFileEML(const char *preferredName, const char *suffix, void *data, size_t *datalen) { +int loadFileEML(const char *preferredName, void *data, size_t *datalen) { - if (preferredName == NULL) return 1; - if (suffix == NULL) return 1; if (data == NULL) return 1; + char *fileName = filenamemcopy(preferredName, ".eml"); + if (fileName == NULL) return 1; size_t counter = 0; int retval = 0, hexlen = 0; - int size = sizeof(char) * (strlen(preferredName) + strlen(suffix) + 10); - char *fileName = calloc(size, sizeof(char)); - sprintf(fileName, "%s.%s", preferredName, suffix); FILE *f = fopen(fileName, "r"); if (!f) { @@ -393,20 +387,17 @@ out: return retval; } -int loadFileJSON(const char *preferredName, const char *suffix, void *data, size_t maxdatalen, size_t *datalen) { +int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen) { - if (preferredName == NULL) return 1; - if (suffix == NULL) return 1; if (data == NULL) return 1; + char *fileName = filenamemcopy(preferredName, ".json"); + if (fileName == NULL) return 1; *datalen = 0; json_t *root; json_error_t error; int retval = 0; - int size = sizeof(char) * (strlen(preferredName) + strlen(suffix) + 10); - char *fileName = calloc(size, sizeof(char)); - sprintf(fileName, "%s.%s", preferredName, suffix); root = json_load_file(fileName, 0, &error); if (!root) { @@ -502,11 +493,12 @@ out: return retval; } -int loadFileDICTIONARY(const char *preferredName, const char *suffix, void *data, size_t *datalen, uint8_t keylen, uint16_t *keycnt) { +int loadFileDICTIONARY(const char *preferredName, void *data, size_t *datalen, uint8_t keylen, uint16_t *keycnt) { + - if (preferredName == NULL) return 1; - if (suffix == NULL) return 1; if (data == NULL) return 1; + char *fileName = filenamemcopy(preferredName, ".dic"); + if (fileName == NULL) return 1; // t5577 == 4bytes // mifare == 6 bytes @@ -523,9 +515,6 @@ int loadFileDICTIONARY(const char *preferredName, const char *suffix, void *data size_t counter = 0; int retval = 0; - int size = sizeof(char) * (strlen(preferredName) + strlen(suffix) + 10); - char *fileName = calloc(size, sizeof(char)); - sprintf(fileName, "%s.%s", preferredName, suffix); FILE *f = fopen(fileName, "r"); if (!f) { diff --git a/client/loclass/fileutils.h b/client/loclass/fileutils.h index 57dfbebc8..6f6b5456a 100644 --- a/client/loclass/fileutils.h +++ b/client/loclass/fileutils.h @@ -110,7 +110,7 @@ int saveFileJSON(const char *preferredName, const char *suffix, JSONFileType fty * E.g. dumpdata-15.bin * * @param preferredName - * @param suffix the file suffix. Leave out the ".". + * @param suffix the file suffix. Including the ".". * @param data The data array to store the loaded bytes from file * @param maxdatalen the number of bytes that your data array has * @param datalen the number of bytes loaded from file @@ -123,25 +123,23 @@ int loadFile(const char *preferredName, const char *suffix, void *data, size_t m * E.g. dumpdata-15.txt * * @param preferredName - * @param suffix the file suffix. Leave out the ".". * @param data The data array to store the loaded bytes from file * @param datalen the number of bytes loaded from file * @return 0 for ok, 1 for failz */ -int loadFileEML(const char *preferredName, const char *suffix, void *data, size_t *datalen); +int loadFileEML(const char *preferredName, void *data, size_t *datalen); /** * @brief Utility function to load data from a JSON textfile. This method takes a preferred name. * E.g. dumpdata-15.json * * @param preferredName - * @param suffix the file suffix. Leave out the ".". * @param data The data array to store the loaded bytes from file * @param maxdatalen maximum size of data array in bytes * @param datalen the number of bytes loaded from file * @return 0 for ok, 1 for failz */ -int loadFileJSON(const char *preferredName, const char *suffix, void *data, size_t maxdatalen, size_t *datalen); +int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen); /** @@ -149,14 +147,13 @@ int loadFileJSON(const char *preferredName, const char *suffix, void *data, size * E.g. default_keys.dic * * @param preferredName - * @param suffix the file suffix. Leave out the ".". * @param data The data array to store the loaded bytes from file * @param maxdatalen maximum size of data array in bytes * @param datalen the number of bytes loaded from file * @param keylen the number of bytes a key per row is * @return 0 for ok, 1 for failz */ -int loadFileDICTIONARY(const char *preferredName, const char *suffix, void *data, size_t *datalen, uint8_t keylen, uint16_t *keycnt); +int loadFileDICTIONARY(const char *preferredName, void *data, size_t *datalen, uint8_t keylen, uint16_t *keycnt); /** * @brief Utility function to check and convert old mfu dump format to new diff --git a/client/util.c b/client/util.c index 472b9d17d..0d8781619 100644 --- a/client/util.c +++ b/client/util.c @@ -891,10 +891,23 @@ void str_lower(char *s) { for (size_t i = 0; i < strlen(s); i++) s[i] = tolower(s[i]); } + +// check for prefix in string bool str_startswith(const char *s, const char *pre) { return strncmp(pre, s, strlen(pre)) == 0; } +// check for suffix in string +bool str_endswith(const char *s, const char *suffix) { + size_t ls = strlen(s); + size_t lsuffix = strlen(suffix); + if (ls >= lsuffix) + { + return strncmp(suffix, s + (ls - lsuffix), lsuffix) == 0; + } + return false; +} + // Replace unprintable characters with a dot in char buffer void clean_ascii(unsigned char *buf, size_t len) { for (size_t i = 0; i < len; i++) { @@ -917,7 +930,7 @@ void strcreplace(char *buf, size_t len, char from, char to) { } } -char *strmcopy(char *buf) { +char *strmcopy(const char *buf) { char *str = (char *) calloc(strlen(buf) + 1, sizeof(uint8_t)); if (str != NULL) { memset(str, 0, strlen(buf) + 1); @@ -925,3 +938,16 @@ char *strmcopy(char *buf) { } return str; } + +char *filenamemcopy(const char *preferredName, const char *suffix) { + if (preferredName == NULL) return NULL; + if (suffix == NULL) return NULL; + char *fileName = (char *) calloc(strlen(preferredName) + strlen(suffix) + 1, sizeof(uint8_t)); + if (fileName == NULL) + return NULL; + strcpy(fileName, preferredName); + if (str_endswith(fileName, suffix)) + return fileName; + strcat(fileName, suffix); + return fileName; +} diff --git a/client/util.h b/client/util.h index 5e60868bb..6d0cc98aa 100644 --- a/client/util.h +++ b/client/util.h @@ -261,8 +261,10 @@ int num_CPUs(void); // number of logical CPUs void str_lower(char *s); // converts string to lower case bool str_startswith(const char *s, const char *pre); // check for prefix in string +bool str_endswith(const char *s, const char *suffix); // check for suffix in string void clean_ascii(unsigned char *buf, size_t len); void strcleanrn(char *buf, size_t len); void strcreplace(char *buf, size_t len, char from, char to); -char *strmcopy(char *buf); +char *strmcopy(const char *buf); +char *filenamemcopy(const char *preferredName, const char *suffix); #endif