diff --git a/client/cmdflashmem.c b/client/cmdflashmem.c index 0701f1d2d..c75fadb3c 100644 --- a/client/cmdflashmem.c +++ b/client/cmdflashmem.c @@ -245,7 +245,7 @@ int CmdFlashMemLoad(const char *Cmd) { break; default: - res = loadFile(filename, "bin", data, &datalen); + res = loadFile(filename, "bin", data, FLASH_MEM_MAX_SIZE, &datalen); //int res = loadFileEML( filename, "eml", data, &datalen); if (res) { free(data); diff --git a/client/cmdhfmf.c b/client/cmdhfmf.c index 6ece17850..44722a7bb 100644 --- a/client/cmdhfmf.c +++ b/client/cmdhfmf.c @@ -2541,7 +2541,7 @@ int CmdHF14AMfELoad(const char *Cmd) { uint8_t *data = calloc(4096, sizeof(uint8_t)); size_t datalen = 0; - //int res = loadFile(filename, "bin", data, &datalen); + //int res = loadFile(filename, "bin", data, maxdatalen, &datalen); int res = loadFileEML(filename, "eml", data, &datalen); if (res) { free(data); @@ -2827,7 +2827,7 @@ int CmdHF14AMfCLoad(const char *Cmd) { size_t datalen = 0; int res = 0; if (fillFromBin) { - res = loadFile(fileName, "bin", data, &datalen); + res = loadFile(fileName, "bin", data, maxdatalen, &datalen); } else { if (fillFromJson) { res = loadFileJSON(fileName, "json", data, maxdatalen, &datalen); diff --git a/client/cmdlfhitag.c b/client/cmdlfhitag.c index bdf5c7605..85944048c 100644 --- a/client/cmdlfhitag.c +++ b/client/cmdlfhitag.c @@ -29,30 +29,36 @@ size_t nbytes(size_t nbits) { return (nbits / 8) + ((nbits % 8) > 0); } int usage_hitag_sniff(void) { - PrintAndLogEx(NORMAL, "Usage: lf hitag sniff"); - PrintAndLogEx(NORMAL, " p : password"); - PrintAndLogEx(NORMAL, " f : data filename, if no given, UID will be used as filename"); + PrintAndLogEx(NORMAL, "Sniff traffic between Hitag reader and tag. Use " _YELLOW_("`lf hitag list`")" to view collected data."); + PrintAndLogEx(NORMAL, "Usage: lf hitag sniff [h] "); + PrintAndLogEx(NORMAL, "Options:"); + PrintAndLogEx(NORMAL, " h This help"); +// PrintAndLogEx(NORMAL, " p Password"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " lf hitag sniff"); return 0; } int usage_hitag_sim(void) { - PrintAndLogEx(NORMAL, "Simulate Hitag2 transponder"); - PrintAndLogEx(NORMAL, "Usage: lf hitag sim [2|s] e|j|b "); - PrintAndLogEx(NORMAL, " [2|s] : 2 = hitag2, s = hitagS"); - PrintAndLogEx(NORMAL, " e : load data from EML filename"); - PrintAndLogEx(NORMAL, " j : load data from JSON filename"); - PrintAndLogEx(NORMAL, " b : load data from BIN filename"); + PrintAndLogEx(NORMAL, "Simulate " _YELLOW_("Hitag2 / HitagS")" transponder"); + PrintAndLogEx(NORMAL, "Usage: lf hitag sim [h] [2|s] e|j|b "); + PrintAndLogEx(NORMAL, "Options:"); + PrintAndLogEx(NORMAL, " h This help"); + PrintAndLogEx(NORMAL, " [2|s] 2 = hitag2, s = hitagS"); + PrintAndLogEx(NORMAL, " e Load data from EML file"); + PrintAndLogEx(NORMAL, " j Load data from JSON file"); + PrintAndLogEx(NORMAL, " b Load data from BIN file"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " lf hitag sim 2 b lf-hitag-dump"); return 0; } int usage_hitag_dump(void) { - PrintAndLogEx(NORMAL, "Usage: lf hitag dump p f "); - PrintAndLogEx(NORMAL, " p : password"); - PrintAndLogEx(NORMAL, " f : data filename, if no given, UID will be used as filename"); + PrintAndLogEx(NORMAL, "Usage: lf hitag dump [h] p f "); + PrintAndLogEx(NORMAL, "Options:"); + PrintAndLogEx(NORMAL, " h This help"); +// PrintAndLogEx(NORMAL, " p password"); +// PrintAndLogEx(NORMAL, " f data filename, if no given, UID will be used as filename"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); PrintAndLogEx(NORMAL, " lf hitag dump f mydump"); @@ -63,7 +69,7 @@ int usage_hitag_reader(void) { PrintAndLogEx(NORMAL, "Hitag reader functions"); PrintAndLogEx(NORMAL, "Usage: lf hitag reader [h] "); PrintAndLogEx(NORMAL, "Options:"); - PrintAndLogEx(NORMAL, " h This help"); + PrintAndLogEx(NORMAL, " h This help"); PrintAndLogEx(NORMAL, " HitagS (0*)"); PrintAndLogEx(NORMAL, " 01 Challenge, read all pages from a Hitag S tag"); PrintAndLogEx(NORMAL, " 02 Set to 0 if no authentication is needed. Read all pages from a Hitag S tag"); @@ -89,7 +95,20 @@ int usage_hitag_writer(void) { PrintAndLogEx(NORMAL, " 24 (set to 0 if no authentication is needed) write page on a Hitag2 tag"); return 0; } - +int usage_hitag_checkchallenges(void) { + PrintAndLogEx(NORMAL, "Check challenges, load a file with save hitag crypto challenges and test them all."); + PrintAndLogEx(NORMAL, "The file should be 8 * 60 bytes long, the file extension defaults to " _YELLOW_("`.cc`") ); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Usage: lf hitag cc [h] f "); + PrintAndLogEx(NORMAL, "Options:"); + PrintAndLogEx(NORMAL, " h This help"); + PrintAndLogEx(NORMAL, " f Load data from BIN file"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Examples:"); + PrintAndLogEx(NORMAL, " lf hitag cc f lf-hitag-challenges"); + return 0; +} + int CmdLFHitagList(const char *Cmd) { CmdTraceList("hitag"); return 0; @@ -242,7 +261,7 @@ int CmdLFHitagSim(const char *Cmd) { uint8_t *data = calloc(4 * 64, sizeof(uint8_t)); size_t datalen = 0; int res = 0; - char filename[FILE_PATH_SIZE]; + char filename[FILE_PATH_SIZE] = { 0x00 }; UsbCommand c = {CMD_SIMULATE_HITAG, {0, 0, 0}}; @@ -282,7 +301,7 @@ int CmdLFHitagSim(const char *Cmd) { break; case 'b': param_getstr(Cmd, cmdp+1, filename, sizeof(filename)); - res = loadFile(filename, "bin", data, &datalen); + res = loadFile(filename, "bin", data, maxdatalen, &datalen); if ( res > 0 ) { errors = true; break; @@ -388,33 +407,42 @@ int CmdLFHitagReader(const char *Cmd) { } int CmdLFHitagCheckChallenges(const char *Cmd) { + UsbCommand c = { CMD_TEST_HITAGS_TRACES, {0, 0, 0}}; char filename[FILE_PATH_SIZE] = { 0x00 }; - FILE *f; - bool file_given; - int len = strlen(Cmd); - if (len > FILE_PATH_SIZE) - len = FILE_PATH_SIZE; - memcpy(filename, Cmd, len); - - if (strlen(filename) > 0) { - f = fopen(filename, "rb+"); - if (!f) { - PrintAndLogEx(WARNING, "Error: Could not open file [%s]", filename); - return 1; + size_t datalen = 0; + int res = 0; + bool file_given = false; + bool errors = false; + uint8_t cmdp = 0; + uint8_t *data = calloc(8 * 60, sizeof(uint8_t)); + + while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { + switch (tolower(param_getchar(Cmd, cmdp))) { + case 'h': + return usage_hitag_checkchallenges(); + case 'f': + param_getstr(Cmd, cmdp+1, filename, sizeof(filename)); + res = loadFile(filename, "cc", data, 8 * 60, &datalen); + if ( res > 0 ) { + errors = true; + break; + } + + memcpy(c.d.asBytes, data, datalen); + file_given = true; + cmdp += 2; + break; + default: + PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); + errors = true; + break; } - file_given = true; - size_t bytes_read = fread(c.d.asBytes, 1, 8 * 60, f); - if (bytes_read == 8 * 60) { - PrintAndLogEx(WARNING, "Error: File reading error"); - fclose(f); - return 1; - } - fclose(f); - } else { - file_given = false; } - + + //Validations + if (errors) return usage_hitag_checkchallenges(); + //file with all the challenges to try c.arg[0] = (uint32_t)file_given; clearCommandBuffer(); @@ -468,13 +496,13 @@ int CmdLFHitagDump(const char *cmd) { } static command_t CommandTable[] = { - {"help", CmdHelp, 1, "This help"}, - {"list", CmdLFHitagList, 1, " List Hitag trace history"}, - {"reader", CmdLFHitagReader, 1, "Act like a Hitag Reader"}, - {"sim", CmdLFHitagSim, 1, "Simulate Hitag transponder"}, - {"sniff", CmdLFHitagSniff, 1, "Eavesdrop Hitag communication"}, - {"writer", CmdLFHitagWriter, 1, "Act like a Hitag Writer" }, - {"check_challenges", CmdLFHitagCheckChallenges, 1, " test all challenges" }, + {"help", CmdHelp, 1, "This help"}, + {"list", CmdLFHitagList, 0, "List Hitag trace history"}, + {"reader", CmdLFHitagReader, 1, "Act like a Hitag Reader"}, + {"sim", CmdLFHitagSim, 1, "Simulate Hitag transponder"}, + {"sniff", CmdLFHitagSniff, 1, "Eavesdrop Hitag communication"}, + {"writer", CmdLFHitagWriter, 1, "Act like a Hitag Writer" }, + {"cc", CmdLFHitagCheckChallenges, 1, "Test all challenges" }, { NULL, NULL, 0, NULL } }; diff --git a/client/loclass/fileutils.c b/client/loclass/fileutils.c index 8bbfb424e..f9ef1244e 100644 --- a/client/loclass/fileutils.c +++ b/client/loclass/fileutils.c @@ -269,7 +269,7 @@ out: return retval; } -int loadFile(const char *preferredName, const char *suffix, void *data, size_t *datalen) { +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; @@ -313,6 +313,11 @@ int loadFile(const char *preferredName, const char *suffix, void *data, size_t * retval = 3; goto out; } + + if ( bytes_read != maxdatalen ) { + PrintAndLogDevice(WARNING, "Warning, bytes read exeed calling array limit. Max bytes is %d bytes", maxdatalen); + bytes_read = maxdatalen; + } memcpy((data), dump, bytes_read); free(dump); diff --git a/client/loclass/fileutils.h b/client/loclass/fileutils.h index f77dfd040..de5bbdfbd 100644 --- a/client/loclass/fileutils.h +++ b/client/loclass/fileutils.h @@ -112,10 +112,11 @@ extern int saveFileJSON(const char *preferredName, const char *suffix, JSONFileT * @param preferredName * @param suffix the file suffix. Leave out 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 * @return 0 for ok, 1 for failz */ -extern int loadFile(const char *preferredName, const char *suffix, void *data, size_t *datalen); +extern int loadFile(const char *preferredName, const char *suffix, void *data, size_t maxdatalen, size_t *datalen); /** * @brief Utility function to load data from a textfile (EML). This method takes a preferred name.