mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 05:43:48 -07:00
dynamic loading and freeing
This commit is contained in:
parent
855844b13b
commit
358bdb7022
3 changed files with 51 additions and 36 deletions
|
@ -170,13 +170,15 @@ static int CmdHFFidoRegister(const char *cmd) {
|
|||
fnlen = strlen(filename);
|
||||
}
|
||||
|
||||
/*
|
||||
json_t *root = calloc(1, sizeof(json_t));
|
||||
if (root == NULL) {
|
||||
PrintAndLogEx(ERR, "error, cannot allocate memory ");
|
||||
return PM3_EMALLOC;
|
||||
}
|
||||
|
||||
int res = loadFileJSONroot(filename, root, verbose);
|
||||
*/
|
||||
json_t *root = NULL;
|
||||
int res = loadFileJSONroot(filename, (void**)&root, verbose);
|
||||
if (res != PM3_SUCCESS) {
|
||||
CLIParserFree(ctx);
|
||||
return PM3_EINVARG;
|
||||
|
@ -193,6 +195,7 @@ static int CmdHFFidoRegister(const char *cmd) {
|
|||
if (chlen > 16) {
|
||||
PrintAndLogEx(ERR, "ERROR: challenge parameter length in ASCII mode must be less than 16 chars instead of: %d", chlen);
|
||||
CLIParserFree(ctx);
|
||||
json_decref(root);
|
||||
return PM3_EINVARG;
|
||||
}
|
||||
} else {
|
||||
|
@ -201,6 +204,7 @@ static int CmdHFFidoRegister(const char *cmd) {
|
|||
if (chlen && chlen != 32) {
|
||||
PrintAndLogEx(ERR, "ERROR: challenge parameter length must be 32 bytes only.");
|
||||
CLIParserFree(ctx);
|
||||
json_decref(root);
|
||||
return PM3_EINVARG;
|
||||
}
|
||||
}
|
||||
|
@ -215,6 +219,7 @@ static int CmdHFFidoRegister(const char *cmd) {
|
|||
if (applen > 16) {
|
||||
PrintAndLogEx(ERR, "ERROR: application parameter length in ASCII mode must be less than 16 chars instead of: %d", applen);
|
||||
CLIParserFree(ctx);
|
||||
json_decref(root);
|
||||
return PM3_EINVARG;
|
||||
}
|
||||
} else {
|
||||
|
@ -223,6 +228,7 @@ static int CmdHFFidoRegister(const char *cmd) {
|
|||
if (applen && applen != 32) {
|
||||
PrintAndLogEx(ERR, "ERROR: application parameter length must be 32 bytes only.");
|
||||
CLIParserFree(ctx);
|
||||
json_decref(root);
|
||||
return PM3_EINVARG;
|
||||
}
|
||||
}
|
||||
|
@ -246,12 +252,14 @@ static int CmdHFFidoRegister(const char *cmd) {
|
|||
if (res) {
|
||||
PrintAndLogEx(ERR, "Can't select authenticator. res=%x. Exit...", res);
|
||||
DropField();
|
||||
json_decref(root);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (sw != 0x9000) {
|
||||
PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff));
|
||||
DropField();
|
||||
json_decref(root);
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
|
||||
|
@ -259,6 +267,7 @@ static int CmdHFFidoRegister(const char *cmd) {
|
|||
DropField();
|
||||
if (res) {
|
||||
PrintAndLogEx(ERR, "Can't execute register command. res=%x. Exit...", res);
|
||||
json_decref(root);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -281,6 +290,7 @@ static int CmdHFFidoRegister(const char *cmd) {
|
|||
|
||||
if (buf[0] != 0x05) {
|
||||
PrintAndLogEx(ERR, "ERROR: First byte must be 0x05, but it %2x", buf[0]);
|
||||
json_decref(root);
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
PrintAndLogEx(SUCCESS, "User public key: %s", sprint_hex(&buf[1], 65));
|
||||
|
@ -370,10 +380,8 @@ static int CmdHFFidoRegister(const char *cmd) {
|
|||
|
||||
sprintf(filename, "hf-fido2-params");
|
||||
res = saveFileJSONroot(filename, root, JSON_INDENT(2), verbose);
|
||||
|
||||
// free json object
|
||||
json_decref(root);
|
||||
}
|
||||
json_decref(root);
|
||||
return PM3_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -425,7 +433,6 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
int hdatalen = 0;
|
||||
uint8_t keyHandleLen = 0;
|
||||
|
||||
|
||||
int fnlen = 0;
|
||||
char filename[FILE_PATH_SIZE] = {0};
|
||||
CLIParamStrToBuf(arg_get_str(ctx, 7), (uint8_t *)filename, FILE_PATH_SIZE, &fnlen);
|
||||
|
@ -435,14 +442,9 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
strcat(filename, DEF_FIDO_PARAM_FILE);
|
||||
fnlen = strlen(filename);
|
||||
}
|
||||
|
||||
json_t *root = calloc(1, sizeof(json_t));
|
||||
if (root == NULL) {
|
||||
PrintAndLogEx(ERR, "error, cannot allocate memory ");
|
||||
return PM3_EMALLOC;
|
||||
}
|
||||
|
||||
int res = loadFileJSONroot(filename, root, verbose);
|
||||
|
||||
json_t *root = NULL;
|
||||
int res = loadFileJSONroot(filename, (void**)&root, verbose);
|
||||
if (res != PM3_SUCCESS) {
|
||||
CLIParserFree(ctx);
|
||||
return PM3_EINVARG;
|
||||
|
@ -462,6 +464,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
if (hdatalen && hdatalen != 65) {
|
||||
PrintAndLogEx(ERR, "ERROR: public key length must be 65 bytes only.");
|
||||
CLIParserFree(ctx);
|
||||
json_decref(root);
|
||||
return PM3_EINVARG;
|
||||
}
|
||||
|
||||
|
@ -474,6 +477,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
if (hdatalen > 255) {
|
||||
PrintAndLogEx(ERR, "ERROR: application parameter length must be less than 255.");
|
||||
CLIParserFree(ctx);
|
||||
json_decref(root);
|
||||
return PM3_EINVARG;
|
||||
}
|
||||
|
||||
|
@ -490,6 +494,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
if (hdatalen > 16) {
|
||||
PrintAndLogEx(ERR, "ERROR: challenge parameter length in ASCII mode must be less than 16 chars instead of: %d", hdatalen);
|
||||
CLIParserFree(ctx);
|
||||
json_decref(root);
|
||||
return PM3_EINVARG;
|
||||
}
|
||||
} else {
|
||||
|
@ -498,6 +503,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
if (hdatalen && hdatalen != 32) {
|
||||
PrintAndLogEx(ERR, "ERROR: challenge parameter length must be 32 bytes only.");
|
||||
CLIParserFree(ctx);
|
||||
json_decref(root);
|
||||
return PM3_EINVARG;
|
||||
}
|
||||
}
|
||||
|
@ -512,6 +518,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
if (hdatalen > 16) {
|
||||
PrintAndLogEx(ERR, "ERROR: application parameter length in ASCII mode must be less than 16 chars instead of: %d", hdatalen);
|
||||
CLIParserFree(ctx);
|
||||
json_decref(root);
|
||||
return PM3_EINVARG;
|
||||
}
|
||||
} else {
|
||||
|
@ -520,6 +527,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
if (hdatalen && hdatalen != 32) {
|
||||
PrintAndLogEx(ERR, "ERROR: application parameter length must be 32 bytes only.");
|
||||
CLIParserFree(ctx);
|
||||
json_decref(root);
|
||||
return PM3_EINVARG;
|
||||
}
|
||||
}
|
||||
|
@ -531,7 +539,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
|
||||
SetAPDULogging(APDULogging);
|
||||
|
||||
// (in parameter) conrtol byte 0x07 - check only, 0x03 - user presense + cign. 0x08 - sign only
|
||||
// (in parameter) control byte 0x07 - check only, 0x03 - user presence + cign. 0x08 - sign only
|
||||
// challenge parameter [32 bytes]
|
||||
// application parameter [32 bytes]
|
||||
// key handle length [1b] = N
|
||||
|
@ -548,12 +556,14 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
if (res) {
|
||||
PrintAndLogEx(ERR, "Can't select authenticator. res=%x. Exit...", res);
|
||||
DropField();
|
||||
json_decref(root);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (sw != 0x9000) {
|
||||
PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff));
|
||||
DropField();
|
||||
json_decref(root);
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
|
||||
|
@ -561,11 +571,13 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
DropField();
|
||||
if (res) {
|
||||
PrintAndLogEx(ERR, "Can't execute authentication command. res=%x. Exit...", res);
|
||||
json_decref(root);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (sw != 0x9000) {
|
||||
PrintAndLogEx(ERR, "ERROR execute authentication command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff));
|
||||
json_decref(root);
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
|
||||
|
@ -621,9 +633,8 @@ static int CmdHFFidoAuthenticate(const char *cmd) {
|
|||
|
||||
sprintf(filename, "hf-fido2-params");
|
||||
res = saveFileJSONroot(filename, root, JSON_INDENT(2), verbose);
|
||||
// free json object
|
||||
json_decref(root);
|
||||
}
|
||||
json_decref(root);
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
|
||||
|
@ -664,12 +675,8 @@ static int CmdHFFido2MakeCredential(const char *cmd) {
|
|||
fnlen = strlen(filename);
|
||||
}
|
||||
|
||||
json_t *root = calloc(1, sizeof(json_t));
|
||||
if (root == NULL) {
|
||||
PrintAndLogEx(ERR, "error, cannot allocate memory ");
|
||||
return PM3_EMALLOC;
|
||||
}
|
||||
loadFileJSONroot(filename, root, verbose);
|
||||
json_t *root = NULL;
|
||||
loadFileJSONroot(filename, (void**)&root, verbose);
|
||||
if (root == NULL) {
|
||||
return PM3_EFILE;
|
||||
}
|
||||
|
@ -687,18 +694,22 @@ static int CmdHFFido2MakeCredential(const char *cmd) {
|
|||
if (res) {
|
||||
PrintAndLogEx(ERR, "Can't select authenticator. res=%x. Exit...", res);
|
||||
DropField();
|
||||
json_decref(root);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (sw != 0x9000) {
|
||||
PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff));
|
||||
DropField();
|
||||
json_decref(root);
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
|
||||
res = FIDO2CreateMakeCredentionalReq(root, data, sizeof(data), &datalen);
|
||||
if (res)
|
||||
if (res) {
|
||||
json_decref(root);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (showCBOR) {
|
||||
PrintAndLogEx(INFO, "CBOR make credential request:");
|
||||
|
@ -711,17 +722,20 @@ static int CmdHFFido2MakeCredential(const char *cmd) {
|
|||
DropField();
|
||||
if (res) {
|
||||
PrintAndLogEx(ERR, "Can't execute make credential command. res=%x. exit...", res);
|
||||
json_decref(root);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (sw != 0x9000) {
|
||||
PrintAndLogEx(ERR, "ERROR execute make credential command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff));
|
||||
json_decref(root);
|
||||
return PM3_EFILE;
|
||||
}
|
||||
|
||||
if (buf[0]) {
|
||||
PrintAndLogEx(ERR, "FIDO2 make credential error: %d - %s", buf[0], fido2GetCmdErrorDescription(buf[0]));
|
||||
return PM3_SUCCESS;
|
||||
json_decref(root);
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
|
||||
PrintAndLogEx(SUCCESS, "MakeCredential result %zu b ( ok )", len);
|
||||
|
@ -781,7 +795,7 @@ static int CmdHFFido2GetAssertion(const char *cmd) {
|
|||
}
|
||||
|
||||
json_t *root = NULL;
|
||||
loadFileJSONroot(filename, root, verbose);
|
||||
loadFileJSONroot(filename, (void**)&root, verbose);
|
||||
if (root == NULL) {
|
||||
return PM3_EFILE;
|
||||
}
|
||||
|
@ -799,18 +813,22 @@ static int CmdHFFido2GetAssertion(const char *cmd) {
|
|||
if (res) {
|
||||
PrintAndLogEx(ERR, "Can't select authenticator. res=%x. exiting...", res);
|
||||
DropField();
|
||||
json_decref(root);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (sw != 0x9000) {
|
||||
PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff));
|
||||
DropField();
|
||||
json_decref(root);
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
|
||||
res = FIDO2CreateGetAssertionReq(root, data, sizeof(data), &datalen, createAllowList);
|
||||
if (res)
|
||||
if (res) {
|
||||
json_decref(root);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (showCBOR) {
|
||||
PrintAndLogEx(SUCCESS, "CBOR get assertion request:");
|
||||
|
@ -823,16 +841,19 @@ static int CmdHFFido2GetAssertion(const char *cmd) {
|
|||
DropField();
|
||||
if (res) {
|
||||
PrintAndLogEx(ERR, "Can't execute get assertion command. res=%x. Exit...", res);
|
||||
json_decref(root);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (sw != 0x9000) {
|
||||
PrintAndLogEx(ERR, "ERROR execute get assertion command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff));
|
||||
json_decref(root);
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
|
||||
if (buf[0]) {
|
||||
PrintAndLogEx(ERR, "FIDO2 get assertion error: %d - %s", buf[0], fido2GetCmdErrorDescription(buf[0]));
|
||||
json_decref(root);
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
|
||||
|
|
|
@ -976,7 +976,6 @@ out:
|
|||
free(fileName);
|
||||
return retval;
|
||||
}
|
||||
|
||||
int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen) {
|
||||
char *path;
|
||||
int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, "", false);
|
||||
|
@ -1249,12 +1248,7 @@ out:
|
|||
return retval;
|
||||
}
|
||||
|
||||
int loadFileJSONroot(const char *preferredName, void *out_root, bool verbose) {
|
||||
|
||||
if (out_root == NULL) {
|
||||
return PM3_EINVARG;
|
||||
}
|
||||
|
||||
int loadFileJSONroot(const char *preferredName, void **proot, bool verbose) {
|
||||
char *path;
|
||||
int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, ".json", false);
|
||||
if (res != PM3_SUCCESS) {
|
||||
|
@ -1281,7 +1275,7 @@ int loadFileJSONroot(const char *preferredName, void *out_root, bool verbose) {
|
|||
goto out;
|
||||
}
|
||||
|
||||
out_root = root;
|
||||
*proot = root;
|
||||
return PM3_SUCCESS;
|
||||
|
||||
out:
|
||||
|
|
|
@ -207,7 +207,7 @@ int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen);
|
|||
*/
|
||||
int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, void (*callback)(json_t *));
|
||||
int loadFileJSONex(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, bool verbose, void (*callback)(json_t *));
|
||||
int loadFileJSONroot(const char *preferredName, void *out_root, bool verbose);
|
||||
int loadFileJSONroot(const char *preferredName, void **proot, bool verbose);
|
||||
|
||||
/**
|
||||
* @brief Utility function to load data from a DICTIONARY textfile. This method takes a preferred name.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue