added to hf emv exec: load params from json and some refactoring

This commit is contained in:
merlokk 2018-08-28 15:09:51 +03:00
commit 145111e84e
3 changed files with 44 additions and 26 deletions

View file

@ -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.");
ParamLoadFromJson(tlvRoot); ParamLoadDefaults(tlvRoot);
if (paramLoadJSON) {
PrintAndLog("* * Transaction parameters loading from JSON...");
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.");

View file

@ -51,8 +51,8 @@
{ {
"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"
} }
] ]

View file

@ -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);
} }