diff --git a/client/aidsearch.c b/client/aidsearch.c index 54b970187..a25a25547 100644 --- a/client/aidsearch.c +++ b/client/aidsearch.c @@ -16,7 +16,7 @@ #include "pm3_cmd.h" -int openAIDFile(json_t **root) { +int openAIDFile(json_t **root, bool verbose) { json_error_t error; char *path; @@ -39,7 +39,7 @@ int openAIDFile(json_t **root) { goto out; } - PrintAndLogEx(SUCCESS, "Loaded file (%s) OK. %d records.", path, json_array_size(*root)); + if (verbose) PrintAndLogEx(SUCCESS, "Loaded file (%s) OK. %d records.", path, json_array_size(*root)); out: free(path); return retval; @@ -51,9 +51,9 @@ int closeAIDFile(json_t *root) { return PM3_SUCCESS; } -json_t *AIDSearchInit() { +json_t *AIDSearchInit(bool verbose) { json_t *root = NULL; - int res = openAIDFile(&root); + int res = openAIDFile(&root, verbose); if (res != PM3_SUCCESS) return NULL; @@ -115,10 +115,12 @@ bool AIDGetFromElm(json_t *data, uint8_t *aid, size_t aidmaxlen, int *aidlen) { return true; } -int PrintAIDDescription(char *aid, bool verbose) { +int PrintAIDDescription(json_t *xroot, char *aid, bool verbose) { int retval = PM3_SUCCESS; - json_t *root = AIDSearchInit(); + json_t *root = xroot; + if (root == NULL) + root = AIDSearchInit(verbose); if (root == NULL) goto out; @@ -167,11 +169,12 @@ int PrintAIDDescription(char *aid, bool verbose) { } out: - AIDSearchFree(root); + if (xroot == NULL) + AIDSearchFree(root); return retval; } -int PrintAIDDescriptionBuf(uint8_t *aid, size_t aidlen, bool verbose) { - return PrintAIDDescription(sprint_hex_inrow(aid, aidlen), verbose); +int PrintAIDDescriptionBuf(json_t *root, uint8_t *aid, size_t aidlen, bool verbose) { + return PrintAIDDescription(root, sprint_hex_inrow(aid, aidlen), verbose); } diff --git a/client/aidsearch.h b/client/aidsearch.h index 4e6eaf8f9..88b79b8bc 100644 --- a/client/aidsearch.h +++ b/client/aidsearch.h @@ -18,9 +18,9 @@ #include -int PrintAIDDescription(char *aid, bool verbose); -int PrintAIDDescriptionBuf(uint8_t *aid, size_t aidlen, bool verbose); -json_t *AIDSearchInit(); +int PrintAIDDescription(json_t *root, char *aid, bool verbose); +int PrintAIDDescriptionBuf(json_t *root, uint8_t *aid, size_t aidlen, bool verbose); +json_t *AIDSearchInit(bool verbose); json_t *AIDSearchGetElm(json_t *root, int elmindx); bool AIDGetFromElm(json_t *data, uint8_t *aid, size_t aidmaxlen, int *aidlen); int AIDSearchFree(); diff --git a/client/cmdhf14a.c b/client/cmdhf14a.c index 2d2b90178..78e1c82f2 100644 --- a/client/cmdhf14a.c +++ b/client/cmdhf14a.c @@ -227,13 +227,6 @@ static int usage_hf_14a_reader(void) { PrintAndLogEx(NORMAL, " 3 ISO14443-3 select only (skip RATS)"); return 0; } -static int usage_hf_14a_info(void) { - PrintAndLogEx(NORMAL, "This command makes more extensive tests against a ISO14443a tag in order to collect information"); - PrintAndLogEx(NORMAL, "Usage: hf 14a info [h|s]"); - PrintAndLogEx(NORMAL, " s silent (no messages)"); - PrintAndLogEx(NORMAL, " n test for nack bug"); - return 0; -} static int CmdHF14AList(const char *Cmd) { (void)Cmd; // Cmd is not used so far @@ -368,12 +361,30 @@ static int CmdHF14AReader(const char *Cmd) { } static int CmdHF14AInfo(const char *Cmd) { + bool verbose = false; + bool do_nack_test = false; + bool do_aid_search = false; - if (Cmd[0] == 'h' || Cmd[0] == 'H') return usage_hf_14a_info(); + CLIParserInit("hf 14a info", + "This command makes more extensive tests against a ISO14443a tag in order to collect information", + "Sample:\n\thf 14a info -nsv - shows full information about the card\n"); - bool verbose = !(Cmd[0] == 's' || Cmd[0] == 'S'); - bool do_nack_test = (Cmd[0] == 'n' || Cmd[0] == 'N'); - infoHF14A(verbose, do_nack_test, true); + void *argtable[] = { + arg_param_begin, + arg_lit0("vV", "verbose", "adds some information to results"), + arg_lit0("nN", "naktest", "test for nack bug"), + arg_lit0("sS", "aidsearch", "checks if AIDs from aidlist.json is present on the card and prints information about found AIDs"), + arg_param_end + }; + CLIExecWithReturn(Cmd, argtable, true); + + verbose = arg_get_lit(1); + do_nack_test = arg_get_lit(2); + do_aid_search = arg_get_lit(3); + + CLIParserFree(); + + infoHF14A(verbose, do_nack_test, do_aid_search); return 0; } @@ -1497,7 +1508,7 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { if (do_aid_search) { int elmindx = 0; - json_t *root = AIDSearchInit(); + json_t *root = AIDSearchInit(verbose); if (root != NULL) { bool ActivateField = true; for (elmindx = 0; elmindx < json_array_size(root); elmindx++) { @@ -1516,14 +1527,14 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { continue; if (sw == 0x9000) { - PrintAndLogEx(NORMAL, "------------- Application OK -----------"); + if (verbose) PrintAndLogEx(NORMAL, "------------- Application OK -----------"); PrintAndLogEx(NORMAL, "res: %s", sprint_hex(result, resultlen)); - PrintAIDDescriptionBuf(vaid, vaidlen, true); + PrintAIDDescriptionBuf(root, vaid, vaidlen, verbose); } if (sw == 0x6283 || sw == 0x6285) { - PrintAndLogEx(NORMAL, "----------- Application blocked --------"); - PrintAIDDescriptionBuf(vaid, vaidlen, true); + if (verbose) PrintAndLogEx(NORMAL, "----------- Application blocked --------"); + PrintAIDDescriptionBuf(root, vaid, vaidlen, verbose); } }