《CPU卡中T=0通讯协议的分析与实现》由会员分享,可在线阅读,更多相关《CPU卡中T=0通讯协议的分析与实现(5页珍藏版)》请在金锄头文库上搜索。
1、CPU 卡中 T=0 通讯协议的分析与实现时间: 2011-04-28 19:45:02 来源: 作者:IC 卡的应用越来越广泛,从存储卡到逻辑加密卡,目前 CPU 卡已经逐渐在应用中占据主导地位。CPU 卡根据通讯协议可分为两种:接触式和非接触式。接触式 CPU 卡主要采用两种通讯协议:T=0 和 T=1 通讯协议。T=0 是异步半双工字符传输协议,T=1 是异步半双工块传输协议。目前 T=0 通讯协议的应用较为广泛,国内外大多数 CPU 卡都支持该协议,在金融交易中也采用这种通讯协议。为了便于说明问题,本文从 T=0 协议的功能出发,将该协议分为四个层次:物理层、数据链路层、终端传输层和应
2、用层,见图 1。由于该协议的特殊性,终端传输层与应用层联系非常紧密,实现起来比较繁琐,在CPU 卡中,这些任务通过卡片操作系统(COS )来实现。终端在与卡的信息交换中,始终处于主动地位,终端向卡发送符合 T=0 协议的命令字节,卡中的 COS 完成对数据的处理并将处理结果返回给终端。下面对 T=0 协议的四个层次进行详述。1 T=0 协议的物理层描述终端与智能卡之间通过改变 I/O 传输线上的电平来交换信息。由于 T=0 协议是面向字符的传输协议,这里先定义字符帧的结构,并对组成字符帧位的信息表示作了具体描述。字符帧的结构如图 2 所示。字符帧由 1 个起始位 S、8 个数据位和 1 个偶校
3、验位 P 共 10 位组成。在数据传输中每一位的持续时间称为基本时间单元 etu(elementary time unit),etu 的值由时钟频率决定,etu与时钟频率呈现性关系:1etu=(F/D) (1/f) (1)其中 F 称为时钟频率转换因子,D 称为波特率调整因子。时钟频率的范围为1MHz 5MHz,正常的工作频率为 3.57MHz,数据传输的波特率采用 9600bps,根据国际标准的取值范围,取 F=372,D=1,代入式(1),可得:1etu=372/f=372 (2)即一个基本时间单元为 372 个时钟周期。将工作频率定为 3.57MHz,可以保证数据传输的波特率为 9600
4、bps。如果要提高数据的传输率,可以调整参数 F 来确定传输率。对每一位电平采用三次采样来确定,在位持续时间的中间和左右 15%的间隔各取样一次,取样点如图 3 所示。当有两次以上电平为低,则判断该位为 0;否则该位为 1,这样确保了取样值的可靠性。由于数据位的持续时间是用汇编语句来控制的,可以通过延时语句调整采样的时间间隔。但实现采样的最基本汇编语句的执行时间不能再缩短,因此数据传输率有一上限。当每一位取样三次时,数据传输率最高可达到 57600bps。如果再提高速率,取样时序将无法保证。字符帧的起始位为低电平,起始位的检测是通过周期性地对 I/O 传输线进行采样来得到。国际标准中规定采样时
5、间间隔不得大于 0.2etu,实际上起始位的采样时间间隔只有几个时钟周期,完全满足要求。2 T=0 协议的数据链路层实现数据链路层描述了字符交换的时序要求和差错控制以及终端对面向传输的错误的处理,在逻辑上保证终端和卡片之间能够正确可靠地通讯。采用上述的字符帧,终端与卡之间进行数据将交换,字符之间有严格的时序,时序是通过汇编程序语句的执行时间来控制的。从终端到卡发送的连续字符的起始位下降沿之间的最小时间间隔由复位应答信息通知终端,其值在 12etu266etu 之间。从卡发送到终端的连续字符的起始位下降沿之间的最小时间间隔应为 12etu。如果字符接收不正确或字符接收正确但校验位不正确,接收端需
6、要在字符起始位下降沿后的(10.50.2 个 etu 时刻将 I/O 线置为低电平约 12 个 etu,见图 4,用于向发送端指明错误;发送端在(110.2)个 etu 时刻检测 I/O 线。如为高电平则表示字符已经正确接收;如果发送端检测到错误,则在检测到错误那一刻起,2 个 etu 后重发该字符,但重复发送同一字符的次数不得超过 3 次。如果最后一次发送失败,当终端是接收端时,则终端应该在无效字符的起始位下降沿后的 960 个 etu 时间范围内启动释放序列;当终端是发送端时,在卡片检测到字符的偶校验错误后 960 个 etu 时间范围内,终端启动释放序列。命令的执行总是由终端应用层(TA
7、L)启动,通过终端传输层(TTL)送给卡片。TTL 与卡片进行命令字节和数据字节交换时,要保证能够有序正确地进行。因此,在数据交换过程中,在任何时刻 TTL 和卡片都应该隐含地知道哪一方是发送者,哪一方是接收者。当卡片接收到 5 个字节的命令字节后,需要向 TTL 返回一个过程字节或两个字节的状态字节,具体含义如表 1、表 2 所示。表 1 终端对过程字节的处理过程字节 TTL 执行的操作与 INS 字节相同 TTL 向卡片发送或从卡片接收所有数据INS 字节的补码 TTL 向卡片发送或从卡片接收下一个字节60 TTL 延长等待时间61 TTL 等待第二个过程字节xx并根据xx 发GET RE
8、SPONSE 命令取回数据6C TTL 等待第二个过程字节xx并根据xx 重发上一条命令表 2 卡返回的状态字节编码第一个状态字节值 TTL 执行的操作6或9x(除表 1 中的值外) TTL 等待第二个过程字节 SW2当返回的过程字节或状态字节均不是表中规定的值时,终端在接收到的无效字符的起始位降沿开始的 9600 个 etu 时间范围内启动释放序列。3 T=0 协议的终端传输层和应用层的实现数据链路层保证了 TTL 与卡片正常的数据交换。在此基础上,TTL 定义了命令和响应 APDU(Application Protocol Data Unit )通过 TTL 和卡片之间的数据传输机制,因此
9、该层协议定义了 APDU 到 TPDU(Transport Protocol Data Unit)的映射机制以及 TPDU 和卡片之间如何来完成数据的交换。根据命令和响应 APDU 包含的数据情况,共有四种不同的APDU, TTL 应能够对四种情况进行处理,完成终端和卡之间的数据交换。由于 T=0 协议的特殊性,终端传输层和应用层并没有完全隔离开。为了便于说明问题,先简要描述一下应用层,然后将终端传输层和应用层结合起来进行说明。应用层协议定义了 C-APDU 和 R-APDU 的具体结构。应用层之间的数据交换都是由一个命令- 响应对完成的,TAL 通过 TTL 将 C-APDU 送给集成电路卡
10、(ICC ),ICC 处理完后将处理结果组成 R-APDU 通过 TTL 送给 TAL。APDU 由命令报文和响应报文共同组成,根据 C-APDU 和 R-APDU 是否包含数据域,APDU 有四种情况,见表 3。表 3 APDU 包含数据的情况命令 APDU 数据域 响应 APDU 数据域1 无 无2 无 有3 有 无4 有 有C-APDU 由一个强制性的四字节命令头 CLA、INS、P1、P2 和一个可变长度的条件体组成。CLA 为命令类型字节;INS 为命令代码字节;P1 和 P2 为命令参数;条件体包括命令数据域长度字节 Lc,命令数据域和响应返回的最大长度字节 Le。根据不同的命令,
11、条件体的组成也不相同,C-APDU 有四种情况,见表 4。表 4 C-APDU 的结构情 况 C-APDU 结构1 CLA INS P1 P22 CLA INS P1 P2 Le3 CLA INS P1 P2 Lc Data4 CLA INS P1 P2 Lc Data LeR-APDU 由一个最大长度为 Le 的数据域和一个强制性的两字节状态代码组成,状态代码给出了 IC 卡对当前命令的处理结果。对于 C-APDU,终端先将其映射成 T=0 传输层的格式,然后通过 TTL 传送给卡片,卡片返回的数据和状态先返回给 TTL,再映射成 R-APDU 返回给 TAL。这里根据四种不同的情况,分析了
12、 C-APDU 到 C-TPDU 以及 R-APDU 到 R-TPDU 的映射方法,并对情况 2和情况 4 时,如何使用 GET RESPONSE 命令进行了说明。 C-APDU 到 C-TPDU 的映射根据命令的情况决定,卡片返回的数据和状态到 R-APDU 的映射要根据返回数据的长度来判断。对于卡片返回的过程字节“61xx”和“6Cxx”,将用于 TTL 和卡片之间进行数据交换,当卡片返回“61xx”时,表示命令没有结束,TTL 不将过程字节返回给 TAL,而是从 TTL 直接向卡片发出 GET RESPONSE 命令,取回上一条命令应该返回的数据。并返回给 TAL。当卡片返回“6Cxx”
13、 时,TTL 将根据“xx”的值调整并重发上一条命令。下面分别对四种命令情况进行分析。(1)当 C-APDU 和 R-APDU 均不含有数据时,将 C-APDU 的 CLA、INS、P1、P2 映射为 C-TPDU 的 CLA、INS、P1、P2 、C-TPDU 的 P3 置为 “00”,卡片接收到 C-TPDU 后,根据命令头决定该命令所含数据的情况。TTL 接收到卡片返回的状态后,该命令完成,TTL 将状态字节强制性地加到 R-APDU 的尾部。(2)当 C-APDU 不含有数据而 R-APDU 含有数据时,将 C-APDU 的CLA、INS 、P1 、P2、Le 映射为 C-TPDU 的
14、 CLA、INS、 P1、P2、P3,其中 P3 可以置为“00”,也可以置为需要返回的数据字节数,卡片接收到 C-TPDU 后,如果命令处理失败,卡片直接将状态代码通过 TTL 返回给 TAL;当命令能够正常处理时,如果 P3 指定的字节数能够正确返回,待卡片内部应用数据处理完成后,这时卡片首先返回给 TTL 该命令的过程字节,通知 TTL 准备接收卡片数据缓冲区中的数据,然后卡片直接将 P3 字节的数据和状态字节通过 TTL 返回给 TAL,否则,卡片只将过程字节“6Cxx”或“61xx” 返回给 TTL 这一层。当过程字节为“6Cxx” 时, TTL 根据 xx 重发命令取回数据,当过程
15、字节为“61xx”时,TTL 发 GET RESPONSE 命令取回数据。(3)当 C-APDU 含有数据而 R-APDU 不含数据时,将 C-APDU 的CLA、INS 、P1 、PS、Lc 映射为 C-TPDU 的 CLA、INS、P1、P2、P3,待卡片对 C-TPDU检查通过后,卡片直接将过程字节返回给 TTL,TTL 根据返回的过程字节继续向卡片发送P3 字节的后续数据。待数据接收完后,卡片对应用数据进行处理,然后将处理结果以状态字节的方式通过 TTL 返回给 TAL。(4)当 C-APDU 和 R-APDU 均含有数据时,将 C-APDU 的 CLA、P1、P2、Lc 映射为 C-
16、TPDU 的 CLA、INS,P1、P2 、P3,待卡片对 C-TPDU 检查通过后,卡片直接将过程字节返回给 TTL,TTL 根据返回的过程字节继续向卡片发送 P3 字节的后续数据。待数据接收完后,卡片对应用数据进行处理,如果命令处理失败,卡片直接将状态代码返回给TTL。当命令正常处理时,卡片返回给 TTL 过程字节“6Cxx”或“61xx”,当为“6Cxx” 时,TTL 根据 xx 重发命令取回数据。当过程字节为“61xx”时, TTL 发 GET RESPONSE 命令取回数据。(1)由于 T=0 协议字符级检错重发,与面向块的传输协议 T=1 相比,在出现传输错误时,T=0 协议可以不必整个数据报文全部重发,节省了时间。(2)在编程过程中,对位帧进行采样时,采用了三次采样判决的方式,避免了由于采样时的偶然误差而造成误码。(3)T=0 协议是应用于智能卡中的第一个接触式通讯协议,但该协议并没有考虑传输中断和检测到传输错误码后卡和读写器的再同步问题。唯一的检错机制就是奇偶位校验。