mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 05:43:48 -07:00
Merge branch 'master' of https://github.com/RfidResearchGroup/proxmark3
This commit is contained in:
commit
60b7dbe525
4 changed files with 34 additions and 37 deletions
|
@ -306,7 +306,7 @@ static int smart_wait(uint8_t *data) {
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smart_response(uint8_t apduINS, uint8_t *data) {
|
static int smart_response(uint8_t *data) {
|
||||||
|
|
||||||
int datalen = smart_wait(data);
|
int datalen = smart_wait(data);
|
||||||
bool needGetData = false;
|
bool needGetData = false;
|
||||||
|
@ -315,12 +315,6 @@ static int smart_response(uint8_t apduINS, uint8_t *data) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (datalen > 2 && data[0] != apduINS) {
|
|
||||||
PrintAndLogEx(ERR, "Card ACK error. len=0x%x data[0]=%02x", datalen, data[0]);
|
|
||||||
datalen = 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( data[datalen - 2] == 0x61 || data[datalen - 2] == 0x9F ) {
|
if ( data[datalen - 2] == 0x61 || data[datalen - 2] == 0x9F ) {
|
||||||
needGetData = true;
|
needGetData = true;
|
||||||
}
|
}
|
||||||
|
@ -340,21 +334,25 @@ static int smart_response(uint8_t apduINS, uint8_t *data) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (datalen > 2 && data[0] != ISO7816_GETSTATUS) {
|
// data wo ACK
|
||||||
|
if (datalen != len + 2) {
|
||||||
|
// data with ACK
|
||||||
|
if (datalen == len + 2 + 1) { // 2 - response, 1 - ACK
|
||||||
|
if (data[0] != ISO7816_GETSTATUS) {
|
||||||
PrintAndLogEx(ERR, "GetResponse ACK error. len=0x%x data[0]=%02x", len, data[0]);
|
PrintAndLogEx(ERR, "GetResponse ACK error. len=0x%x data[0]=%02x", len, data[0]);
|
||||||
datalen = 0;
|
datalen = 0;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (datalen != len + 2 + 1) { // 2 - response, 1 - ACK
|
datalen--;
|
||||||
|
memmove(data, &data[1], datalen);
|
||||||
|
} else {
|
||||||
|
// wrong length
|
||||||
PrintAndLogEx(WARNING, "GetResponse wrong length. Must be: 0x%02x but: 0x%02x", len, datalen - 3);
|
PrintAndLogEx(WARNING, "GetResponse wrong length. Must be: 0x%02x but: 0x%02x", len, datalen - 3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (datalen > 2) {
|
|
||||||
datalen--;
|
|
||||||
memmove(data, &data[1], datalen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return datalen;
|
return datalen;
|
||||||
}
|
}
|
||||||
|
@ -441,7 +439,7 @@ int CmdSmartRaw(const char *Cmd) {
|
||||||
if ( !buf )
|
if ( !buf )
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
int len = smart_response(data[1], buf);
|
int len = smart_response(buf);
|
||||||
if ( len < 0 ) {
|
if ( len < 0 ) {
|
||||||
free(buf);
|
free(buf);
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -453,7 +451,7 @@ int CmdSmartRaw(const char *Cmd) {
|
||||||
memcpy(c.d.asBytes, data, sizeof(data) );
|
memcpy(c.d.asBytes, data, sizeof(data) );
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
len = smart_response(data[1], buf);
|
len = smart_response(buf);
|
||||||
|
|
||||||
data[4] = 0;
|
data[4] = 0;
|
||||||
}
|
}
|
||||||
|
@ -473,15 +471,15 @@ int ExchangeAPDUSC(uint8_t *datain, int datainlen, bool activateCard, bool leave
|
||||||
smart_select(false);
|
smart_select(false);
|
||||||
printf("* APDU SC\n");
|
printf("* APDU SC\n");
|
||||||
|
|
||||||
UsbCommand c = {CMD_SMART_RAW, {SC_RAW | SC_CONNECT, datainlen, 0}};
|
UsbCommand c = {CMD_SMART_RAW, {SC_RAW_T0, datainlen, 0}};
|
||||||
if (activateCard) {
|
if (activateCard) {
|
||||||
c.arg[0] |= SC_SELECT;
|
c.arg[0] |= SC_SELECT | SC_CONNECT;
|
||||||
}
|
}
|
||||||
memcpy(c.d.asBytes, datain, datainlen);
|
memcpy(c.d.asBytes, datain, datainlen);
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
|
|
||||||
int len = smart_response(datain[1], dataout);
|
int len = smart_response(dataout);
|
||||||
|
|
||||||
if ( len < 0 ) {
|
if ( len < 0 ) {
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -489,19 +487,16 @@ int ExchangeAPDUSC(uint8_t *datain, int datainlen, bool activateCard, bool leave
|
||||||
|
|
||||||
// retry
|
// retry
|
||||||
if (len > 1 && dataout[len - 2] == 0x6c && datainlen > 4) {
|
if (len > 1 && dataout[len - 2] == 0x6c && datainlen > 4) {
|
||||||
UsbCommand c2 = {CMD_SMART_RAW, {SC_RAW, datainlen, 0}};
|
UsbCommand c2 = {CMD_SMART_RAW, {SC_RAW_T0, datainlen, 0}};
|
||||||
memcpy(c2.d.asBytes, datain, datainlen);
|
memcpy(c2.d.asBytes, datain, 5);
|
||||||
|
|
||||||
int vlen = 5 + datain[4];
|
// transfer length via T=0
|
||||||
if (datainlen == vlen)
|
c2.d.asBytes[4] = dataout[len - 1];
|
||||||
datainlen++;
|
|
||||||
|
|
||||||
c2.d.asBytes[vlen] = dataout[len - 1];
|
|
||||||
|
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
SendCommand(&c2);
|
SendCommand(&c2);
|
||||||
|
|
||||||
len = smart_response(datain[1], dataout);
|
len = smart_response(dataout);
|
||||||
}
|
}
|
||||||
|
|
||||||
*dataoutlen = len;
|
*dataoutlen = len;
|
||||||
|
@ -822,7 +817,7 @@ int CmdSmartBruteforceSFI(const char *Cmd) {
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
|
|
||||||
smart_response(data[1], buf);
|
smart_response(buf);
|
||||||
|
|
||||||
// if 0x6C
|
// if 0x6C
|
||||||
if ( buf[0] == 0x6C ) {
|
if ( buf[0] == 0x6C ) {
|
||||||
|
@ -831,7 +826,7 @@ int CmdSmartBruteforceSFI(const char *Cmd) {
|
||||||
memcpy(c.d.asBytes, data, sizeof(data) );
|
memcpy(c.d.asBytes, data, sizeof(data) );
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
uint8_t len = smart_response(data[1], buf);
|
uint8_t len = smart_response(buf);
|
||||||
|
|
||||||
// TLV decoder
|
// TLV decoder
|
||||||
if (len > 4)
|
if (len > 4)
|
||||||
|
|
|
@ -698,14 +698,14 @@ void SmartCardRaw( uint64_t arg0, uint64_t arg1, uint8_t *data ) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flags & SC_RAW)) {
|
if ((flags & SC_RAW) || (flags & SC_RAW_T0)) {
|
||||||
|
|
||||||
LogTrace(data, arg1, 0, 0, NULL, true);
|
LogTrace(data, arg1, 0, 0, NULL, true);
|
||||||
|
|
||||||
// Send raw bytes
|
// Send raw bytes
|
||||||
// asBytes = A0 A4 00 00 02
|
// asBytes = A0 A4 00 00 02
|
||||||
// arg1 = len 5
|
// arg1 = len 5
|
||||||
bool res = I2C_BufferWrite(data, arg1, I2C_DEVICE_CMD_SEND, I2C_DEVICE_ADDRESS_MAIN);
|
bool res = I2C_BufferWrite(data, arg1, ((flags & SC_RAW_T0) ? I2C_DEVICE_CMD_SEND_T0 : I2C_DEVICE_CMD_SEND), I2C_DEVICE_ADDRESS_MAIN);
|
||||||
if ( !res && MF_DBGLEVEL > 3 ) DbpString(I2C_ERROR);
|
if ( !res && MF_DBGLEVEL > 3 ) DbpString(I2C_ERROR);
|
||||||
|
|
||||||
// read bytes from module
|
// read bytes from module
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#define I2C_DEVICE_CMD_SETBAUD 0x04
|
#define I2C_DEVICE_CMD_SETBAUD 0x04
|
||||||
#define I2C_DEVICE_CMD_SIM_CLC 0x05
|
#define I2C_DEVICE_CMD_SIM_CLC 0x05
|
||||||
#define I2C_DEVICE_CMD_GETVERSION 0x06
|
#define I2C_DEVICE_CMD_GETVERSION 0x06
|
||||||
|
#define I2C_DEVICE_CMD_SEND_T0 0x07
|
||||||
|
|
||||||
|
|
||||||
void I2C_recovery(void);
|
void I2C_recovery(void);
|
||||||
|
|
|
@ -109,7 +109,8 @@ typedef enum SMARTCARD_COMMAND {
|
||||||
SC_CONNECT = (1 << 0),
|
SC_CONNECT = (1 << 0),
|
||||||
SC_NO_DISCONNECT = (1 << 1),
|
SC_NO_DISCONNECT = (1 << 1),
|
||||||
SC_RAW = (1 << 2),
|
SC_RAW = (1 << 2),
|
||||||
SC_SELECT = (1 << 3)
|
SC_SELECT = (1 << 3),
|
||||||
|
SC_RAW_T0 = (1 << 4),
|
||||||
} smartcard_command_t;
|
} smartcard_command_t;
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue