cardem: choose a more reasonable default ATR

PCSCd does not like invalid ATRs

Change-Id: I1eebfdc06be55931c2e80e2b515ac3a559737c38
This commit is contained in:
Eric Wild
2020-04-03 21:21:27 +02:00
committed by Harald Welte
parent 9316890a39
commit 0b1a3b4105
2 changed files with 38 additions and 3 deletions

View File

@@ -1179,8 +1179,23 @@ void tc_etu_wtime_expired(void *handle)
} }
} }
/* shortest ATR possible (uses default speed and no options) */ /* reasonable ATR offering all protocols and voltages
static const uint8_t default_atr[] = { 0x3B, 0x00 }; * smartphones might not care, but other readers do
*
* TS = 0x3B Direct Convention
* T0 = 0x80 Y(1): b1000, K: 0 (historical bytes)
* TD(1) = 0x80 Y(i+1) = b1000, Protocol T=0
* ----
* TD(2) = 0x81 Y(i+1) = b1000, Protocol T=1
* ----
* TD(3) = 0x1F Y(i+1) = b0001, Protocol T=15
* ----
* TA(4) = 0xC7 Clock stop: no preference - Class accepted by the card: (3G) A 5V B 3V C 1.8V
* ----
* Historical bytes
* TCK = 0x59 correct checksum
*/
static const uint8_t default_atr[] = { 0x3B, 0x80, 0x80, 0x81 , 0x1F, 0xC7, 0x59 };
static struct card_handle card_handles[NUM_SLOTS]; static struct card_handle card_handles[NUM_SLOTS];

View File

@@ -52,6 +52,26 @@
#define ATR_MAX_LEN 33 #define ATR_MAX_LEN 33
/* reasonable ATR offering all protocols and voltages
* smartphones might not care, but other readers do
*
* TS = 0x3B Direct Convention
* T0 = 0x80 Y(1): b1000, K: 0 (historical bytes)
* TD(1) = 0x80 Y(i+1) = b1000, Protocol T=0
* ----
* TD(2) = 0x81 Y(i+1) = b1000, Protocol T=1
* ----
* TD(3) = 0x1F Y(i+1) = b0001, Protocol T=15
* ----
* TA(4) = 0xC7 Clock stop: no preference - Class accepted by the card: (3G) A 5V B 3V C 1.8V
* ----
* Historical bytes
* TCK = 0x59 correct checksum
*/
#define DEFAULT_ATR_STR "3B8080811FC759"
static void atr_update_csum(uint8_t *atr, unsigned int atr_len) static void atr_update_csum(uint8_t *atr, unsigned int atr_len)
{ {
uint8_t csum = 0; uint8_t csum = 0;
@@ -274,7 +294,7 @@ int main(int argc, char **argv)
int rc; int rc;
int c, ret = 1; int c, ret = 1;
int skip_atr = 0; int skip_atr = 0;
char *atr = "3b00"; char *atr = DEFAULT_ATR_STR;
uint8_t real_atr[ATR_MAX_LEN]; uint8_t real_atr[ATR_MAX_LEN];
int atr_len; int atr_len;
int keep_running = 0; int keep_running = 0;