From b956d4c148e3c07014375ab36429b1c48d205fa2 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Thu, 31 Dec 2020 11:39:57 +0100 Subject: [PATCH] hf 14a config cliparser: use string values --- armsrc/iso14443a.c | 45 ++++++------- client/src/cmdhf14a.c | 146 ++++++++++++++++++++++++++++-------------- 2 files changed, 117 insertions(+), 74 deletions(-) diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 4776e555a..759e5e646 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -133,35 +133,30 @@ static hf14a_config hf14aconfig = { 0, 0, 0, 0, 0 } ; void printHf14aConfig(void) { DbpString(_CYAN_("HF 14a config")); - Dbprintf(" [a] Anticol override....%i %s%s%s", - hf14aconfig.forceanticol, - (hf14aconfig.forceanticol == 0) ? "( " _GREEN_("No") " ) follow standard " : "", - (hf14aconfig.forceanticol == 1) ? "( " _RED_("Yes") " ) always do anticol" : "", - (hf14aconfig.forceanticol == 2) ? "( " _RED_("Yes") " ) always skip anticol" : "" + Dbprintf(" [a] Anticol override....%s%s%s", + (hf14aconfig.forceanticol == 0) ? _GREEN_("std") " : follow standard " : "", + (hf14aconfig.forceanticol == 1) ? _RED_("force") " : always do anticol" : "", + (hf14aconfig.forceanticol == 2) ? _RED_("skip") " : always skip anticol" : "" ); - Dbprintf(" [b] BCC override........%i %s%s%s", - hf14aconfig.forcebcc, - (hf14aconfig.forcebcc == 0) ? "( " _GREEN_("No") " ) follow standard" : "", - (hf14aconfig.forcebcc == 1) ? "( " _RED_("Yes") " ) force fix of bad BCC" : "", - (hf14aconfig.forcebcc == 2) ? "( " _RED_("Yes") " ) always use card BCC" : "" + Dbprintf(" [b] BCC override........%s%s%s", + (hf14aconfig.forcebcc == 0) ? _GREEN_("std") " : follow standard" : "", + (hf14aconfig.forcebcc == 1) ? _RED_("fix") " : fix bad BCC" : "", + (hf14aconfig.forcebcc == 2) ? _RED_("ignore") " : ignore bad BCC, always use card BCC" : "" ); - Dbprintf(" [2] CL2 override........%i %s%s%s", - hf14aconfig.forcecl2, - (hf14aconfig.forcecl2 == 0) ? "( " _GREEN_("No") " ) follow standard" : "", - (hf14aconfig.forcecl2 == 1) ? "( " _RED_("Yes") " ) always do CL2" : "", - (hf14aconfig.forcecl2 == 2) ? "( " _RED_("Yes") " ) always skip CL2" : "" + Dbprintf(" [2] CL2 override........%s%s%s", + (hf14aconfig.forcecl2 == 0) ? _GREEN_("std") " : follow standard" : "", + (hf14aconfig.forcecl2 == 1) ? _RED_("force") " : always do CL2" : "", + (hf14aconfig.forcecl2 == 2) ? _RED_("skip") " : always skip CL2" : "" ); - Dbprintf(" [3] CL3 override........%i %s%s%s", - hf14aconfig.forcecl3, - (hf14aconfig.forcecl3 == 0) ? "( " _GREEN_("No") " ) follow standard" : "", - (hf14aconfig.forcecl3 == 1) ? "( " _RED_("Yes") " ) always do CL3" : "", - (hf14aconfig.forcecl3 == 2) ? "( " _RED_("Yes") " ) always skip CL3" : "" + Dbprintf(" [3] CL3 override........%s%s%s", + (hf14aconfig.forcecl3 == 0) ? _GREEN_("std") " : follow standard" : "", + (hf14aconfig.forcecl3 == 1) ? _RED_("force") " : always do CL3" : "", + (hf14aconfig.forcecl3 == 2) ? _RED_("skip") " : always skip CL3" : "" ); - Dbprintf(" [r] RATS override.......%i %s%s%s", - hf14aconfig.forcerats, - (hf14aconfig.forcerats == 0) ? "( " _GREEN_("No") " ) follow standard " : "", - (hf14aconfig.forcerats == 1) ? "( " _RED_("Yes") " ) always do RATS" : "", - (hf14aconfig.forcerats == 2) ? "( " _RED_("Yes") " ) always skip RATS" : "" + Dbprintf(" [r] RATS override.......%s%s%s", + (hf14aconfig.forcerats == 0) ? _GREEN_("std") " : follow standard " : "", + (hf14aconfig.forcerats == 1) ? _RED_("force") " : always do RATS" : "", + (hf14aconfig.forcerats == 2) ? _RED_("skip") " : always skip RATS" : "" ); } diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 02b3a817e..373e81d49 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -217,25 +217,25 @@ int hf14a_setconfig(hf14a_config *config, bool verbose) { static int hf_14a_config_example(void) { PrintAndLogEx(NORMAL, "\nExamples to revive Gen2/DirectWrite magic cards failing at anticollision:"); PrintAndLogEx(NORMAL, _CYAN_(" MFC 1k 4b UID")":"); - PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa 1 --bcc 2 --cl2 2 --rats 2")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa force --bcc ignore --cl2 skip --rats skip")); PrintAndLogEx(NORMAL, _YELLOW_(" hf mf wrbl 0 A FFFFFFFFFFFF 11223344440804006263646566676869")); - PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa 0 --bcc 0 --cl2 0 --rats 0")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --std")); PrintAndLogEx(NORMAL, _CYAN_(" MFC 4k 4b UID")":"); - PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa 1 --bcc 2 --cl2 2 --rats 2")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa force --bcc ignore --cl2 skip --rats skip")); PrintAndLogEx(NORMAL, _YELLOW_(" hf mf wrbl 0 A FFFFFFFFFFFF 11223344441802006263646566676869")); - PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa 0 --bcc 0 --cl2 0 --rats 0")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --std")); PrintAndLogEx(NORMAL, _CYAN_(" MFC 1k 7b UID")":"); - PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa 1 --bcc 2 --cl2 1 --cl3 2 --rats 2")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa force --bcc ignore --cl2 force --cl3 skip --rats skip")); PrintAndLogEx(NORMAL, _YELLOW_(" hf mf wrbl 0 A FFFFFFFFFFFF 04112233445566084400626364656667")); - PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa 0 --bcc 0 --cl2 0 --rats 0")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --std")); PrintAndLogEx(NORMAL, _CYAN_(" MFC 4k 7b UID")":"); - PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa 1 --bcc 2 --cl2 1 --cl3 2 --rats 2")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa forcce --bcc ignore --cl2 force --cl3 skip --rats skip")); PrintAndLogEx(NORMAL, _YELLOW_(" hf mf wrbl 0 A FFFFFFFFFFFF 04112233445566184200626364656667")); - PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa 0 --bcc 0 --cl2 0 --rats 0")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --std")); PrintAndLogEx(NORMAL, _CYAN_(" MFUL ")"/" _CYAN_(" MFUL EV1 ")"/" _CYAN_(" MFULC")":"); - PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa 1 --bcc 2 --cl2 1 --cl3 2 r 2")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa force --bcc ignore --cl2 force --cl3 skip -rats skip")); PrintAndLogEx(NORMAL, _YELLOW_(" hf mfu setuid 04112233445566")); - PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --atqa 0 --bcc 0 --cl2 0 --rats 0")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14a config --std")); return PM3_SUCCESS; } static int CmdHf14AConfig(const char *Cmd) { @@ -244,44 +244,101 @@ static int CmdHf14AConfig(const char *Cmd) { CLIParserContext *ctx; CLIParserInit(&ctx, "hf 14a config", "Configure 14a settings (use with caution)", - "hf 14a config -> Print current configuration\n" - "hf 14a config --atqa 0 -> Follow standard\n" - "hf 14a config --atqa 1 -> Force execution of anticollision\n" - "hf 14a config --atqa 2 -> Skip anticollision\n" - "hf 14a config --bcc 0 -> Follow standard\n" - "hf 14a config --bcc 1 -> Force fix of bad BCC in anticollision\n" - "hf 14a config --bcc 2 -> Use card BCC\n" - "hf 14a config --cl2 0 -> Follow standard\n" - "hf 14a config --cl2 1 -> Execute CL2\n" - "hf 14a config --cl2 2 -> Skip CL2\n" - "hf 14a config --cl3 0 -> Follow standard\n" - "hf 14a config --cl3 1 -> Execute CL3\n" - "hf 14a config --cl3 2 -> Skip CL3\n" - "hf 14a config --rats 0 -> Follow standard\n" - "hf 14a config --rats 1 -> Execute RATS\n" - "hf 14a config --rats 2 -> Skip RATS"); + "hf 14a config -> Print current configuration\n" + "hf 14a config --std -> Reset default configuration (follow standard)\n" + "hf 14a config --atqa std -> Follow standard\n" + "hf 14a config --atqa force -> Force execution of anticollision\n" + "hf 14a config --atqa skip -> Skip anticollision\n" + "hf 14a config --bcc std -> Follow standard\n" + "hf 14a config --bcc fix -> Fix bad BCC in anticollision\n" + "hf 14a config --bcc ignore -> Ignore bad BCC and use it as such\n" + "hf 14a config --cl2 std -> Follow standard\n" + "hf 14a config --cl2 force -> Execute CL2\n" + "hf 14a config --cl2 skip -> Skip CL2\n" + "hf 14a config --cl3 std -> Follow standard\n" + "hf 14a config --cl3 force -> Execute CL3\n" + "hf 14a config --cl3 skip -> Skip CL3\n" + "hf 14a config --rats std -> Follow standard\n" + "hf 14a config --rats force -> Execute RATS\n" + "hf 14a config --rats skip -> Skip RATS"); void *argtable[] = { arg_param_begin, - arg_int0(NULL, "atqa", "", "Configure ATQA<>anticollision behavior"), - arg_int0(NULL, "bcc", "", "Configure BCC behavior"), - arg_int0(NULL, "cl2", "", "Configure SAK<>CL2 behavior"), - arg_int0(NULL, "cl3", "", "Configure SAK<>CL3 behavior"), - arg_int0(NULL, "rats", "", "Configure RATS behavior"), + arg_str0(NULL, "atqa", "", "Configure ATQA<>anticollision behavior"), + arg_str0(NULL, "bcc", "", "Configure BCC behavior"), + arg_str0(NULL, "cl2", "", "Configure SAK<>CL2 behavior"), + arg_str0(NULL, "cl3", "", "Configure SAK<>CL3 behavior"), + arg_str0(NULL, "rats", "", "Configure RATS behavior"), + arg_lit0(NULL, "std", "Reset default configuration: follow all standard"), arg_lit0("v", "verbose", "verbose output, also prints examples for reviving Gen2 cards"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); + bool defaults = arg_get_lit(ctx, 6); + int vlen = 0; + char value[10]; + int atqa = defaults ? 0 : -1; + CLIParamStrToBuf(arg_get_str(ctx, 1), (uint8_t *)value, sizeof(value), &vlen); + if (vlen > 0) { + if (strcmp(value, "std") == 0) atqa = 0; + else if (strcmp(value, "force") == 0) atqa = 1; + else if (strcmp(value, "skip") == 0) atqa = 2; + else { + PrintAndLogEx(ERR, "atqa argument must be 'std', 'force', or 'skip'"); + CLIParserFree(ctx); + return PM3_EINVARG; + } + } + int bcc = defaults ? 0 : -1; + CLIParamStrToBuf(arg_get_str(ctx, 2), (uint8_t *)value, sizeof(value), &vlen); + if (vlen > 0) { + if (strcmp(value, "std") == 0) bcc = 0; + else if (strcmp(value, "fix") == 0) bcc = 1; + else if (strcmp(value, "ignore") == 0) bcc = 2; + else { + PrintAndLogEx(ERR, "bcc argument must be 'std', 'fix', or 'ignore'"); + CLIParserFree(ctx); + return PM3_EINVARG; + } + } + int cl2 = defaults ? 0 : -1; + CLIParamStrToBuf(arg_get_str(ctx, 3), (uint8_t *)value, sizeof(value), &vlen); + if (vlen > 0) { + if (strcmp(value, "std") == 0) cl2 = 0; + else if (strcmp(value, "force") == 0) cl2 = 1; + else if (strcmp(value, "skip") == 0) cl2 = 2; + else { + PrintAndLogEx(ERR, "cl2 argument must be 'std', 'force', or 'skip'"); + CLIParserFree(ctx); + return PM3_EINVARG; + } + } + int cl3 = defaults ? 0 : -1; + CLIParamStrToBuf(arg_get_str(ctx, 4), (uint8_t *)value, sizeof(value), &vlen); + if (vlen > 0) { + if (strcmp(value, "std") == 0) cl3 = 0; + else if (strcmp(value, "force") == 0) cl3 = 1; + else if (strcmp(value, "skip") == 0) cl3 = 2; + else { + PrintAndLogEx(ERR, "cl3 argument must be 'std', 'force', or 'skip'"); + CLIParserFree(ctx); + return PM3_EINVARG; + } + } + int rats = defaults ? 0 : -1; + CLIParamStrToBuf(arg_get_str(ctx, 5), (uint8_t *)value, sizeof(value), &vlen); + if (vlen > 0) { + if (strcmp(value, "std") == 0) rats = 0; + else if (strcmp(value, "force") == 0) rats = 1; + else if (strcmp(value, "skip") == 0) rats = 2; + else { + PrintAndLogEx(ERR, "rats argument must be 'std', 'force', or 'skip'"); + CLIParserFree(ctx); + return PM3_EINVARG; + } + } - int atqa = arg_get_int_def(ctx, 1, -1); - int bcc = arg_get_int_def(ctx, 2, -1); - int cl2 = arg_get_int_def(ctx, 3, -1); - int cl3 = arg_get_int_def(ctx, 4, -1); - int rats = arg_get_int_def(ctx, 5, -1); - - int *config_options[5] = {&atqa, &bcc, &cl2, &cl3, &rats}; - - bool verbose = arg_get_lit(ctx, 6); + bool verbose = arg_get_lit(ctx, 7); CLIParserFree(ctx); @@ -294,15 +351,6 @@ static int CmdHf14AConfig(const char *Cmd) { hf_14a_config_example(); } - for (int i = 0; i < 5; ++i) { - if (*config_options[i] > -1) { - if (*config_options[i] > 2) { - PrintAndLogEx(ERR, "Argument must be 0, 1, or 2"); - return PM3_EINVARG; - } - } - } - hf14a_config config = { .forceanticol = atqa, .forcebcc = bcc,