mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 05:43:48 -07:00
fix pse channels
This commit is contained in:
parent
376ead028a
commit
3926874995
3 changed files with 10 additions and 14 deletions
|
@ -722,6 +722,7 @@ int CmdEMVExec(const char *cmd) {
|
||||||
EMVCommandChannel channel = ECC_CONTACTLESS;
|
EMVCommandChannel channel = ECC_CONTACTLESS;
|
||||||
if (arg_get_lit(11))
|
if (arg_get_lit(11))
|
||||||
channel = ECC_CONTACT;
|
channel = ECC_CONTACT;
|
||||||
|
uint8_t psenum = (channel == ECC_CONTACT) ? 1 : 2;
|
||||||
CLIParserFree();
|
CLIParserFree();
|
||||||
|
|
||||||
SetAPDULogging(showAPDU);
|
SetAPDULogging(showAPDU);
|
||||||
|
@ -736,7 +737,7 @@ int CmdEMVExec(const char *cmd) {
|
||||||
// PPSE
|
// PPSE
|
||||||
PrintAndLogEx(NORMAL, "\n* PPSE.");
|
PrintAndLogEx(NORMAL, "\n* PPSE.");
|
||||||
SetAPDULogging(showAPDU);
|
SetAPDULogging(showAPDU);
|
||||||
res = EMVSearchPSE(channel, activateField, true, decodeTLV, tlvSelect);
|
res = EMVSearchPSE(channel, activateField, true, psenum, decodeTLV, tlvSelect);
|
||||||
|
|
||||||
// check PPSE and select application id
|
// check PPSE and select application id
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
@ -1170,6 +1171,7 @@ int CmdEMVScan(const char *cmd) {
|
||||||
EMVCommandChannel channel = ECC_CONTACTLESS;
|
EMVCommandChannel channel = ECC_CONTACTLESS;
|
||||||
if (arg_get_lit(11))
|
if (arg_get_lit(11))
|
||||||
channel = ECC_CONTACT;
|
channel = ECC_CONTACT;
|
||||||
|
uint8_t psenum = (channel == ECC_CONTACT) ? 1 : 2;
|
||||||
uint8_t relfname[250] ={0};
|
uint8_t relfname[250] ={0};
|
||||||
char *crelfname = (char *)relfname;
|
char *crelfname = (char *)relfname;
|
||||||
int relfnamelen = 0;
|
int relfnamelen = 0;
|
||||||
|
@ -1248,7 +1250,7 @@ int CmdEMVScan(const char *cmd) {
|
||||||
tlvdb_free(fci);
|
tlvdb_free(fci);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = EMVSearchPSE(channel, false, true, decodeTLV, tlvSelect);
|
res = EMVSearchPSE(channel, false, true, psenum, decodeTLV, tlvSelect);
|
||||||
|
|
||||||
// check PPSE and select application id
|
// check PPSE and select application id
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
@ -1490,21 +1492,15 @@ int CmdEMVRoca(const char *cmd) {
|
||||||
// select card
|
// select card
|
||||||
uint8_t psenum = (channel == ECC_CONTACT) ? 1 : 2;
|
uint8_t psenum = (channel == ECC_CONTACT) ? 1 : 2;
|
||||||
|
|
||||||
|
SetAPDULogging(false);
|
||||||
|
|
||||||
// init applets list tree
|
// init applets list tree
|
||||||
const char *al = "Applets list";
|
const char *al = "Applets list";
|
||||||
struct tlvdb *tlvSelect = tlvdb_fixed(1, strlen(al), (const unsigned char *)al);
|
struct tlvdb *tlvSelect = tlvdb_fixed(1, strlen(al), (const unsigned char *)al);
|
||||||
|
|
||||||
// EMV PPSE
|
// EMV PPSE
|
||||||
PrintAndLogEx(NORMAL, "--> PPSE.");
|
PrintAndLogEx(NORMAL, "--> PPSE.");
|
||||||
res = EMVSelectPSE(channel, true, true, psenum, buf, sizeof(buf), &len, &sw);
|
res = EMVSearchPSE(channel, false, true, psenum, false, tlvSelect);
|
||||||
|
|
||||||
if (!res && sw == 0x9000){
|
|
||||||
struct tlvdb *fci = tlvdb_parse_multi(buf, len);
|
|
||||||
tlvdb_free(fci);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetAPDULogging(false);
|
|
||||||
res = EMVSearchPSE(channel, false, true, false, tlvSelect);
|
|
||||||
|
|
||||||
// check PPSE and select application id
|
// check PPSE and select application id
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
|
|
@ -332,14 +332,14 @@ int EMVSelectPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldO
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int EMVSearchPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, bool decodeTLV, struct tlvdb *tlv) {
|
int EMVSearchPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, uint8_t PSENum, bool decodeTLV, struct tlvdb *tlv) {
|
||||||
uint8_t data[APDU_RES_LEN] = {0};
|
uint8_t data[APDU_RES_LEN] = {0};
|
||||||
size_t datalen = 0;
|
size_t datalen = 0;
|
||||||
uint16_t sw = 0;
|
uint16_t sw = 0;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
// select PPSE
|
// select PPSE
|
||||||
res = EMVSelectPSE(channel, ActivateField, true, 2, data, sizeof(data), &datalen, &sw);
|
res = EMVSelectPSE(channel, ActivateField, true, PSENum, data, sizeof(data), &datalen, &sw);
|
||||||
|
|
||||||
if (!res){
|
if (!res){
|
||||||
struct tlvdb *t = NULL;
|
struct tlvdb *t = NULL;
|
||||||
|
|
|
@ -79,7 +79,7 @@ extern void SetAPDULogging(bool logging);
|
||||||
extern int EMVExchange(EMVCommandChannel channel, bool LeaveFieldON, sAPDU apdu, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv);
|
extern int EMVExchange(EMVCommandChannel channel, bool LeaveFieldON, sAPDU apdu, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv);
|
||||||
|
|
||||||
// search application
|
// search application
|
||||||
extern int EMVSearchPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, bool decodeTLV, struct tlvdb *tlv);
|
extern int EMVSearchPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, uint8_t PSENum, bool decodeTLV, struct tlvdb *tlv);
|
||||||
extern int EMVSearch(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, bool decodeTLV, struct tlvdb *tlv);
|
extern int EMVSearch(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, bool decodeTLV, struct tlvdb *tlv);
|
||||||
extern int EMVSelectPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, uint8_t PSENum, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw);
|
extern int EMVSelectPSE(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, uint8_t PSENum, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw);
|
||||||
extern int EMVSelect(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, uint8_t *AID, size_t AIDLen, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv);
|
extern int EMVSelect(EMVCommandChannel channel, bool ActivateField, bool LeaveFieldON, uint8_t *AID, size_t AIDLen, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw, struct tlvdb *tlv);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue