mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-22 06:13:27 -07:00
add file name handling and small refactoring in argtable string processing
This commit is contained in:
parent
f001cbab21
commit
05d1458789
4 changed files with 50 additions and 26 deletions
|
@ -153,23 +153,14 @@ void CLIParserFree() {
|
||||||
// convertors
|
// convertors
|
||||||
int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen) {
|
int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen) {
|
||||||
*datalen = 0;
|
*datalen = 0;
|
||||||
if (!argstr->count)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
char buf[256] = {0};
|
|
||||||
int ibuf = 0;
|
int ibuf = 0;
|
||||||
|
uint8_t buf[256] = {0};
|
||||||
|
int res = CLIParamStrToBuf(argstr, buf, maxdatalen, &ibuf);
|
||||||
|
if (res || !ibuf)
|
||||||
|
return res;
|
||||||
|
|
||||||
for (int i = 0; i < argstr->count; i++) {
|
switch(param_gethex_to_eol((char *)buf, 0, data, maxdatalen, datalen)) {
|
||||||
int len = strlen(argstr->sval[i]);
|
|
||||||
memcpy(&buf[ibuf], argstr->sval[i], len);
|
|
||||||
ibuf += len;
|
|
||||||
}
|
|
||||||
buf[ibuf] = 0;
|
|
||||||
|
|
||||||
if (!ibuf)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
switch(param_gethex_to_eol(buf, 0, data, maxdatalen, datalen)) {
|
|
||||||
case 1:
|
case 1:
|
||||||
printf("Parameter error: Invalid HEX value.\n");
|
printf("Parameter error: Invalid HEX value.\n");
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -184,5 +175,31 @@ int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CLIParamStrToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen) {
|
||||||
|
*datalen = 0;
|
||||||
|
if (!argstr->count)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
uint8_t buf[256] = {0};
|
||||||
|
int ibuf = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < argstr->count; i++) {
|
||||||
|
int len = strlen(argstr->sval[i]);
|
||||||
|
memcpy(&buf[ibuf], argstr->sval[i], len);
|
||||||
|
ibuf += len;
|
||||||
|
}
|
||||||
|
buf[ibuf] = 0;
|
||||||
|
|
||||||
|
if (!ibuf)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (ibuf > maxdatalen)
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
memcpy(data, buf, ibuf);
|
||||||
|
*datalen = ibuf;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,8 +25,9 @@
|
||||||
#define arg_strx0(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 0, 250, (glossary)))
|
#define arg_strx0(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 0, 250, (glossary)))
|
||||||
|
|
||||||
#define CLIExecWithReturn(cmd, atbl, ifempty) if (CLIParserParseString(cmd, atbl, arg_getsize(atbl), ifempty)){CLIParserFree();return 0;}
|
#define CLIExecWithReturn(cmd, atbl, ifempty) if (CLIParserParseString(cmd, atbl, arg_getsize(atbl), ifempty)){CLIParserFree();return 0;}
|
||||||
#define CLIGetStrBLessWithReturn(paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data) - (delta), datalen)) {CLIParserFree();return 1;}
|
#define CLIGetHexBLessWithReturn(paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data) - (delta), datalen)) {CLIParserFree();return 1;}
|
||||||
#define CLIGetStrWithReturn(paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree();return 1;}
|
#define CLIGetHexWithReturn(paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree();return 1;}
|
||||||
|
#define CLIGetStrWithReturn(paramnum, data, datalen) if (CLIParamStrToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree();return 1;}
|
||||||
|
|
||||||
extern int CLIParserInit(char *vprogramName, char *vprogramHint, char *vprogramHelp);
|
extern int CLIParserInit(char *vprogramName, char *vprogramHint, char *vprogramHelp);
|
||||||
extern int CLIParserParseString(const char* str, void* argtable[], size_t vargtableLen, bool allowEmptyExec);
|
extern int CLIParserParseString(const char* str, void* argtable[], size_t vargtableLen, bool allowEmptyExec);
|
||||||
|
@ -35,3 +36,4 @@ extern int CLIParserParseArg(int argc, char **argv, void* argtable[], size_t var
|
||||||
extern void CLIParserFree();
|
extern void CLIParserFree();
|
||||||
|
|
||||||
extern int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen);
|
extern int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen);
|
||||||
|
extern int CLIParamStrToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen);
|
||||||
|
|
|
@ -790,7 +790,7 @@ int CmdHF14AAPDU(const char *cmd) {
|
||||||
leaveSignalON = arg_get_lit(2);
|
leaveSignalON = arg_get_lit(2);
|
||||||
decodeTLV = arg_get_lit(3);
|
decodeTLV = arg_get_lit(3);
|
||||||
// len = data + PCB(1b) + CRC(2b)
|
// len = data + PCB(1b) + CRC(2b)
|
||||||
CLIGetStrBLessWithReturn(4, data, &datalen, 1 + 2);
|
CLIGetHexBLessWithReturn(4, data, &datalen, 1 + 2);
|
||||||
|
|
||||||
|
|
||||||
CLIParserFree();
|
CLIParserFree();
|
||||||
|
|
|
@ -60,7 +60,7 @@ int CmdHFEMVSelect(const char *cmd) {
|
||||||
bool leaveSignalON = arg_get_lit(2);
|
bool leaveSignalON = arg_get_lit(2);
|
||||||
bool APDULogging = arg_get_lit(3);
|
bool APDULogging = arg_get_lit(3);
|
||||||
bool decodeTLV = arg_get_lit(4);
|
bool decodeTLV = arg_get_lit(4);
|
||||||
CLIGetStrWithReturn(5, data, &datalen);
|
CLIGetHexWithReturn(5, data, &datalen);
|
||||||
CLIParserFree();
|
CLIParserFree();
|
||||||
|
|
||||||
SetAPDULogging(APDULogging);
|
SetAPDULogging(APDULogging);
|
||||||
|
@ -205,7 +205,7 @@ int CmdHFEMVGPO(const char *cmd) {
|
||||||
bool dataMakeFromPDOL = arg_get_lit(3);
|
bool dataMakeFromPDOL = arg_get_lit(3);
|
||||||
bool APDULogging = arg_get_lit(4);
|
bool APDULogging = arg_get_lit(4);
|
||||||
bool decodeTLV = arg_get_lit(5);
|
bool decodeTLV = arg_get_lit(5);
|
||||||
CLIGetStrWithReturn(6, data, &datalen);
|
CLIGetHexWithReturn(6, data, &datalen);
|
||||||
CLIParserFree();
|
CLIParserFree();
|
||||||
|
|
||||||
SetAPDULogging(APDULogging);
|
SetAPDULogging(APDULogging);
|
||||||
|
@ -294,7 +294,7 @@ int CmdHFEMVReadRecord(const char *cmd) {
|
||||||
bool leaveSignalON = arg_get_lit(1);
|
bool leaveSignalON = arg_get_lit(1);
|
||||||
bool APDULogging = arg_get_lit(2);
|
bool APDULogging = arg_get_lit(2);
|
||||||
bool decodeTLV = arg_get_lit(3);
|
bool decodeTLV = arg_get_lit(3);
|
||||||
CLIGetStrWithReturn(4, data, &datalen);
|
CLIGetHexWithReturn(4, data, &datalen);
|
||||||
CLIParserFree();
|
CLIParserFree();
|
||||||
|
|
||||||
if (datalen != 2) {
|
if (datalen != 2) {
|
||||||
|
@ -372,7 +372,7 @@ int CmdHFEMVAC(const char *cmd) {
|
||||||
bool dataMakeFromCDOL = arg_get_lit(5);
|
bool dataMakeFromCDOL = arg_get_lit(5);
|
||||||
bool APDULogging = arg_get_lit(6);
|
bool APDULogging = arg_get_lit(6);
|
||||||
bool decodeTLV = arg_get_lit(7);
|
bool decodeTLV = arg_get_lit(7);
|
||||||
CLIGetStrWithReturn(8, data, &datalen);
|
CLIGetHexWithReturn(8, data, &datalen);
|
||||||
CLIParserFree();
|
CLIParserFree();
|
||||||
|
|
||||||
SetAPDULogging(APDULogging);
|
SetAPDULogging(APDULogging);
|
||||||
|
@ -501,7 +501,7 @@ int CmdHFEMVInternalAuthenticate(const char *cmd) {
|
||||||
bool dataMakeFromDDOL = arg_get_lit(3);
|
bool dataMakeFromDDOL = arg_get_lit(3);
|
||||||
bool APDULogging = arg_get_lit(4);
|
bool APDULogging = arg_get_lit(4);
|
||||||
bool decodeTLV = arg_get_lit(5);
|
bool decodeTLV = arg_get_lit(5);
|
||||||
CLIGetStrWithReturn(6, data, &datalen);
|
CLIGetHexWithReturn(6, data, &datalen);
|
||||||
CLIParserFree();
|
CLIParserFree();
|
||||||
|
|
||||||
SetAPDULogging(APDULogging);
|
SetAPDULogging(APDULogging);
|
||||||
|
@ -1080,7 +1080,7 @@ int CmdHFEMVScan(const char *cmd) {
|
||||||
json_t *root;
|
json_t *root;
|
||||||
json_error_t error;
|
json_error_t error;
|
||||||
|
|
||||||
CLIParserInit("hf emv save",
|
CLIParserInit("hf emv scan",
|
||||||
"Scan EMV card and save it contents to a file.",
|
"Scan EMV card and save it contents to a file.",
|
||||||
"It executes EMV contactless transaction and saves result to a file which can be used for emulation\n"
|
"It executes EMV contactless transaction and saves result to a file which can be used for emulation\n"
|
||||||
"Usage:\n\thf emv scan -at -> scan MSD transaction mode and show APDU and TLV\n"
|
"Usage:\n\thf emv scan -at -> scan MSD transaction mode and show APDU and TLV\n"
|
||||||
|
@ -1118,15 +1118,20 @@ int CmdHFEMVScan(const char *cmd) {
|
||||||
|
|
||||||
bool GenACGPO = arg_get_lit(9);
|
bool GenACGPO = arg_get_lit(9);
|
||||||
bool MergeJSON = arg_get_lit(10);
|
bool MergeJSON = arg_get_lit(10);
|
||||||
|
uint8_t relfname[250] ={0};
|
||||||
|
char *crelfname = (char *)relfname;
|
||||||
|
int relfnamelen = 0;
|
||||||
|
CLIGetStrWithReturn(11, relfname, &relfnamelen);
|
||||||
CLIParserFree();
|
CLIParserFree();
|
||||||
|
|
||||||
SetAPDULogging(showAPDU);
|
SetAPDULogging(showAPDU);
|
||||||
|
|
||||||
// current path + file name
|
// current path + file name
|
||||||
const char *relfname = "card.json";
|
if (!strstr(crelfname, ".json"))
|
||||||
char fname[strlen(get_my_executable_directory()) + strlen(relfname) + 1];
|
strcat(crelfname, ".json");
|
||||||
|
char fname[strlen(get_my_executable_directory()) + strlen(crelfname) + 1];
|
||||||
strcpy(fname, get_my_executable_directory());
|
strcpy(fname, get_my_executable_directory());
|
||||||
strcat(fname, relfname);
|
strcat(fname, crelfname);
|
||||||
|
|
||||||
if (MergeJSON) {
|
if (MergeJSON) {
|
||||||
root = json_load_file(fname, 0, &error);
|
root = json_load_file(fname, 0, &error);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue