mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 05:43:48 -07:00
Merge pull request #1248 from merlokk/emv_crypto
show some general crypto description
This commit is contained in:
commit
0a88565d0f
3 changed files with 36 additions and 6 deletions
|
@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
|
||||||
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
|
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
|
||||||
|
|
||||||
## [unreleased][unreleased]
|
## [unreleased][unreleased]
|
||||||
|
- Change emv commands now works with tokenized cards (@merlokk)
|
||||||
- Change `hf 15 restore` - now also support EML/JSON (@iceman1001)
|
- Change `hf 15 restore` - now also support EML/JSON (@iceman1001)
|
||||||
- Change - all commands now use cliparser (@iceman1001)
|
- Change - all commands now use cliparser (@iceman1001)
|
||||||
- Change `lf t55xx restore` - now also support JSON (@iceman1001)
|
- Change `lf t55xx restore` - now also support JSON (@iceman1001)
|
||||||
|
|
|
@ -1076,13 +1076,30 @@ static int CmdEMVExec(const char *Cmd) {
|
||||||
PrintAndLogEx(NORMAL, "AC: %s", sprint_hex(AC->value, AC->len));
|
PrintAndLogEx(NORMAL, "AC: %s", sprint_hex(AC->value, AC->len));
|
||||||
if (IAD) {
|
if (IAD) {
|
||||||
PrintAndLogEx(NORMAL, "IAD: %s", sprint_hex(IAD->value, IAD->len));
|
PrintAndLogEx(NORMAL, "IAD: %s", sprint_hex(IAD->value, IAD->len));
|
||||||
|
|
||||||
if (IAD->len >= IAD->value[0] + 1) {
|
// https://mst-company.ru/blog/ekvajring-emv-tranzaktsiya-emv-transaction-flow-chast-4-pdol-i-beskontaktnye-karty-osobennosti-qvsdc-i-quics
|
||||||
PrintAndLogEx(NORMAL, "\tKey index: 0x%02x", IAD->value[1]);
|
if (IAD->value[0] == 0x1f) {
|
||||||
PrintAndLogEx(NORMAL, "\tCrypto ver: 0x%02x(%03d)", IAD->value[2], IAD->value[2]);
|
PrintAndLogEx(NORMAL, " Key index: 0x%02x", IAD->value[2]);
|
||||||
PrintAndLogEx(NORMAL, "\tCVR: %s", sprint_hex(&IAD->value[3], IAD->value[0] - 2));
|
PrintAndLogEx(NORMAL, " Crypto ver: 0x%02x(%03d)", IAD->value[1], IAD->value[1]);
|
||||||
|
PrintAndLogEx(NORMAL, " CVR: %s", sprint_hex(&IAD->value[3], 5));
|
||||||
|
struct tlvdb *cvr = tlvdb_fixed(0x20, 5, &IAD->value[3]);
|
||||||
|
TLVPrintFromTLVLev(cvr, 1);
|
||||||
|
PrintAndLogEx(NORMAL, " IDD option id: 0x%02x", IAD->value[8]);
|
||||||
|
PrintAndLogEx(NORMAL, " IDD: %s", sprint_hex(&IAD->value[9], 23));
|
||||||
|
} else if (IAD->len >= IAD->value[0] + 1) {
|
||||||
|
PrintAndLogEx(NORMAL, " Key index: 0x%02x", IAD->value[1]);
|
||||||
|
PrintAndLogEx(NORMAL, " Crypto ver: 0x%02x(%03d)", IAD->value[2], IAD->value[2]);
|
||||||
|
PrintAndLogEx(NORMAL, " CVR: %s", sprint_hex(&IAD->value[3], IAD->value[0] - 2));
|
||||||
struct tlvdb *cvr = tlvdb_fixed(0x20, IAD->value[0] - 2, &IAD->value[3]);
|
struct tlvdb *cvr = tlvdb_fixed(0x20, IAD->value[0] - 2, &IAD->value[3]);
|
||||||
TLVPrintFromTLVLev(cvr, 1);
|
TLVPrintFromTLVLev(cvr, 1);
|
||||||
|
if (IAD->len >= 8) {
|
||||||
|
int iddLen = IAD->value[7];
|
||||||
|
PrintAndLogEx(NORMAL, " IDD length: %d", iddLen);
|
||||||
|
if (iddLen >= 1)
|
||||||
|
PrintAndLogEx(NORMAL, " IDD option id: 0x%02x", IAD->value[8]);
|
||||||
|
if (iddLen >= 2)
|
||||||
|
PrintAndLogEx(NORMAL, " IDD: %s", sprint_hex(&IAD->value[9], iddLen - 1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
PrintAndLogEx(WARNING, "WARNING: IAD not found.");
|
PrintAndLogEx(WARNING, "WARNING: IAD not found.");
|
||||||
|
|
|
@ -557,7 +557,7 @@ static void emv_tag_dump_cvr(const struct tlv *tlv, const struct emv_tag *tag, i
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tlv->len != tlv->value[0] + 1) {
|
if (tlv->len != 5 && tlv->len != tlv->value[0] + 1) {
|
||||||
PrintAndLogEx(INFO, "%*s" NOLF, (level * 4), " ");
|
PrintAndLogEx(INFO, "%*s" NOLF, (level * 4), " ");
|
||||||
PrintAndLogEx(NORMAL, " INVALID length!");
|
PrintAndLogEx(NORMAL, " INVALID length!");
|
||||||
return;
|
return;
|
||||||
|
@ -581,6 +581,14 @@ static void emv_tag_dump_cvr(const struct tlv *tlv, const struct emv_tag *tag, i
|
||||||
PrintAndLogEx(INFO, "%*s" NOLF, (level * 4), " ");
|
PrintAndLogEx(INFO, "%*s" NOLF, (level * 4), " ");
|
||||||
PrintAndLogEx(NORMAL, " PIN try: %x", tlv->value[2] >> 4);
|
PrintAndLogEx(NORMAL, " PIN try: %x", tlv->value[2] >> 4);
|
||||||
}
|
}
|
||||||
|
if (tlv->len >= 3 && (tlv->value[2] & 0x40)) {
|
||||||
|
PrintAndLogEx(INFO, "%*s" NOLF, (level * 4), " ");
|
||||||
|
PrintAndLogEx(NORMAL, " PIN try exceeded");
|
||||||
|
}
|
||||||
|
if (tlv->len >= 4 && (tlv->value[3] >> 4)) {
|
||||||
|
PrintAndLogEx(INFO, "%*s" NOLF, (level * 4), " ");
|
||||||
|
PrintAndLogEx(NORMAL, " Issuer script counter: %x", tlv->value[3] >> 4);
|
||||||
|
}
|
||||||
if (tlv->len >= 4 && (tlv->value[3] & 0x0F)) {
|
if (tlv->len >= 4 && (tlv->value[3] & 0x0F)) {
|
||||||
PrintAndLogEx(INFO, "%*s" NOLF, (level * 4), " ");
|
PrintAndLogEx(INFO, "%*s" NOLF, (level * 4), " ");
|
||||||
PrintAndLogEx(NORMAL, " Issuer discretionary bits: %x", tlv->value[3] & 0x0F);
|
PrintAndLogEx(NORMAL, " Issuer discretionary bits: %x", tlv->value[3] & 0x0F);
|
||||||
|
@ -589,6 +597,10 @@ static void emv_tag_dump_cvr(const struct tlv *tlv, const struct emv_tag *tag, i
|
||||||
PrintAndLogEx(INFO, "%*s" NOLF, (level * 4), " ");
|
PrintAndLogEx(INFO, "%*s" NOLF, (level * 4), " ");
|
||||||
PrintAndLogEx(NORMAL, " Successfully processed issuer script commands: %x", tlv->value[4] >> 4);
|
PrintAndLogEx(NORMAL, " Successfully processed issuer script commands: %x", tlv->value[4] >> 4);
|
||||||
}
|
}
|
||||||
|
if (tlv->len >= 5 && (tlv->value[4] & 0x02)) {
|
||||||
|
PrintAndLogEx(INFO, "%*s" NOLF, (level * 4), " ");
|
||||||
|
PrintAndLogEx(NORMAL, " CDCVM OK");
|
||||||
|
}
|
||||||
|
|
||||||
// mask 0F 0F F0 0F
|
// mask 0F 0F F0 0F
|
||||||
uint8_t data[20] = {0};
|
uint8_t data[20] = {0};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue