diff --git a/client/resources/mad.json b/client/resources/mad.json index 535407ab4..d5c413d73 100644 --- a/client/resources/mad.json +++ b/client/resources/mad.json @@ -4066,6 +4066,13 @@ "service_provider": "PAYCULT", "system_integrator": "PAYCULT" }, + { + "application": "Access Control (SIO)", + "company": "HID Global", + "mad": "0x3D01", + "service_provider": "HID Corporation", + "system_integrator": "HID Corporation" + }, { "application": "City transport bus, ferry, administration", "company": "VFJ Technology Pty Ltd", diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index cd6017c8a..d884e7184 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -1696,7 +1696,7 @@ static int CmdHFiClassRestore(const char *Cmd) { CLIParserInit(&ctx, "hf iclass restore", "Restore data from dumpfile onto a iCLASS tag", "hf iclass restore -f hf-iclass-AA162D30F8FF12F1-dump.bin --first 6 --last 18 --ki 0\n" - "hf iclass restore -f hf-iclass-AA162D30F8FF12F1-dump.bin --first 6 --last 18 --ki 0 --elite" + "hf iclass restore -f hf-iclass-AA162D30F8FF12F1-dump.bin --first 6 --last 18 --ki 0 --elite\n" "hf iclass restore -f hf-iclass-AA162D30F8FF12F1-dump.bin --first 6 --last 18 -k 1122334455667788 --elite\n" ); diff --git a/client/src/cmdhfthinfilm.c b/client/src/cmdhfthinfilm.c index 34001be44..9f7f21912 100644 --- a/client/src/cmdhfthinfilm.c +++ b/client/src/cmdhfthinfilm.c @@ -12,7 +12,7 @@ #include #include #include - +#include "cliparser.h" #include "cmdparser.h" // command_t #include "comms.h" #include "cmdtrace.h" @@ -22,28 +22,6 @@ static int CmdHelp(const char *Cmd); -static int usage_thinfilm_info(void) { - PrintAndLogEx(NORMAL, "Usage: hf thinfilm info [h]"); - PrintAndLogEx(NORMAL, "Options:"); - PrintAndLogEx(NORMAL, " h this help"); - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf thinfilm info"); - return PM3_SUCCESS; -} - -static int usage_thinfilm_sim(void) { - PrintAndLogEx(NORMAL, "Usage: hf thinfilm sim [h] [d ]"); - PrintAndLogEx(NORMAL, "Options:"); - PrintAndLogEx(NORMAL, " h this help"); - PrintAndLogEx(NORMAL, " d bytes to send, in hex"); - PrintAndLogEx(NORMAL, " r raw, provided bytes should include CRC"); - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf thinfilm sim d B70470726f786d61726b2e636f6d"); - return PM3_SUCCESS; -} - // Printing function based upon the code in libnfc // ref // https://github.com/nfc-tools/libnfc/blob/master/utils/nfc-barcode.c @@ -119,25 +97,16 @@ static int print_barcode(uint8_t *barcode, const size_t barcode_len, bool verbos } static int CmdHfThinFilmInfo(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf thinfilm info", + "Get info from Thinfilm tags", + "hf thinfilm info"); - uint8_t cmdp = 0; - bool errors = false; - while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { - switch (tolower(param_getchar(Cmd, cmdp))) { - case 'h': - return usage_thinfilm_info(); - default: - PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); - errors = true; - break; - } - } - - //Validations - if (errors) { - usage_thinfilm_info(); - return PM3_EINVARG; - } + void *argtable[] = { + arg_param_begin, + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); return infoThinFilm(true); } @@ -168,45 +137,40 @@ int infoThinFilm(bool verbose) { } static int CmdHfThinFilmSim(const char *Cmd) { - uint8_t cmdp = 0; - uint8_t data[512]; - int datalen = 0; + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf thinfilm sim", + "Simulate Thinfilm tag", + "hf thinfilm sim -d B70470726f786d61726b2e636f6d"); + + void *argtable[] = { + arg_param_begin, + arg_str1("d", "data", "", "bytes to send"), + arg_lit0(NULL, "raw", "raw, provided bytes should include CRC"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, false); + + int data_len = 0; + uint8_t data[512] = {0}; + CLIGetHexWithReturn(ctx, 1, data, &data_len); bool addcrc = true; - bool errors = false; - while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { - switch (tolower(param_getchar(Cmd, cmdp))) { - case 'h': - return usage_thinfilm_sim(); - case 'd': - // Retrieve the data - param_gethex_ex(Cmd, cmdp + 1, data, &datalen); - datalen >>= 1; - cmdp += 2; - break; - case 'r': - addcrc = false; - cmdp++; - break; - default: - PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); - errors = true; - break; - } + if (arg_get_lit(ctx, 2)) { + addcrc = false; } - //Validations - if (errors || cmdp == 0 || datalen == 0 || datalen > 512) return usage_thinfilm_sim(); - if (addcrc && datalen <= 510) { + CLIParserFree(ctx); + + if (addcrc && data_len <= 510) { uint8_t b1, b2; - compute_crc(CRC_14443_A, data, datalen, &b1, &b2); - data[datalen++] = b2; - data[datalen++] = b1; + compute_crc(CRC_14443_A, data, data_len, &b1, &b2); + data[data_len++] = b2; + data[data_len++] = b1; } clearCommandBuffer(); - SendCommandNG(CMD_HF_THINFILM_SIMULATE, (uint8_t *)&data, datalen); + SendCommandNG(CMD_HF_THINFILM_SIMULATE, (uint8_t *)&data, data_len); PacketResponseNG resp; PrintAndLogEx(SUCCESS, "press pm3-button to abort simulation"); diff --git a/client/src/cmdhftopaz.c b/client/src/cmdhftopaz.c index a64071c97..ba150cb71 100644 --- a/client/src/cmdhftopaz.c +++ b/client/src/cmdhftopaz.c @@ -14,6 +14,7 @@ #include #include #include +#include "cliparser.h" #include "cmdparser.h" // command_t #include "comms.h" #include "cmdtrace.h" @@ -393,21 +394,42 @@ static int topaz_print_NDEF(uint8_t *data, size_t maxsize) { } static int CmdHFTopazReader(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf topaz reader", + "Read UID from Topaz tags", + "hf topaz reader"); - bool verbose = true; - char ctmp = tolower(param_getchar(Cmd, 0)); - if (ctmp == 's') verbose = false; + void *argtable[] = { + arg_param_begin, + arg_lit0("v", "verbose", "verbose output"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + + bool verbose = arg_get_lit(ctx, 1); + + CLIParserFree(ctx); return readTopazUid(verbose); } // read a Topaz tag and print some useful information static int CmdHFTopazInfo(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf topaz info", + "Get info from Topaz tags", + "hf topaz info"); - bool verbose = true; - char ctmp = tolower(param_getchar(Cmd, 0)); - if (ctmp == 's') verbose = false; + void *argtable[] = { + arg_param_begin, + arg_lit0("v", "verbose", "verbose output"), + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + bool verbose = arg_get_lit(ctx, 1); + + CLIParserFree(ctx); int status = readTopazUid(verbose); if (status != PM3_SUCCESS) @@ -469,13 +491,34 @@ static int CmdHFTopazInfo(const char *Cmd) { } static int CmdHFTopazSim(const char *Cmd) { - (void)Cmd; // Cmd is not used so far + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf topaz sim", + "Simulate a Topaz tag", + "hf topaz sim <- Not yet implemented"); + + void *argtable[] = { + arg_param_begin, + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIParserFree(ctx); PrintAndLogEx(INFO, "not yet implemented"); return PM3_SUCCESS; } static int CmdHFTopazCmdRaw(const char *Cmd) { - (void)Cmd; // Cmd is not used so far + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf topaz raw", + "Send raw hex data to Topaz tags", + "hf topaz raw <- Not yet implemented"); + + void *argtable[] = { + arg_param_begin, + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIParserFree(ctx); + PrintAndLogEx(INFO, "not yet implemented. Use hf 14 raw with option -T."); return PM3_SUCCESS; } @@ -490,6 +533,25 @@ static int CmdHFTopazList(const char *Cmd) { return CmdTraceList(args); } +static int CmdHFTopazSniff(const char *Cmd) { + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf topaz sniff", + "Sniff Topaz reader-tag communication", + "hf topaz sniff"); + + void *argtable[] = { + arg_param_begin, + arg_param_end + }; + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIParserFree(ctx); + + uint8_t param = 0; + SendCommandNG(CMD_HF_ISO14443A_SNIFF, (uint8_t *)¶m, sizeof(uint8_t)); + + return PM3_SUCCESS; +} + static int CmdHelp(const char *Cmd); static command_t CommandTable[] = { @@ -498,7 +560,7 @@ static command_t CommandTable[] = { {"info", CmdHFTopazInfo, IfPm3Iso14443a, "Tag information"}, {"reader", CmdHFTopazReader, IfPm3Iso14443a, "Act like a Topaz reader"}, {"sim", CmdHFTopazSim, IfPm3Iso14443a, " -- Simulate Topaz tag"}, - {"sniff", CmdHF14ASniff, IfPm3Iso14443a, "Sniff Topaz reader-tag communication"}, + {"sniff", CmdHFTopazSniff, IfPm3Iso14443a, "Sniff Topaz reader-tag communication"}, {"raw", CmdHFTopazCmdRaw, IfPm3Iso14443a, "Send raw hex data to tag"}, {NULL, NULL, 0, NULL} }; diff --git a/doc/cliparser_todo.txt b/doc/cliparser_todo.txt index 4e1dc76cd..b2571f493 100644 --- a/doc/cliparser_todo.txt +++ b/doc/cliparser_todo.txt @@ -141,13 +141,6 @@ hf mfu otptear hf mfdes enum hf mfdes getuid hf mfdes info -hf thinfilm info -hf thinfilm sim -hf topaz info -hf topaz reader -hf topaz sim -hf topaz sniff -hf topaz raw hw connect hw dbg hw detectreader @@ -174,11 +167,14 @@ lf simfsk lf simpsk lf simbidir lf sniff +lf tune lf em 410x lf em 4x05 lf em 4x50 +lf hitag info lf hitag reader lf hitag sim +lf hitag sniff lf hitag writer lf hitag dump lf hitag cc