chg: smartcard - wait until SCL goes high

This commit is contained in:
Chris 2018-07-06 11:16:46 +02:00
commit bcffde1198
3 changed files with 50 additions and 28 deletions

View file

@ -101,7 +101,7 @@ int CmdSmartRaw(const char *Cmd) {
PrintAndLogEx(WARNING, "smart card response failed"); PrintAndLogEx(WARNING, "smart card response failed");
return 1; return 1;
} }
PrintAndLogEx(SUCCESS,"resp: %s", sprint_hex(resp.d.asBytes, resp.arg[0])); PrintAndLogEx(SUCCESS,"isOK %d | resp: %s",resp.arg[0], sprint_hex(resp.d.asBytes, resp.arg[1]));
} }
return 0; return 0;
} }
@ -259,7 +259,7 @@ int CmdSmartReader(const char *Cmd){
uint8_t isok = resp.arg[0] & 0xFF; uint8_t isok = resp.arg[0] & 0xFF;
if (!isok) { if (!isok) {
PrintAndLogEx(FAILED, "failed"); PrintAndLogEx(FAILED, "failed to get ATR");
return 1; return 1;
} }

View file

@ -111,10 +111,9 @@ void I2C_Reset_EnterBootloader(void) {
// µÈ´ýʱÖÓ±ä¸ß // µÈ´ýʱÖÓ±ä¸ß
// Wait for the clock to go High. // Wait for the clock to go High.
volatile uint16_t count;
bool WaitSCL_H(void) { bool WaitSCL_H(void) {
count = 5000; volatile uint16_t count = 50000;
while (count--) { while (count--) {
if (SCL_read) { if (SCL_read) {
@ -500,50 +499,70 @@ void I2C_print_status(void) {
DbpString(" FW version................FAILED"); DbpString(" FW version................FAILED");
} }
void SmartCardAtr(void) { #define WAIT_SCL_MAX_300
I2C_Reset_EnterMainProgram(); #define WAIT_UNTIL_SCL_GOES_HIGH while (!SCL_read) { I2C_DELAY_1CLK; }
bool WaitSCL_300(void){
volatile uint16_t delay = 300;
while ( SCL_read || delay ) {
SpinDelay(1);
delay--;
}
return (delay == 0);
}
bool GetATR(smart_card_atr_t *card_ptr) {
uint8_t *resp = BigBuf_malloc( sizeof(smart_card_atr_t) ); if ( card_ptr ) {
smart_card_atr_t *card = (smart_card_atr_t *)resp; card_ptr->atr_len = 0;
memset(card_ptr->atr, 0, sizeof(card_ptr->atr));
}
// Send ATR // Send ATR
// start [C0 01] stop // start [C0 01] stop
I2C_WriteCmd(I2C_DEVICE_CMD_GENERATE_ATR, I2C_DEVICE_ADDRESS_MAIN); I2C_WriteCmd(I2C_DEVICE_CMD_GENERATE_ATR, I2C_DEVICE_ADDRESS_MAIN);
// writing takes time. // variable delay here.
SpinDelay(50); if (!WaitSCL_300())
return false;
// 8051 speaks with smart card.
WAIT_UNTIL_SCL_GOES_HIGH;
// start [C0 03 start C1 len aa bb cc stop] // start [C0 03 start C1 len aa bb cc stop]
uint8_t len = I2C_BufferRead(card->atr, sizeof(card->atr), I2C_DEVICE_CMD_READ, I2C_DEVICE_ADDRESS_MAIN); uint8_t len = I2C_BufferRead(card_ptr->atr, sizeof(card_ptr->atr), I2C_DEVICE_CMD_READ, I2C_DEVICE_ADDRESS_MAIN);
// remove length byte from the read bytes. // remove length byte from the read bytes.
card->atr_len = len - 1; if ( card_ptr )
card_ptr->atr_len = len - 1;
// print ATR return true;
Dbhexdump(len, resp, false); }
void SmartCardAtr(void) {
smart_card_atr_t card;
cmd_send(CMD_ACK, len, 0, 0, resp, sizeof(smart_card_atr_t)); I2C_Reset_EnterMainProgram();
bool isOK = GetATR( &card );
if ( isOK )
Dbhexdump(card.atr_len, card.atr, false);
cmd_send(CMD_ACK, isOK, sizeof(smart_card_atr_t), 0, &card, sizeof(smart_card_atr_t));
} }
void SmartCardRaw( uint64_t arg0, uint64_t arg1, uint8_t *data ) { void SmartCardRaw( uint64_t arg0, uint64_t arg1, uint8_t *data ) {
#define ISO7618_MAX_FRAME 255 #define ISO7618_MAX_FRAME 255
I2C_Reset_EnterMainProgram(); I2C_Reset_EnterMainProgram();
uint8_t buf[30] = {0}; uint8_t len = 0;
uint8_t *resp = BigBuf_malloc(ISO7618_MAX_FRAME); uint8_t *resp = BigBuf_malloc(ISO7618_MAX_FRAME);
// Send ATR smart_card_atr_t card;
// start [C0 01] stop
I2C_WriteCmd(I2C_DEVICE_CMD_GENERATE_ATR, I2C_DEVICE_ADDRESS_MAIN);
// writing takes time.
SpinDelay(50);
// start [C0 03 start C1 len aa bb cc stop] (read ATR) bool isOK = GetATR( &card );
uint8_t len = I2C_BufferRead(buf, sizeof(buf), I2C_DEVICE_CMD_READ, I2C_DEVICE_ADDRESS_MAIN); if ( !isOK )
if ( !len ) {
goto out; goto out;
}
// Send raw bytes // Send raw bytes
// start [C0 02] A0 A4 00 00 02 stop // start [C0 02] A0 A4 00 00 02 stop
@ -556,7 +575,7 @@ void SmartCardRaw( uint64_t arg0, uint64_t arg1, uint8_t *data ) {
len = I2C_BufferRead(resp, ISO7618_MAX_FRAME, I2C_DEVICE_CMD_READ, I2C_DEVICE_ADDRESS_MAIN); len = I2C_BufferRead(resp, ISO7618_MAX_FRAME, I2C_DEVICE_CMD_READ, I2C_DEVICE_ADDRESS_MAIN);
out: out:
cmd_send(CMD_ACK, len, 0, 0, resp, len); cmd_send(CMD_ACK, isOK, len, 0, resp, len);
} }
void SmartCardUpgrade(uint64_t arg0) { void SmartCardUpgrade(uint64_t arg0) {

View file

@ -35,6 +35,9 @@ uint8_t I2C_BufferRead(uint8_t *data, uint8_t len, uint8_t device_cmd, uint8_t d
uint8_t I2C_ReadFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address); uint8_t I2C_ReadFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address);
bool I2C_WriteFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address); bool I2C_WriteFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address);
//
bool GetATR(smart_card_atr_t *card_ptr);
// generice functions // generice functions
void SmartCardAtr(void); void SmartCardAtr(void);
void SmartCardRaw(uint64_t arg0, uint64_t arg1, uint8_t *data); void SmartCardRaw(uint64_t arg0, uint64_t arg1, uint8_t *data);