mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-22 06:13:27 -07:00
added to hf emv exec
: load params from json and some refactoring
This commit is contained in:
parent
c1feddf2f3
commit
145111e84e
3 changed files with 44 additions and 26 deletions
|
@ -334,8 +334,13 @@ bool ParamLoadFromJson(struct tlvdb *tlv) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: add search current path
|
// current path + file name
|
||||||
root = json_load_file("./emv/defparams.json", 0, &error);
|
const char *relfname = "emv/defparams.json";
|
||||||
|
char fname[strlen(get_my_executable_directory()) + strlen(relfname) + 1];
|
||||||
|
strcpy(fname, get_my_executable_directory());
|
||||||
|
strcat(fname, relfname);
|
||||||
|
|
||||||
|
root = json_load_file(fname, 0, &error);
|
||||||
if (!root) {
|
if (!root) {
|
||||||
PrintAndLog("Load params: json error on line %d: %s", error.line, error.text);
|
PrintAndLog("Load params: json error on line %d: %s", error.line, error.text);
|
||||||
return false;
|
return false;
|
||||||
|
@ -396,7 +401,7 @@ bool ParamLoadFromJson(struct tlvdb *tlv) {
|
||||||
uint8_t buf[251] = {0};
|
uint8_t buf[251] = {0};
|
||||||
size_t buflen = 0;
|
size_t buflen = 0;
|
||||||
|
|
||||||
// here max length must be 4, but now tlv_tag_t is 2-byte var. so let it be 2 by now... needs refactoring tlv_tag_t...
|
// here max length must be 4, but now tlv_tag_t is 2-byte var. so let it be 2 by now... TODO: needs refactoring tlv_tag_t...
|
||||||
if (!HexToBuffer("TLV Error type:", tlvType, buf, 2, &buflen)) {
|
if (!HexToBuffer("TLV Error type:", tlvType, buf, 2, &buflen)) {
|
||||||
json_decref(root);
|
json_decref(root);
|
||||||
return false;
|
return false;
|
||||||
|
@ -425,6 +430,26 @@ bool ParamLoadFromJson(struct tlvdb *tlv) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ParamLoadDefaults(struct tlvdb *tlvRoot) {
|
||||||
|
//9F02:(Amount, authorized (Numeric)) len:6
|
||||||
|
TLV_ADD(0x9F02, "\x00\x00\x00\x00\x01\x00");
|
||||||
|
//9F1A:(Terminal Country Code) len:2
|
||||||
|
TLV_ADD(0x9F1A, "ru");
|
||||||
|
//5F2A:(Transaction Currency Code) len:2
|
||||||
|
// USD 840, EUR 978, RUR 810, RUB 643, RUR 810(old), UAH 980, AZN 031, n/a 999
|
||||||
|
TLV_ADD(0x5F2A, "\x09\x80");
|
||||||
|
//9A:(Transaction Date) len:3
|
||||||
|
TLV_ADD(0x9A, "\x00\x00\x00");
|
||||||
|
//9C:(Transaction Type) len:1 | 00 => Goods and service #01 => Cash
|
||||||
|
TLV_ADD(0x9C, "\x00");
|
||||||
|
// 9F37 Unpredictable Number len:4
|
||||||
|
TLV_ADD(0x9F37, "\x01\x02\x03\x04");
|
||||||
|
// 9F6A Unpredictable Number (MSD for UDOL) len:4
|
||||||
|
TLV_ADD(0x9F6A, "\x01\x02\x03\x04");
|
||||||
|
//9F66:(Terminal Transaction Qualifiers (TTQ)) len:4
|
||||||
|
TLV_ADD(0x9F66, "\x26\x00\x00\x00"); // qVSDC
|
||||||
|
}
|
||||||
|
|
||||||
int CmdHFEMVExec(const char *cmd) {
|
int CmdHFEMVExec(const char *cmd) {
|
||||||
bool activateField = false;
|
bool activateField = false;
|
||||||
bool showAPDU = false;
|
bool showAPDU = false;
|
||||||
|
@ -432,6 +457,7 @@ int CmdHFEMVExec(const char *cmd) {
|
||||||
bool forceSearch = false;
|
bool forceSearch = false;
|
||||||
enum TransactionType TrType = TT_MSD;
|
enum TransactionType TrType = TT_MSD;
|
||||||
bool GenACGPO = false;
|
bool GenACGPO = false;
|
||||||
|
bool paramLoadJSON = false;
|
||||||
|
|
||||||
uint8_t buf[APDU_RES_LEN] = {0};
|
uint8_t buf[APDU_RES_LEN] = {0};
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
@ -493,6 +519,10 @@ int CmdHFEMVExec(const char *cmd) {
|
||||||
case 'G':
|
case 'G':
|
||||||
GenACGPO = true;
|
GenACGPO = true;
|
||||||
break;
|
break;
|
||||||
|
case 'j':
|
||||||
|
case 'J':
|
||||||
|
paramLoadJSON = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
PrintAndLog("Unknown parameter '%c'", param_getchar_indx(cmd, 1, cmdp));
|
PrintAndLog("Unknown parameter '%c'", param_getchar_indx(cmd, 1, cmdp));
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -559,7 +589,12 @@ int CmdHFEMVExec(const char *cmd) {
|
||||||
|
|
||||||
PrintAndLog("\n* Init transaction parameters.");
|
PrintAndLog("\n* Init transaction parameters.");
|
||||||
|
|
||||||
|
ParamLoadDefaults(tlvRoot);
|
||||||
|
|
||||||
|
if (paramLoadJSON) {
|
||||||
|
PrintAndLog("* * Transaction parameters loading from JSON...");
|
||||||
ParamLoadFromJson(tlvRoot);
|
ParamLoadFromJson(tlvRoot);
|
||||||
|
}
|
||||||
|
|
||||||
//9F66:(Terminal Transaction Qualifiers (TTQ)) len:4
|
//9F66:(Terminal Transaction Qualifiers (TTQ)) len:4
|
||||||
char *qVSDC = "\x26\x00\x00\x00";
|
char *qVSDC = "\x26\x00\x00\x00";
|
||||||
|
@ -581,26 +616,9 @@ int CmdHFEMVExec(const char *cmd) {
|
||||||
TLV_ADD(0x9F66, qVSDC); // qVSDC (VISA CDA not enabled)
|
TLV_ADD(0x9F66, qVSDC); // qVSDC (VISA CDA not enabled)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
TLV_ADD(0x9F66, "\x26\x00\x00\x00"); // qVSDC
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//9F02:(Amount, authorized (Numeric)) len:6
|
|
||||||
TLV_ADD(0x9F02, "\x00\x00\x00\x00\x01\x00");
|
|
||||||
//9F1A:(Terminal Country Code) len:2
|
|
||||||
TLV_ADD(0x9F1A, "ru");
|
|
||||||
//5F2A:(Transaction Currency Code) len:2
|
|
||||||
// USD 840, EUR 978, RUR 810, RUB 643, RUR 810(old), UAH 980, AZN 031, n/a 999
|
|
||||||
TLV_ADD(0x5F2A, "\x09\x80");
|
|
||||||
//9A:(Transaction Date) len:3
|
|
||||||
TLV_ADD(0x9A, "\x00\x00\x00");
|
|
||||||
//9C:(Transaction Type) len:1 | 00 => Goods and service #01 => Cash
|
|
||||||
TLV_ADD(0x9C, "\x00");
|
|
||||||
// 9F37 Unpredictable Number len:4
|
|
||||||
TLV_ADD(0x9F37, "\x01\x02\x03\x04");
|
|
||||||
// 9F6A Unpredictable Number (MSD for UDOL) len:4
|
|
||||||
TLV_ADD(0x9F6A, "\x01\x02\x03\x04");
|
|
||||||
|
|
||||||
TLVPrintFromTLV(tlvRoot); // TODO delete!!!
|
TLVPrintFromTLV(tlvRoot); // TODO delete!!!
|
||||||
|
|
||||||
PrintAndLog("\n* Calc PDOL.");
|
PrintAndLog("\n* Calc PDOL.");
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
{
|
{
|
||||||
"name": "Unpredictable Number (MSD for UDOL)",
|
"name": "Unpredictable Number (MSD for UDOL)",
|
||||||
"type": "9F 6A",
|
"type": "9F 6A",
|
||||||
"value": "01 02 03 04",
|
"value": "01 02 03 05",
|
||||||
"length": 4,
|
"length": 4,
|
||||||
"hint": "4 byte random number"
|
"hint": "4 byte random number"
|
||||||
}
|
}
|
||||||
|
|
|
@ -376,12 +376,12 @@ void tlvdb_change_or_add_node(struct tlvdb *tlvdb, tlv_tag_t tag, size_t len, co
|
||||||
tnewelm->next = telm->next;
|
tnewelm->next = telm->next;
|
||||||
tnewelm->parent = telm->parent;
|
tnewelm->parent = telm->parent;
|
||||||
|
|
||||||
// if elm stays 1st in children link
|
// if telm stayed first in children chain
|
||||||
if (telm->parent && telm->parent->children == telm) {
|
if (telm->parent && telm->parent->children == telm) {
|
||||||
telm->parent->children = tnewelm;
|
telm->parent->children = tnewelm;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if elm have prev element
|
// if telm have previous element
|
||||||
if (telm != tlvdb) {
|
if (telm != tlvdb) {
|
||||||
// elm in root
|
// elm in root
|
||||||
struct tlvdb *celm = tlvdb;
|
struct tlvdb *celm = tlvdb;
|
||||||
|
@ -398,7 +398,7 @@ void tlvdb_change_or_add_node(struct tlvdb *tlvdb, tlv_tag_t tag, size_t len, co
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// free old element
|
// free old element with childrens
|
||||||
telm->next = NULL;
|
telm->next = NULL;
|
||||||
tlvdb_free(telm);
|
tlvdb_free(telm);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue