chg: i2c fixes. all working.

chg: 'sc info'  now prints url to atr decoder.
chg: 'sc reader' has more options  A, S
This commit is contained in:
Chris
2018-07-09 11:22:51 +02:00
parent 0d8e3160f8
commit 714de99f82
5 changed files with 104 additions and 81 deletions

View File

@@ -894,14 +894,14 @@ int CmdHF14ACmdRaw(const char *cmd) {
if ((cmd[i]>='0' && cmd[i]<='9') ||
(cmd[i]>='a' && cmd[i]<='f') ||
(cmd[i]>='A' && cmd[i]<='F') ) {
buf[strlen(buf)+1]=0;
buf[strlen(buf)]=cmd[i];
buf[strlen(buf)+1] = 0;
buf[strlen(buf)] = cmd[i];
i++;
if (strlen(buf)>=2) {
sscanf(buf,"%x",&temp);
data[datalen]=(uint8_t)(temp & 0xff);
*buf=0;
if (strlen(buf) >= 2) {
sscanf(buf, "%x", &temp);
data[datalen] = (uint8_t)(temp & 0xff);
*buf = 0;
if (++datalen >= sizeof(data)){
if (crc)
PrintAndLogEx(NORMAL, "Buffer is full, we can't add CRC to your data");
@@ -914,7 +914,7 @@ int CmdHF14ACmdRaw(const char *cmd) {
return 0;
}
if (crc && datalen>0 && datalen < sizeof(data)-2) {
if (crc && datalen > 0 && datalen < sizeof(data)-2) {
uint8_t first, second;
if (topazmode) {
compute_crc(CRC_14443_B, data, datalen, &first, &second);
@@ -989,7 +989,7 @@ static int waitCmd(uint8_t iSelect) {
PrintAndLogEx(WARNING, "Can't select card.");
}
} else {
PrintAndLogEx(NORMAL, "received %i bytes:", len);
PrintAndLogEx(NORMAL, "received %i bytes", len);
}
if (!len)

View File

@@ -15,6 +15,8 @@ int usage_sm_raw(void) {
PrintAndLogEx(NORMAL, "Usage: sc raw [h|r|c] d <0A 0B 0C ... hex>");
PrintAndLogEx(NORMAL, " h : this help");
PrintAndLogEx(NORMAL, " r : do not read response");
PrintAndLogEx(NORMAL, " a : active signal field ON without select");
PrintAndLogEx(NORMAL, " s : active signal field ON with select");
PrintAndLogEx(NORMAL, " d <bytes> : bytes to send");
PrintAndLogEx(NORMAL, "");
PrintAndLogEx(NORMAL, "Examples:");
@@ -53,6 +55,8 @@ int usage_sm_upgrade(void) {
int CmdSmartRaw(const char *Cmd) {
int hexlen = 0;
bool active = false;
bool active_select = false;
uint8_t cmdp = 0;
bool errors = false, reply = true;
uint8_t data[USB_CMD_DATA_SIZE] = {0x00};
@@ -64,6 +68,14 @@ int CmdSmartRaw(const char *Cmd) {
reply = false;
cmdp++;
break;
case 'a':
active = true;
cmdp++;
break;
case 's':
active_select = true;
cmdp++;
break;
case 'd': {
switch (param_gethex_to_eol(Cmd, cmdp+1, data, sizeof(data), &hexlen)) {
case 1:
@@ -92,6 +104,17 @@ int CmdSmartRaw(const char *Cmd) {
// arg0 = RFU flags
// arg1 = length
UsbCommand c = {CMD_SMART_RAW, {0, hexlen, 0}};
if (active || active_select) {
c.arg[0] |= SC_CONNECT;
if (active)
c.arg[0] |= SC_NO_SELECT;
}
if (hexlen > 0) {
c.arg[0] |= SC_RAW;
}
memcpy(c.d.asBytes, data, hexlen );
clearCommandBuffer();
SendCommand(&c);
@@ -103,14 +126,14 @@ int CmdSmartRaw(const char *Cmd) {
PrintAndLogEx(WARNING, "smart card response failed");
return 1;
}
uint32_t len = resp.arg[0];
if ( !resp.arg[0] ) {
if ( !len ) {
PrintAndLogEx(WARNING, "smart card response failed");
return 1;
}
uint32_t len = resp.arg[1];
PrintAndLogEx(INFO, "received %i bytes:", len);
PrintAndLogEx(INFO, "received %i bytes", len);
if (!len)
return 1;
@@ -246,7 +269,7 @@ int CmdSmartInfo(const char *Cmd){
}
//Validations
if (errors || cmdp == 0 ) return usage_sm_info();
if (errors ) return usage_sm_info();
UsbCommand c = {CMD_SMART_ATR, {0, 0, 0}};
clearCommandBuffer();
@@ -269,8 +292,9 @@ int CmdSmartInfo(const char *Cmd){
// print header
PrintAndLogEx(INFO, "\n--- Smartcard Information ---------");
PrintAndLogEx(INFO, "-------------------------------------------------------------");
PrintAndLogEx(INFO, "ATR : %s", sprint_hex(card.atr, card.atr_len));
PrintAndLogEx(INFO, "\n todo - look up ATR ");
PrintAndLogEx(INFO, "ISO76183 ATR : %s", sprint_hex(card.atr, card.atr_len));
PrintAndLogEx(INFO, "look up ATR");
PrintAndLogEx(INFO, "http://smartcard-atr.appspot.com/parse?ATR=%s", sprint_hex_inrow(card.atr, card.atr_len) );
return 0;
}
@@ -312,8 +336,7 @@ int CmdSmartReader(const char *Cmd){
smart_card_atr_t card;
memcpy(&card, (smart_card_atr_t *)resp.d.asBytes, sizeof(smart_card_atr_t));
PrintAndLogEx(INFO, "ATR : %s", sprint_hex(card.atr, card.atr_len));
PrintAndLogEx(INFO, "ISO7816-3 ATR : %s", sprint_hex(card.atr, card.atr_len));
return 0;
}