表2 卡返回的状态字节编码
| 第一个状态字节值 | TTL执行的操作 |
| '6'或'9x'(除表1中的值外) | TTL等待第二个过程字节SW2 |
3 T=0协议的终端传输层和应用层的实现 数据链路层保证了TTL与卡片正常的数据交换。在此基础上,TTL定义了命令和响应APDU(Application Protocol Data Unit)通过TTL和卡片之间的数据传输机制,因此该层协议定义了APDU到TPDU(Transport Protocol Data Unit)的映射机制以及TPDU和卡片之间如何来完成数据的交换。根据命令和响应APDU包含的数据情况,共有四种不同的APDU,TTL应能够对四种情况进行处理,完成终端和卡之间的数据交换。由于T=0协议的特殊性,终端传输层和应用层并没有完全隔离开。为了便于说明问题,先简要描述一下应用层,然后将终端传输层和应用层结合起来进行说明。应用层协议定义了C-APDU和R-APDU的具体结构。应用层之间的数据交换都是由一个命令-响应对完成的,TAL通过TTL将C-APDU送给集成电路卡(ICC),ICC处理完后将处理结果组成R-APDU通过TTL送给TAL。APDU由命令报文和响应报文共同组成,根据C-APDU和R-APDU是否包含数据域,APDU有四种情况,见表3。
表3 APDU包含数据的情况
| 命令APDU数据域 | 响应APDU数据域 | |
| 1 | 无 | 无 |
| 2 | 无 | 有 |
| 3 | 有 | 无 |
| 4 | 有 | 有 |
表4 C-APDU的结构
| 情 况 | C-APDU结构 |
| 1 | CLA INS P1 P2 |
| 2 | CLA INS P1 P2 Le |
| 3 | CLA INS P1 P2 Lc Data |
| 4 | CLA INS P1 P2 Lc Data Le |
将C-APDU的CLA、INS、P1、P2、Le映射为C-TPDU的CLA、INS、P1、P2、P3,其中P3可以置为“00”,也可以置为需要返回的数据字节数,卡片接收到C-TPDU后,如果命令处理失败,卡片直接将状态代码通过TTL返回给TAL;当命令能够正常处理时,如果P3指定的字节数能够正确返回,待卡片内部应用数据处理完成后,这时卡片首先返回给TTL该命令的过程字节,通知TTL准备接收卡片数据缓冲区中的数据,然后卡片直接将P3字节的数据和状态字节通过TTL返回给TAL,否则,卡片只将过程字节“6Cxx”或“61xx”返回给TTL这一层。当过程字节为“6Cxx”时,TTL根据xx重发命令取回数据,当过程字节为“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-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协议是应用于智能卡中的第一个接触式通讯协议,但该协议并没有考虑传输中断和检测到传输错误码后卡和读写器的再同步问题。唯一的检错机制就是奇偶位校验。对错误的处理就是对出错的字节重新发送一次,这样极有可能导致无限次的循环状态。(4)T=0协议并没有与应用层完全分割开,应用层的命令解释器必须告诉传输层当前命令是接收还是发送数据。由于这个原因,这两个模块在命令处理过程中需要交互操作,在程序中能够提取出一个通用的传输层,供应用层调用来负责完成数据的传输。这种情况给编程和调试带来了不便。同时造成模块的可重用性较差。
(5)对于命令报文中包含数据域,同时又需要卡片返回数据的命令,T=0协议不能用一条命令来实现,必须分为两步实现:第一条命令为卡片提供数据,然后用另外一条相关的命令来取回数据。这样给卡片的编程带来很大麻烦,同时卡片内存中必须保留上一次操作需要返回的数据。这时如果不及时发送取数据命令而发送其它命令,可能会将敏感数据泄漏,并产生其它问题。这些都是T=0协议考虑不周的地方。(6)终端传输层需要根据卡片返回的子程字节和状态字节执行相应的操作,使终端对数据的处理复杂化。(7)由于目前大多数接触式终端只支持T=0通讯协议,因此该协议仍将得到广泛的应用。随着智能卡芯片功能的增强,对于数据传输量较大的应用,该协议将不再适用,面向块的异步半双工接触式传输协议T=1将体现出优势。
始终处于主动地位,终端向卡发送符合T=0协议的命令字节,卡中的COS完成对数据的处理并将处理结果返回给终端。下面对T=0协议的四个层次进行详述。
采用上述的字符帧,终端与卡之间进行数据将交换,字符之间有严格的时序,时序是通过汇编程序语句的执行时间来控制的。从终端到卡发送的连续字符的起始位下降沿之间的最小时间间隔由复位应答信息通知终端,其值在12etu~266etu之间。从卡发送到终端的连续字符的起始位下降沿之间的最小时间间隔应为12etu。如果字符接收不正确或字符接收正确但校验位不正确,接收端需要在字符起始位下降沿后的(10.5±0.2个etu时刻将I/O线置为低电平约1~2个etu,见图4,用于向发送端指明错误;发送端在(11±0.2)个etu时刻检测I/O线。如为高电平则表示字符已经正确接收;如果发送端检测到错误,则在检测到错误那一刻起,2个etu后重发该字符,但重复发送同一字符的次数不得超过3次。如果最后一次发送失败,当终端是接收端时,则终端应该在无效字符的起始位下降沿后的960个etu时间范围内启动释放序列;当终端是发送端时,在卡片检测到字符的偶校验错误后960个etu时间范围内,终端启动释放序列。命令的执行总是由终端应用层(TAL)启动,通过终端传输层(TTL)送给卡片。TTL与卡片进行命令字节和数据字节交换时,要保证能够有序正确地进行。因此,在数据交换过程中,在任何时刻TTL和卡片都应该隐含地知道哪一方是发送者,哪一方是接收者。当卡片接收到5个字节的命令字节后,需要向TTL返回一个过程字节或两个字节的状态字节,具体含义如表1、表2所示。