一、ATR是什么
ATR也叫复位应答,是一个字节序列,这些字节是由卡作为对复位命令的响应发送给读卡器的。在I/O电路上,每个成功的复位操作都会导致I/O上的一个由初始字符TS开始,后跟最多32个字符的复位应答。ATR的作用是告诉读卡器,我是一张什么样的卡片,以便读卡器知道接下来该以什么样的方式和卡片通信。
二、ATR的基本数据结构
三、起始字符——TS
初始字符定义了所有后继字符的解码协议。它只有两种可能:3B-正向约定,3F-反向约定。正向约定就是高电平为1,低电平为0,且从一个字节的低位开始发送。反向约定就是低电平为1,高电平为0,且从一个字节的高位开始发送。
四、格式字符——T0
(一)TA1(重要)
- 高半字节 FI 用于确定 F 的值, F 为时钟速率转换因子。用于修改复位应答之后终端所提供的时钟频率。
- 低半字节 DI 用于确定 D 的值, D 为位速率调节因子。用于调整复位应答之后所使用的位持续时间。etu =F/D * (1/f)
(二)TC1
TC1为0时,表示不需要额外的保护时间。
五、ATR分析示例
ATR : 3B 70 13 00 00
Protocol : SCARD_PROTOCOL_T0
+ TS = 3B --> Direct Convention
+ T0 = 70, Y1=0111, K=0 (historical bytes)
+ TA1 = 13 --> Fi=372, Di=4
+ TB1 = 00 --> Vpp not connected
+ TC1 = 00 --> EGT=0
其中TA1的高4位为1,低4位为3,分别在下面两个表中查询,所以得出:Fi=372, Di=4。
Fi的编码
FI | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
F | 372 | 372 | 558 | 744 | 1116 | 1488 | 1860 | RFU |
FI | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
F | RFU | 512 | 768 | 1024 | 1536 | 2048 | RFU | RFU |
Di的编码
DI | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
D | RFU | 1 | 2 | 4 | 8 | 16 | 32 | RFU |
DI | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
D | 12 | 20 | RFU | RFU | RFU | RFU | RFU | RFU |
续...TA2
最近在同方某款ARM芯片上实现ISO7816的通信协议,其中有个PPS的概念涉及到了ATR中的TA2,所以这里介绍一下TA2的作用。卡片复位后的第一件事是发送ATR,读写器接收并解析ATR。ATR中的TA2字段存在与否表明了卡片的两种模式:
- TA2(有) - 卡片为协议模式,此时采用ATR中指定的协议和参数进行通信。
- TA2(无) - 卡片为协商模式,此时读写器根据具体情况决定进行PPS数据交换,还是发送工作命令。只有当卡片处于协商模式下时,读写器才有必要根据具体情况进行PPS交换还是直接发送工作命令。
以上是TA2字段的作用。通过以上作用我们大概也能知道TA2中都存储了些什么。具体如下:
- bit8 - 是否支持在协议模式和指定模式之间切换。0-支持,1-不支持。
- bit6~7 - 预留。
- bit5 - 指定传输使用的参数和F/D。0-使用TA1中指定的Fi和Di参数。1-使用隐含参数,即默认参数(非ATR中接口字符中定义的值)
- bit1~4 - 指定传输使用的协议T。
简而言之,TA2指定了传输使用的协议T和参数F/D,同时TA2也表明是否支持模式切换。
续...TC2
7816-3 10.2 中提到“If present in the Answer-to-Reset, the interface byte TC2 encodes the waiting time integer WI over the eight bits, except the value '00' reserved for future use. If TC2 is absent, then the default value is WI = 10.”。而这个“WI”是计算T=0协议中WTX的一个重要参数。也就是说如果是T=0的卡,那么每次卡片上电都要从ATR中获取TC2的值当做WI,然后据此计算WTX。当然,计算WTX不只从ATR中获取了WI,还有Di。
续...TD1
TD1表示是否还要发送更多的接口字符以及后续传输所使用的协议类型,其中:
- 高半字节用于表示字符TA2到TD2是否存在,这些位(b5~b8)设置为逻辑1状态时,分别表示TA2到TD2字符的存在。
- 低半字节用于表示后续信息交换所使用的协议类型。
- 当选用T=0协议时,IC卡不回送TD1,并且T=0协议作为后续传输类型的默认值。
- 当选择T=1协议时,IC卡将回送TD1=0x81,表示TD2存在,且后续传输协议类型为T=1协议。