mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-20 21:33:47 -07:00
fix CDOL generation and add AC1 print result
This commit is contained in:
parent
eaedf7f811
commit
e058d87dc1
2 changed files with 29 additions and 10 deletions
|
@ -1182,17 +1182,17 @@ int CmdEMVExec(const char *cmd) {
|
||||||
PrintAndLogEx(NORMAL, "\n--> VSDC transaction.");
|
PrintAndLogEx(NORMAL, "\n--> VSDC transaction.");
|
||||||
|
|
||||||
PrintAndLogEx(NORMAL, "* * Calc CDOL1");
|
PrintAndLogEx(NORMAL, "* * Calc CDOL1");
|
||||||
struct tlv *cdol_data_tlv = dol_process(tlvdb_get(tlvRoot, 0x8c, NULL), tlvRoot, 0x01); // 0x01 - dummy tag
|
struct tlv *cdol1_data_tlv = dol_process(tlvdb_get(tlvRoot, 0x8c, NULL), tlvRoot, 0x01); // 0x01 - dummy tag
|
||||||
if (!cdol_data_tlv) {
|
if (!cdol1_data_tlv) {
|
||||||
PrintAndLogEx(WARNING, "Error: can't create CDOL1 TLV.");
|
PrintAndLogEx(WARNING, "Error: can't create CDOL1 TLV.");
|
||||||
dreturn(6);
|
dreturn(6);
|
||||||
}
|
}
|
||||||
|
|
||||||
PrintAndLogEx(NORMAL, "CDOL1 data[%d]: %s", cdol_data_tlv->len, sprint_hex(cdol_data_tlv->value, cdol_data_tlv->len));
|
PrintAndLogEx(NORMAL, "CDOL1 data[%d]: %s", cdol1_data_tlv->len, sprint_hex(cdol1_data_tlv->value, cdol1_data_tlv->len));
|
||||||
|
|
||||||
PrintAndLogEx(NORMAL, "* * AC1");
|
PrintAndLogEx(NORMAL, "* * AC1");
|
||||||
// EMVAC_TC + EMVAC_CDAREQ --- to get SDAD
|
// EMVAC_TC + EMVAC_CDAREQ --- to get SDAD
|
||||||
res = EMVAC(channel, true, (TrType == TT_CDA) ? EMVAC_TC + EMVAC_CDAREQ : EMVAC_TC, (uint8_t *)cdol_data_tlv->value, cdol_data_tlv->len, buf, sizeof(buf), &len, &sw, tlvRoot);
|
res = EMVAC(channel, true, (TrType == TT_CDA) ? EMVAC_TC + EMVAC_CDAREQ : EMVAC_TC, (uint8_t *)cdol1_data_tlv->value, cdol1_data_tlv->len, buf, sizeof(buf), &len, &sw, tlvRoot);
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
PrintAndLogEx(NORMAL, "AC1 error(%d): %4x. Exit...", res, sw);
|
PrintAndLogEx(NORMAL, "AC1 error(%d): %4x. Exit...", res, sw);
|
||||||
|
@ -1202,6 +1202,16 @@ int CmdEMVExec(const char *cmd) {
|
||||||
// process Format1 (0x80) anf print Format2 (0x77)
|
// process Format1 (0x80) anf print Format2 (0x77)
|
||||||
ProcessACResponseFormat1(tlvRoot, buf, len, decodeTLV);
|
ProcessACResponseFormat1(tlvRoot, buf, len, decodeTLV);
|
||||||
|
|
||||||
|
uint8_t CID = 0;
|
||||||
|
tlvdb_get_uint8(tlvRoot, 0x9f27, &CID);
|
||||||
|
|
||||||
|
// AC1 print result
|
||||||
|
PrintAndLog("");
|
||||||
|
if ((CID & EMVAC_AC_MASK) == EMVAC_AAC) PrintAndLogEx(INFO, "AC1 result: AAC (Transaction declined)");
|
||||||
|
if ((CID & EMVAC_AC_MASK) == EMVAC_TC) PrintAndLogEx(INFO, "AC1 result: TC (Transaction approved)");
|
||||||
|
if ((CID & EMVAC_AC_MASK) == EMVAC_ARQC) PrintAndLogEx(INFO, "AC1 result: ARQC (Online authorisation requested)");
|
||||||
|
if ((CID & EMVAC_AC_MASK) == EMVAC_AC_MASK) PrintAndLogEx(INFO, "AC1 result: RFU");
|
||||||
|
|
||||||
PrintAndLogEx(NORMAL, "\n* * Processing online request\n");
|
PrintAndLogEx(NORMAL, "\n* * Processing online request\n");
|
||||||
|
|
||||||
// authorization response code from acquirer
|
// authorization response code from acquirer
|
||||||
|
@ -1210,21 +1220,26 @@ int CmdEMVExec(const char *cmd) {
|
||||||
tlvdb_change_or_add_node(tlvRoot, 0x8a, sizeof(HostResponse) - 1, (const unsigned char *)HostResponse);
|
tlvdb_change_or_add_node(tlvRoot, 0x8a, sizeof(HostResponse) - 1, (const unsigned char *)HostResponse);
|
||||||
|
|
||||||
// needs to send AC2 command (res == ARQC)
|
// needs to send AC2 command (res == ARQC)
|
||||||
uint8_t CID = 0;
|
|
||||||
tlvdb_get_uint8(tlvRoot, 0x9f27, &CID);
|
|
||||||
if ((CID & 0xc0) == 0x80) {
|
if ((CID & 0xc0) == 0x80) {
|
||||||
PrintAndLogEx(NORMAL, "* * Calc CDOL2");
|
PrintAndLogEx(NORMAL, "* * Calc CDOL2");
|
||||||
struct tlv *cdol_data_tlv = dol_process(tlvdb_get(tlvRoot, 0x8d, NULL), tlvRoot, 0x01); // 0x01 - dummy tag
|
struct tlv *cdol2_data_tlv = dol_process(tlvdb_get(tlvRoot, 0x8d, NULL), tlvRoot, 0x01); // 0x01 - dummy tag
|
||||||
if (!cdol_data_tlv) {
|
if (!cdol2_data_tlv) {
|
||||||
PrintAndLogEx(WARNING, "Error: can't create CDOL2 TLV.");
|
PrintAndLogEx(WARNING, "Error: can't create CDOL2 TLV.");
|
||||||
dreturn(6);
|
dreturn(6);
|
||||||
}
|
}
|
||||||
|
|
||||||
PrintAndLogEx(NORMAL, "CDOL2 data[%d]: %s", cdol_data_tlv->len, sprint_hex(cdol_data_tlv->value, cdol_data_tlv->len));
|
PrintAndLogEx(NORMAL, "CDOL2 data[%d]: %s", cdol2_data_tlv->len, sprint_hex(cdol2_data_tlv->value, cdol2_data_tlv->len));
|
||||||
|
|
||||||
PrintAndLogEx(NORMAL, "* * AC2");
|
PrintAndLogEx(NORMAL, "* * AC2");
|
||||||
|
|
||||||
|
|
||||||
|
/* // AC2
|
||||||
|
PRINT_INDENT(level);
|
||||||
|
if ((CID & EMVAC_AC2_MASK) == EMVAC_AAC2) fprintf(f, "\tAC2: AAC (Transaction declined)\n");
|
||||||
|
if ((CID & EMVAC_AC2_MASK) == EMVAC_TC2) fprintf(f, "\tAC2: TC (Transaction approved)\n");
|
||||||
|
if ((CID & EMVAC_AC2_MASK) == EMVAC_ARQC2) fprintf(f, "\tAC2: not requested (ARQC)\n");
|
||||||
|
if ((CID & EMVAC_AC2_MASK) == EMVAC_AC2_MASK) fprintf(f, "\tAC2: RFU\n");
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,10 @@
|
||||||
# define EMVAC_TC 0x40
|
# define EMVAC_TC 0x40
|
||||||
# define EMVAC_ARQC 0x80
|
# define EMVAC_ARQC 0x80
|
||||||
# define EMVAC_CDAREQ 0x10
|
# define EMVAC_CDAREQ 0x10
|
||||||
|
# define EMVAC_AC2_MASK 0x30
|
||||||
|
# define EMVAC_AAC2 0x00
|
||||||
|
# define EMVAC_TC2 0x10
|
||||||
|
# define EMVAC_ARQC2 0x20
|
||||||
|
|
||||||
// CID
|
// CID
|
||||||
# define EMVCID_ADVICE 0x08
|
# define EMVCID_ADVICE 0x08
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue