1-SIM卡复位ATR解析

激活时序

image

在激活过程结束(接口设备中 RST 处于 L 状态,VCC 上电,I/O 进入接收模式,CLK 已被提供了一个匹配并稳定的时钟信号)时,卡片已就绪,可以进行冷复位。卡片在冷复位之前的内部状态不做规定。

根据图 1,在 Ta 时间点上时钟信号应用于 CLK。卡片应当在时钟信号应用于 CLK(在 Ta+ta 时间点)之后的 200 个时钟周期(ta时延)内将 I/O 设置为 H 状态。冷复位是在时钟信号应用于CLK(在 Ta+tb 时间点)之后,将 RST 维持至少 400 个时钟周期(tb 时延)的结果。接口设备应当在 RST 处于 L 状态时忽略 I/O 上的状态。

在 Tb 时间点上,RST 被置为 H 状态。I/O 上的应答应当在 RST 上信号上升沿后(在 Tb+tc时间点)的 400 和 40000 个时钟周期之间(tc 时延)开始。如果应答没有在 RST 处于 H 状态后 40000个时钟周期内开始,接口设备应当执行一个去激活。

void SIM_Cold_Reset(uint8_t ChannelID)
{
    Set_Sim_Io(ChannelID, SIM_VCC, 1);    //初始时,电源电压先上电             
    Delay_400_CLK();                      //待电压稳定
    Set_SimData_Direction(ChannelID, 1);  //将I/O端口置为接收方式
    Set_SimClk_Status(ChannelID, 1);      //启动独立波特率发生器开始计数工作,对系统时钟进行分频输出
    Delay_400_CLK();                      //RST复位信号需在提供CLK信号后400个时钟周期内保持低电平
    Set_Sim_Io(ChannelID, SIM_RST, 1);    //之后才可置为高电平
}

以4M的时钟为基准,一个时钟为1/4us,则400个时钟用100us,40000个时钟为10ms。

ATR基本应答数据如下

数据元 说明
TS 起始字符
T0 格式字符
TA1,TB1,TC1,TD1,... 接口字符
T1,T2,... ,TK 历史字符
TCK 校验字符

下面以ATR:3B9F94801FC78031E073FE21135758485553494D01F9为例,进行说明

数据元 说明
TS 起始字符
T0 格式字符
TA1,TB1,TC1,TD1,... 接口字符
T1,T2,... ,TK 历史字符
TCK 校验字符
ATR.jpg

1.起始字符TS


TS是ATR的强制部分,总是必须送出的。此字节只允许有两种编码:3B为正向约定,3F为反向约定。使用反向逻辑约定时, I/O的低电平状态等效于逻辑1,且该数据字节的最高位在起始位之后首先发送。使用正向逻辑约定时, I/O的高电平状态等效于逻辑1,且该数据字节的最低位在起始位之后首先发送。

上例ATR的TS为3B

2.格式字符T0


格式字符T0含有一组位表明将要传送哪个接口字符,它同时也指出后继历史字符的个数。像TS一样,每个ATR中都必须有这个字节。

高半字节( b5-b8) 表示后续字符TA1到TD1是否存在。(b5对应TA1,b8对应TD1);

低半字节( b1-b4) 表明可选历史字符的数目( 0到15);

上例ATR的T0为9F
表明存在TA1和TD1,历史字符为15个。

当没有TD1时,T=0,则TCK不存在。

3.接口字符TA1,TB1,TC1,TD1,...


这些字节在ATR中是可选的,由格式字符T0的高半字节决定。

3.1 全局接口字符TA1

TA1高半字节 FI 用于确定 F 的值, F 为时钟速率转换因子。用于修改复位应答之后终端所提供的时钟频率。低半字节 DI 用于确定 D 的值, D 为位速率调节因子。用于调整复位应答之后所使用的位持续时间。etu =F/D * (1/f)

FI和DI编码如下:

FI F DI D
0000 372 0000 RFU
0001 372 0001 1
0010 558 0010 2
0011 744 0011 4
0100 1116 0100 8
0101 1488 0101 16
0110 1860 0110 32
0111 RFU 0111 RFU
1000 RFU 1000 12
1001 512 1001 20
1010 768 1010 RFU
1011 1024 1011 RFU
1100 1536 1100 RFU
1101 2048 1101 RFU
1110 RFU 1110 RFU
1111 RFU 1111 RFU
上例ATR的TA1为94
表明F=512,D=8。
3.2 全局接口字符TB1:(没有意义了)

TB1传送PI1和II的值,PI1 在 b1 到 b5 位中定义,用于确定IC卡所需的编程电压 P 值;II 在 b6 和 b7位中定义,用于确定IC卡所需的最大编程电流I值。一般情况下ATR中必须包含TB1=00,表示IC卡不使用VPP。

上例ATR的TB1为空
3.2 全局接口字符TC1:(没有意义了)
上例ATR的TC1为空
3.2 全局接口字符TD1

TD1字符比较关键,看上面的ATR数据结构图可知,TD1的高4位决定了是否有TA2/TB2/TC2/TD2。

同理,TD2的高4位决定了是否有TA3/TB3/TC3/TD3。

上例ATR的TD1为80,
可表明存在TD2=1F,TA2、TB2、TC2不存在

上例ATR的TD2为1F,
可表明存在TA3=C7,TB3、TC3、TD3不存在

4.历史字符


很长一段时间,没有任何标准对历史字符做出规定,结果是随操作系统生产者而不同,它们包含了变化广泛的数据。

上例ATR的历史字符为
8031E073FE21135758485553494D01。

5.校验字符TCK


TCK具有一个检验复位应答期间所发送数据完整性的值。TCK的值应使从T0到包括TCK在内的所有字节进行异或运算的结果为零。

当没有TD1时,T=0,则TCK不存在。

如果在ATR中仅指出了T=0协议,TCK校验和可以不在ATR的尾部出现。在这种情况下,完全没有发送它,因为用奇偶校验已经知道了差错字节而在T=0协议中重复发送出错字节又是强制性的。相反,在T=1协议中,TCK字节必须出现,校验和的计算从字节T0开始,结束于最后的接口字符,如果有则是最后的历史字符。

上例ATR的TCK为F9,
将9F94801FC78031E073FE21135758485553494D01进行异或处理即可得到F9
for(atrCount = 1; atrCount <21; atrCount++) 
{
    printf("atrXOR_old:%X,atr:%X\n",atrXOR,atr[atrCount]);
    atrXOR ^= atr[atrCount];
    printf("atrXOR_new:%X\n",atrXOR);
}

该ATR的解析如下:

ATR:3B9F94801FC78031E073FE21135758485553494D01F9
ATR分析:
正向约定 F=512 D=8 N=0(d)
Protocal=TO
AtrBinarySize=22
AtrHistorySize=15
AtrHistorySize=8031E073FE21135758485553494D01
31:卡片数据服务
E0:通过全DF名称的直接应用选择、通过部分DF名称的选择数据对象在DIR文件中有效
73:卡能力标签
FE:DF选择(通过全DF名称、通过部分DF名称、通过路径、通过文件标识)
EF管理(所支持的短EF标识符、所支持的记录号)
21:数据编码类型
13:逻辑通道最大数4
TS=3B
T0=9F
TA1=94
TD1=80
TD2=1F
TA3=C7(时钟停止休止符:无优先 级别指示符:A、B、和C)
TCK=F9

参考

http://www.cnblogs.com/utank/p/5463269.html
http://www.cnblogs.com/utank/p/5545750.html
http://blog.csdn.net/daidi1989/article/details/49883207
http://blog.csdn.net/u013566722/article/details/49306505

你可能感兴趣的:(1-SIM卡复位ATR解析)