From d197d5df347478e71f59d6bfe0b3f48e7b64402d Mon Sep 17 00:00:00 2001 From: Ave Date: Mon, 14 Dec 2020 18:24:24 +0300 Subject: [PATCH] emrtd: Complete non-BAC support --- client/src/cmdhfemrtd.c | 39 +++++++++++++++++++++++++-------------- client/src/cmdhfemrtd.h | 2 +- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/client/src/cmdhfemrtd.c b/client/src/cmdhfemrtd.c index 957620b86..a1e5406af 100644 --- a/client/src/cmdhfemrtd.c +++ b/client/src/cmdhfemrtd.c @@ -720,7 +720,7 @@ static void rng(int length, uint8_t *dataout) { } } -int dumpHF_EMRTD(char *documentnumber, char *dob, char *expiry) { +int dumpHF_EMRTD(char *documentnumber, char *dob, char *expiry, bool BAC_available) { uint8_t response[35000] = { 0x00 }; uint8_t ssc[8] = { 0x00 }; uint8_t ks_enc[16] = { 0x00 }; @@ -790,6 +790,13 @@ int dumpHF_EMRTD(char *documentnumber, char *dob, char *expiry) { } } + if (BAC == true && BAC_available == false) { + PrintAndLogEx(ERR, "This eMRTD enforces Basic Access Control, but you didn't supplied MRZ data. Cannot proceed."); + PrintAndLogEx(HINT, "Check out hf emrtd dump --help, supply data with -n -d and -e."); + DropField(); + return PM3_ESOFT; + } + if (BAC) { uint8_t rnd_ic[8] = { 0x00 }; uint8_t kenc[50] = { 0x00 }; @@ -939,25 +946,29 @@ static int cmd_hf_emrtd_dump(const char *Cmd) { void *argtable[] = { arg_param_begin, - arg_str1("n", "documentnumber", "", "9 character document number"), - arg_str1("d", "dateofbirth", "", "date of birth in YYMMDD format"), - arg_str1("e", "expiry", "", "expiry in YYMMDD format"), + arg_str0("n", "documentnumber", "", "9 character document number"), + arg_str0("d", "dateofbirth", "", "date of birth in YYMMDD format"), + arg_str0("e", "expiry", "", "expiry in YYMMDD format"), arg_param_end }; CLIExecWithReturn(ctx, Cmd, argtable, true); - uint8_t docnum[10]; - uint8_t dob[7]; - uint8_t expiry[7]; - int docnumlen = 9; - int doblen = 6; - int expirylen = 6; - CLIGetStrWithReturn(ctx, 1, docnum, &docnumlen); - CLIGetStrWithReturn(ctx, 2, dob, &doblen); - CLIGetStrWithReturn(ctx, 3, expiry, &expirylen); + uint8_t docnum[10] = { 0x00 }; + uint8_t dob[7] = { 0x00 }; + uint8_t expiry[7] = { 0x00 }; + bool BAC = true; + int slen = 0; // unused + // Go through all args, if even one isn't supplied, mark BAC as unavailable + if (CLIParamStrToBuf(arg_get_str(ctx, 1), docnum, 9, &slen) != 0 || slen == 0) { + BAC = false; + } else if (CLIParamStrToBuf(arg_get_str(ctx, 2), dob, 6, &slen) != 0 || slen == 0) { + BAC = false; + } else if (CLIParamStrToBuf(arg_get_str(ctx, 3), expiry, 6, &slen) != 0 || slen == 0) { + BAC = false; + } CLIParserFree(ctx); - return dumpHF_EMRTD((char *)docnum, (char *)dob, (char *)expiry); + return dumpHF_EMRTD((char *)docnum, (char *)dob, (char *)expiry, BAC); } static int cmd_hf_emrtd_list(const char *Cmd) { diff --git a/client/src/cmdhfemrtd.h b/client/src/cmdhfemrtd.h index 5899ad27a..84500fc8b 100644 --- a/client/src/cmdhfemrtd.h +++ b/client/src/cmdhfemrtd.h @@ -15,5 +15,5 @@ int CmdHFeMRTD(const char *Cmd); -int dumpHF_EMRTD(char *documentnumber, char *dob, char *expiry); +int dumpHF_EMRTD(char *documentnumber, char *dob, char *expiry, bool BAC_available); #endif