IC卡的传输协议

在异步半双工传输协议中,主要定义了终端为实现传输控制和特殊需要发出的命令及这些命令的处理过程。

    在传输协议中定义了两种协议:字符传输协议(T=0)和块传输协议(T=1)。IC卡可以选择支持T=0协议或者T=1协议,终端一般都支持这两种协议。在ATR中的TD1规定了后续传输中所采用的传输协议(T=0或T=1),如果TD1在ATR中不存在的话则假定采用T=0。如果在ATR之后卡片与终端之间没有参数协商的PTS过程的话(详细细节可参考ISO7816相关部分),由IC卡指定的协议将在复位应答之后立即被采用。

    传输协议按照如下的模型进行定义。

  * 物理层
    定义了位交换,是两种协议的公共部分。

  * 数据链路层
    包括如下定义:
    字符帧,定义了字符交换,是两种协议的公共部分;
    T=0时的字符交换
    对T=0的检错纠错
    T=1时的块交换
    对T=1的检错纠错

  * 传输层
    定义了针对每个协议的面向应用的报文传输。

  * 应用层
    根据相同的应用协议,定义了报文交换的内容。

1、物理层

    在T=0和T=1协议中,均使用了物理层和字符帧。

2、数据链路层

2.1 字符帧 

    详见http://www.iccos.cn/scoscn/html/dev/2007-10-25dev44.html,适用于IC卡和终端之间所有的报文交换。

2.2 字符协议T=0

  (1)特定选项--用于T=0的时段分配

    在复位应答中,ATR中的TC1值决定了终端发送到IC卡的两个连续字符起始位上升沿之间的最小时间间隔在12~266个etu之间。

    IC卡发送到终端的两个连续字符起始位上升沿之间的最小时间间隔为12etu。

    在IC卡发送的任意字符的起始位上升沿与IC卡或终端发送的前一个字符的起始位上升沿之间的最大时间间隔(工作等待时间)将不超过960×D×WI=9600个etu(设位速率转换因子D为默认值,WI为默认值10)。

    相反方向发送的两个连续字符的起始位上升沿之间的最小时间间隔不小于16etu。

    要特别注意的是,由终端向IC卡发送的两个连续字符起始位上升沿之间的最小时间间隔由TC1值控制,可以小于相对发送的两个连续字符之间所允许的最小时间间隔(16个etu)。

  (2)命令头

    命令由终端应用层(Terminal Application Layer,简称TAL)发出,它包括一个由5Byte组成的命令头。每个命令头由5个连续字节CLA、INS、P1、P2和P3组成。

   * CLA(Class Byte of the Command Message)表示命令类别。
   * INS(Instruction Byte of the Command Message)表示指令代码。
   * P1(Parameter 1)和P2(Parameter 2)表示命令的两个附加参数。
   * 根据不同的INS,P3(Parameter 3)指明了发送给IC卡的命令的字节长度或者期待IC卡回送响应的最大数据长度。

    对于T=0,这些字节和通过命令发送的数据一起构成命令传输协议数据单元(Command Transport Protocol Data Unit,简称C-TPDU),命令应用协议数据单元(Command Application Protocol Data Unit,简称C-APDU)到C-TPDU的映射将在后续文章中学习。

    终端传输层(Terminal Transport Layer,简称TTL)传送发送5Byte的命令头给IC卡并等待一个过程字节。

  (3)过程字节

    IC卡接收到命令头以后,向TTL回送一个过程字节。过程字节向TTL指明了下一步该做什么,其编码与TTL行为的对应关系如下所示:

    终端对过程字节的响应:

         过程字节值                  步骤
     1  与INS字节值相同            所有余下的数据将要由TTL传送或者准备接收所有来自IC卡的数据。
     2  与INS字节值的补码相同      下一个数据字节将由TTL传送或者准备接收来自IC卡的下一下数据字节。
     3  0x60                       TTL提供根据额外的工作等待时间。
     4  0x6X或者0x9X(除0x60以外) TTL将等待下一个过程字节或者状态码SW2。

    在情况1、2、3中,操作完成后TTL将等待另一个过程字节。

    在情况4中,第二个过程字节或状态码SW2已被收到后,TTL将要做如下事情。

   * 如果过程字节为0x61,TTL将向IC卡发送一个最大长度为0xXX的Get Response命令头,XX为SW2值。
   * 如果过程字节为0x6C,TTL将立即向IC卡重发一个命令的命令头,其长度为XX,XX是SW2的值。
   * 如果过程字节为0x6X(除0x60、0x61、0x6C以外)或者0x9X(即状态),TTL将在响应APDU中向TAL回送状态码,并等待下一个C-APDU。

    TTL与IC卡之间交换命令和数据时,TTL和IC卡必须清楚地知道数据流向和I/O的驱动者,即是终端向IC卡发送数据还是IC卡向终端发送数据。

  (4)C-APDU的传输

    采用T=0协议时,只包含送向IC卡的命令数据或只包含IC卡响应数据的C-APDU,可直接映射到C-TPDU。不包含不回送数据的C-APDU,以及要求IC卡接收数据和发送给IC卡数据的C-APDU将通过相关的传输规则进行传输。

2.3 T="0时的错误检测与纠错"

    若字符没有正确地接收到或者接收正确但校验不正确,接收方应在字符起始位的上升沿脉冲之后的(10.5±0.2)个etu内,向I/O端口发送持续时间为1~2个etu的低电平信号,表示前面的传输中有错误发生。

    相应的,发送方应该在字符起始位上升沿脉冲发出后的(11±0.2)个etu内,检测I/O端口的电平状态,此时若I/O端口为高电平状态,则表明字符已经被正确接收。

    若发送方检测到错误,就应在检测出错误以后至少延迟2个etu,并重复发送一次有错误嫌疑的字符,最多只发送3次。

2.4 块传输协议T=1

    T=1协议中,在TAL和IC卡之间传送的命令、R-APDU和传输控制信息(例如确认信息)由块组成。

    以下定义了数据链路层的块帧结构、协议的特殊选项和协议操作(包括错误处理)。

  (1)块帧结构

    字符帧的定义同前文的描述。T=1协议下,无须进行逐个字符的检验。块的结构如下所示,包括头域、数据域和尾域3个部分,都为可选项。

  ● 头域包括3个必选字节:
        *用于标识数据块的源地址和目的地址以及提供VPP状态控制的1Byte节点地址(NAD)
        *控制数据传输的1Byte协议控制字节(PCB)
        *1Byte可选的数据域长度(LEN)
     
   > 节点地址(NAD)
   
    节点地址(Node Address,简称NAD)第1至第3位表明块的源节点地址(Source Address,简称SAD),而第5至第7位表明块的目的地址(Destination Address,简称DAD),第4位和第8位不用,设定为0。

    终端使用的节点地址是可选的,但支持T=1协议的IC卡应支持按本节规定的节点地址方式。遵守如下规则。

   * 若不使用节点地址,终端发往IC卡的第一个数据块的SAD和DAD值均应设为0。

   * 若使用节点地址,由终端发送到IC卡的第一个数据块的SAD和DAD应设为不同的值(其中之一可以为0)。

   * 若使用节点地址,在卡片操作过程中,IC卡收到的第一个有效I块和S块中的NAD,用于建立起整个卡片操作过程中的终端和IC卡的节点地址,在同一个过程中终端发送给IC卡的后续块使用同一个NAD,如此建立的节点地址适用于所有类型的块。

   * 在卡片操作期间,从IC卡发往终端的任何数据块都将使用在此过程中由终端向IC卡发出的第一个块时所建立起的节点地址(终端发往IC卡和由IC卡发往终端所使用的源地址和目标地址正好相反)。

   * 在卡片操作过程中,若IC卡接收到的数据块的NAD与交易开始时所建立的NAD不同,则IC卡应向交易开始所建立的DAD回复一个R块。

   > 协议控制字节

    协议控制字节(Protocol Control Byte,简称PCB)表明了传输块类型,有以下3种类型。

   * 传送APDU的信息块(I块)。
   * 用于传送确认ACK(Acknowledgment)或者NAK(Negative Acknowledge)的接收就绪块(R块)。
   * 用于交换控制信息的管理模块(S块)。

   不同类型PCB具有不同的编码格式。

                  I块的PCB编码
        字节位                      含义

         b8                          0
         b7                          序列号
         b6                          链接(多个数据)
         b5~b1                      保留

                  R块的PCB编码
        字节位                      含义

         b8                          1
         b7                          0
         b6                          0
         b5                          序列号
         b4~b1                      0=容错 1=EDC或者校验出错 2=其他错误 其他:保留

                  S块的PCB编码
        字节位                      含义

         b8                          1
         b7                          1
         b6                          0=请求 1=应答
         b5~b1                      0=在同步请求 1=信息域大小请求 2=放弃请求 3=BWT扩展请求 4=VPP错误 其他:保留

  > 长度

    长度(Length,简称LEN)指明块的INF部分的长度,取值范围从1~254。

  ● 数据域包括:0~254Byte的APDU或控制信息(INF)
    
    信息域INF是有条件的,当出现在I块中时,它传送的是应用数据,当出现在S块中时,它传送的是控制信息。R块不会出现在IINF中。

  ● 尾域包括:1Byte的错误校验码(EDC)

    尾域包含所传送块的错误检测代码(Error Detection Code,简称EDC),校验出错和(或)EDC出错时,块是无效的。通常采用冗余校验(Longitudinal Redundancy Check,简称LRC)作为EDC。LRC的长度是1Byte,其值由以NAD开始到INF(如果存在的话)的全部字节做异或运算得到。

  ● 块编号
    I块采用在某一位上模2数字编码的方式进行编码,IC卡和终端作为发送方分别处理各自的编号系统。复位应答后,发送方发送的第一个I块的编号为零,以后每发送一个I块,编号值增加1。当再次同步时,发送方将编号值复位为零。

    R块采用在某一位上模2数字编码的方式进行编号,当其在链接过程中,用来确认I块时,R块携带下一个期望的I块编号。当要求某块重发时,R块内携带的是已收到的I块编号。

    S块不携带编号。

  (2)特殊选项

    本节定义了用于T=1传输协议的信息域大小和时段。

    * 信息域大小

    IFSC是指IC卡能收到的信息域的最大长度,其定义为:在复位应答期间,IC卡在TA3中回送的IFSI指明了IC卡能够容纳的IFSI的大小,IFSI的取值范围是0x10~0xFE,对应的IFSC大小为16~254Byte。因此IC卡能收到的最大数据长度是(IFSI+3+1)Byte,其中包括头域和尾域。复位应答期间建立起来的这个值在整个卡片操作过程中使用,或持续到由于IC卡向终端发送S块(IFS请求)而取得新的IFSC值为止。

    终端报文域大小(Information Field Size for the Terminal,简称IFSD)是指终端能够接收到数据块的最大长度,紧接在复位应答后的初始大小为32Byte。该长度适用于整个卡片操作过程或者持续到由于终端向IC卡发送S块(IFS请求)而取得新的IFSC值为止。

    为避免IC卡和终端之间的通信缓慢,通常终端支持254Byte的IFSD。

   *T=1协议的时段

    终端发往IC卡的两个连续字符的起始位上升沿之间最短时间间隔为11~266个etu,由复位应答后回送的TC1值决定。

    由IC卡发往终端的两个字符的起始位上升沿之间最短时间间隔应是11个etu。同一块中两个连续字符起始位上升沿之间的最大时间间隔CWT不应超过(2的CWT次方+11)个etu,其中字节等待时间整数CWI取值在0~5之间,CWT的取值在12~43个etu。

    终端发送给IC卡的最后一个字符的起始位上升沿与由IC卡发出的第一个字符起始位上升沿之间的最大时间间隔BWT不应超过[(2的CWT次方×960)+11]个etu。块等待时间整数BWI的取值范围是0~4,所以BWT的取值范围为971~15371个etu。

    相反方向传输的两个连续字符的起始位上升沿之间最小时间间隔(块保护时间Block Guard Time,简称BGT)为22个etu。

(3)容错操作

    先来看一下容错的规则定义。

   * 复位应答后,第一个数据块是由终端发往IC卡的,而且只能是一个I块或S块。
   
   * 若终端不希望使用长度为32Byte的IFSD初始值,则应向IC卡发送一个S块(IFS请求),S块(IFS请求)的PCB应具有值CI以表明是一个改变IFSD的请求。INF域包含一个字节,其值表示在所要求的IFSD的字节数,取值为0x20-0xFE。IC卡应向终端回送一个S块(IFS响应),确认终端更改IFSD的大小,其中S块(
IFS响应)的PCB应为0xE1,INF域应具有与请求改变S块的INF域相同的值。

   * 若IC卡希望改变在复位应答后制定的IFSC的大小,应向终端发送一个S块(IFS请求),S块(IFS请求)的PCB应具有值CI以表明是一个改变IFSD的请求。INF域包含一个字节,其值表示在所要求的IFSD的字节数,取值为0x10-0xFE。终端应向IC卡回送一个S块(IFS响应),确认终端更改IFSD的大小,其中S块(
IFS响应)的PCB应为0xE1,INF域应具有与请求改变S块的INF域相同的值。

   * 若要改变节点地址,由终端发出的第一个SAD和DAD将被设定为整个卡片操作过程中要使用的值。若不采用节点地址,则将其设为零。

   * 卡片操作过程中,只有满足以上定义的块才能相互传送。半双工块传输协议包含了终端和IC卡之间传送的情况。当发送方传送完一个完整的数据块后,就应切换到接收状态。

   * 当接收方所收到的字符数与LEN和EDC的值一致时,接收方取得发送权。

   * 若接收方需要确认由发送方传来的I块,则应在回送给发送方的I块序列号中指明。若使用链接,则在R块的序列号中指明(链接的最后一个数据块除外)。

   * 若响应中收到的I块序列号与前一个已收到的I块序列号不同,发送方即可认为I块已被确认。若前面没有收到过I块,响应中的I块序列号应该是0。

   * 在链接情况下,当响应中收到的R块的序列号与已确认的I块序列号不同时,发送方即可认为I块已被确认。

   * 若IC卡需要比BWT长的时间来处理已收到的I块,则应发送一个等待时间扩展请求S块(WTX请求),其中之一的INF域包含有1Byte的二进制整数,其值为所请求的BWT值的倍数。终端应发送一个INF中具有相同值的等待时间扩展请求S块(WTX响应),以表示对延时请求的确认。取得的时间从S块(WTX响应)的最后一个字符的上升沿开始算起。

   * S块总是配对使用的,一个S请求总是对应一个S响应块。

    如果出现不满足以上定义的情况,则终端和IC卡将检测到错误。

(4)链接

    当发送方需要传送的数据长度超过IFSC和IFSD所定义的字符数时,就要将其分成几个连续的I块。传送多个I块数据时,使用链接功能。

    I块的链接由PCB的b6位编码定义。
    b6=0表示是块链的最后一块
    b6=1表示后面还有后续的数据块

    由此可知,b6=1的任何一个I块都需要被一个R块确认。

    如果接收正确,对应b6=0的链上的最后一个数据块会被一个I块确认。否则,就会被一个R块确认。

    * 链接规则
  
    IC卡和TTL都支持链接,链接只能沿一个方向进行,其规则如下。

    a.当终端是接收方时,只要来自IC卡的每个块的长度不大于IFSD字节,终端应能够接收一组链接的I块。

    b.当终端是接收方时,如果IC卡发送的I块的长度大于IFSD,终端应通过发送一个R块来表示拒绝,R块的PCB的b1~b4位的值为2。

    c.当IC卡为接收方时,只要来自终端的每个块的长度不大于IFSD字节,IC卡应能够接收一组链接的I块。

    d.当IC卡是接收方时,如果终端发送的I块的长度大于IFSD,IC卡应通过发送一个R块来表示拒绝,R块的PCB的b1~b4位的值为2。

    e.当IC卡是发送方时,IC卡应能发送每个块长度不大于IFSD字节的链接I块。

    f.当终端是发送方时,终端应能发送每个块长度不大于IFSD字节的链接I块。

    * 链接块的构造

    C-APDU包含在I块的INF域中,并从TTL传送到IC卡。如果一个C-APDU因太长而不能放在一个数据块中时,可以通过如下的方法用几个链接块传送。

    Block (1) 
             CLA  INS  P1  P2  LC  Data  Data 
    Block (2)- Block (n-1)
             Data   Data   Data 
    Block (n) 
             Data   Data   Data    LC 

    如果由 IC 卡回送的数据和状态码因太长而不能放在一个块中,可以按照下述方法通过几个I块来处理。 

    Block (1)- Block (n-1)
             Data   Data   Data 
    Block (n) 
             Data   Data   Data    SW1  SW2

    示例只是针对命令一种情况,仅显示链接块的 INF 域。每个块还有一个头域和一个尾域。如果IC卡是发送方,全部链接块都应包含一个长度范围1到IFSD字节的INF域。如果终端是发送方,则包含一个长度范围1到IFSC字节的INF域。

2.5 T="1协议的错误检测与纠错"

    TTL应能检测以下错误:

    * 传输错误(非法的奇偶校验和EDC错误)或BWT超时; 
    * 同步失调(字符数目的超出或不足); 
    * 协议错误; 
    * 终止链接块请求。

    按照下述方法进行错误恢复:

    方法1:TTL以下列的次序按照下述技术方法进行纠错。

    * 块的重发; 
    * 使IC卡触点处于静止状态。

    方法2:IC卡以下列的次序按照下述技术方法进行纠错。

    * 块的重发; 
    * 处于不响应状态。

    错误处理和更正要满足如下规则。在任意一种情况下,当发送一个R块时,低半字节必须按照定义给定一个合适的值。

    a.当IC卡在复位应答后接收到的第一个块无效时,就应回送一个R块给TTL,并置b5=0和NAD=0。

    b.如果TTL发送的任何块在BWT时间内没有得到IC卡的响应,TTL将通过使IC卡的触点处于静止状态来结束卡片操作过程。

    c.如果响应I块的无效块被收到,发送方应发送一个R块,其中的b5位设为期望I块的编号。

    d. 如果响应R块的无效块被收到,发送方应重发R块。

    e.如果响应 S 块(XX请求)的 S(XX响应)块没有收到,发送方应重发一个 S(XX请求)块。

    f.如果响应 S(XX响应)块的应答中收到无效块,发送方应发出一个 R 块,b5 位设为下一个期望I块的编号。

    g.如果TTL连续三次发送一个块,或IC卡连续两次发送一个块,而没有得到一个有效的响应,TTL将通过使IC卡的触点处于静止状态来结束卡片操作过程。如果对于某些终端需要支持同步,它可以在结束卡片操作过程前通过发送一个S块(再同步请求)从IC卡获得一个有效的响应S块(再请求响应)来实现同步。

    h.在传输前,如接收方检测到传输不足或超出时,应等待一段时间(取 CWT 和BWT的最大值)。

    i. IC卡最多连续三次发送一个S(IFS请求)块,以便从TTL上得到一个有效的S(IFS响应)块。三次尝试失败后,IC卡即进入接收状态。

    j. TTL 一般主动发送一个 S(放弃请求)块。如果 TTL 从 IC 卡收到一个 S(放弃请求)块,TTL将通过使IC卡的触点处于静止状态来结束卡片操作过程。

    特别注意,在具体的应用中,不一定要求终端和IC卡支持交易中止功能。如果终端或IC卡需要交易中止的话,可以通过发送一个S块(放弃请求)来进行,此时,如果接收方不支持交易中止功能的话,可能会收到一个无效的响应,但终端将仍然结束卡片的操作过程。

3、终端传输层 
    
    本节描述了在终端和 IC 卡之间传输的命令和响应 APDU 的机制。APDU 是命令或响应报文。由于命令和响应报文都可以包含数据,TTL应能处理应用层定义的4种命令格式。C-APDU和R-APDU的组成在应用层描述。

    TAL传送C-APDU到TTL。在发送到IC卡之前,应将其变换成传输协议认可的形式。IC卡处理完命令后,以R-APDU的格式将数据(如果存在的话)和状态码回送给TTL。

  3.1 T="0协议下" APDU的传送 
    
    本节描述了 C-APDU 和 R-APDU 的映射方式,TTL 和 IC 卡之间的数据交换机制以及在命令情况2或4中如何使用GET RESPONSE命令取回IC卡的数据。

  (1)C-APDU和 R-APDU的映射方式和数据交换

    如何将 C-APDU 映射到 T="0" 命令头取决于命令情况。如何将 IC 卡回送的数据(如果存在)和状态码映射到R-APDU的形式取决于回送数据的长度。

    由IC卡回送的过程字节SW1 SW2=’61xx’和SW1 SW2=’6Cxx’用来控制IC卡和TTL之间的数据交换,它不会回送给 TAL。过程字节 SW1 SW2=’61xx’或 SW1 SW2=’6Cxx’表示命
令在IC卡中的处理没有完成。

    如果 IC 卡回送给 TTL 的状态码是 SW1 SW2=’9000’,表示正常完成了命令的处理。任何其它的状态码都表明 IC 卡中断了命令的处理,处理失败的原因在状态码中指出。TTL 收到来自 IC 卡的任何状态码(但不包括过程字节’61xx’和’6Cxx’)时,都结束命令的处理,不论是正常、警告还是错误情况。

    以下描述的是将IC卡回送的数据和状态字节构造成R-APDU格式的方法,仅适用于IC 卡已成功完成了命令处理或全部数据(如果存在)在过程字节’61xx’和’6Cxx’的控制下已被IC卡返回的情况。INS、INS和’60’过程字节的详细使用在此不作描述。

   a.情况1 
   
    C-APDU头映射到T=0命令头的前四个字节,T=0命令头的P3置为’00’。

   交换流程如下:

    * TTL发送T=0的命令头到IC卡; 
    * IC卡回送状态码给TTL。

    完成命令处理后,由IC卡向TTL回送的状态码原样映射到R-APDU必备的尾域。

    注:IC卡应分析T=0命令头,判断是命令情况1还是命令情况2在请求最大长度的响应数据。

   b. 情况2 

    C-APDU 头被映射到 T="0" 命令头的前四个字节,长度字节’Le’从 C-APDU 的条件体被映射到T=0命令头的P3。

    交换流程如下:

    * TTL发送T=0的命令头到IC卡。 
    * 在过程字节的控制下,IC 卡向 TTL 回送数据和状态(在非正常处理时只返回状态)。

    完成命令处理后,由 IC 卡向 TTL 回送的数据(如果存在)和状态按照下述方法映射到R-APDU:

   (i) 如果Le≥Licc,回送数据被映射到R-TPDU的条件体,返回的状态无变化地被映射到R-APDU必备的尾域。 
   (ii) 如果Le<Licc,回送数据的前Le字节被映射到R-TPDU的条件体中,返回的状态无变化地被映射到R-APDU必备的尾域。

   c. 情况3 

    C-APDU头被映射到T=0命令头的前四个字节,C-APDU条件体的长度字节’Lc’被映射到T=0命令头的P3。

    交换流程如下:

    * TTL发送T=0的命令头到IC卡。

    * 如果 IC 卡回送一个过程字节而不是状态码,则在此过程字节的控制下,TTL向IC卡发送C-APDU条件体的部分数据。如果IC卡回送状态码SW1 SW2,TTL将中断命令处理过程。

    * 如果处理过程没有在步骤2处中断,则IC卡返回命令处理结束后的状态。

    IC卡完成命令处理后回送给TTL的状态码,或由IC卡返回的引起TTL中断命令处理的状态码,都不加改变地映射到R-APDU。

   d. 情况4 

    C-APDU头被映射到T=0命令头的前四个字节,C-APDU条件体的长度字节’Lc’被映射到T=0命令头的P3。

    交换流程如下:

    * TTL发送T=0命令头到IC卡。

    * 如果IC卡回送一个过程字节而不是状态码,则在此过程字节控制下,TTL给IC 卡发送 C-APDU 条件体的部分数据。如果 IC 卡回送状态码 SW1 SW2,TTL将中断命令处理过程。

    * 如果处理过程在步骤2中没有中断,IC卡应回送过程字节’61xx’给TTL,请求TTL发出GET RESPONSE命令从IC卡取回数据。在命令处理的这个阶段中,IC卡不应回送状态码SW1 SW2=‘9000’。TTL应发送GET RESPONSE命令到IC卡取回提及的数据,小于或等于IC卡回送的过程字节’61xx’中的’xx’字节值的数据指定为GET RESPONSE命令的长度字节。这样,GET RESPONSE命令可以同情况2的命令一样处理。在过程字节控制下,IC卡向TTL回送数据和状态码(或在非正常处理情况下,只有状态码)。

    完成命令处理后,IC 卡回送给 TTL 的数据(如果存在)和状态码,或仅是引起 TTL终止命令处理过程的状态码,按照下述规则映射到R-APDU:

   (i)如果 Le≥Licc,回送的数据被映射到 R-TPDU 的条件体,返回的状态不做改变地被映射到R-APDU必备的尾域。 
   (ii)如果 Le<Licc,回送数据的前 Le 个字节被映射到 R-TPDU 的条件体,返回的状态不做改变地被映射到R-APDU必备的尾域。 



   (2) 过程字节’61xx’和’6Cxx’的使用 

    由IC卡回送到TTL的过程字节’61xx’和’6Cxx’指明了TTL取回当前正在处理的命令请求数据的方式。在T=0协议下,这些过程字节仅仅用在命令情况2和4中。

    过程字节’61xx’通知TTL发出GET RESPONSE命令到IC卡。GET RESPONSE命令头的P3置为≤’xx’。

    过程字节’6Cxx’通知TTL立即重发前条命令,同时命令头置为P3=‘xx’。

    命令情况2和4在容错处理过程中,使用过程字节的规定如下。在发生错误时,IC卡回送错误或警告状态码而不是’61xx’或’6Cxx’。

   a. 命令情况 2 

    如果IC卡收到一个命令情况2的头并且Le≠Licc,应回送过程字节’6CLicc’(或状态码指出一个警告或错误情况,而非 SW1 SW2=‘9000’)通知 TTL 立即重发 P3=Licc 的命令头。

    如果 IC 卡收到命令情况 2 的头并且 Le="Licc",IC 卡在过程字节控制下或者回送请求的数据和相关状态码,或者回送过程字节’61xx’(或表明警告或错误情况的状态码,而非SW1 SW2=‘9000’)通知TTL按最大长度’xx’发出GET RESPONSE命令。

   b. 命令情况 4 

    如果IC卡收到一个命令情况4的命令,处理完随C-APDU一同发送来的数据之后,应回送过程字节’61xx’,(或表明警告或错误情况的状态码,而非 SW1 SW2=‘9000’)通知TTL按最大长度’xx’发出GET RESPONSE命令。

   (3) GET RESPONSE命令 

    TTL发出GET RESPONSE命令,是为了从IC卡取得对应于命令情况2和4的C-APDU的Le字节的数据。GET RESPONSE仅适用于T=0协议类型。 

    命令报文的结构如下:

        字节          值  
        CLA         ‘00’ 
        INS         ‘C0’ 
         P1         ‘00’ 
         P2         ‘00’ 
         Le           预期数据的最大长度 

    正常处理结束后,IC卡回送状态码SW1 SW2=‘9000’和Licc字节的数据。

   在错误情况发生时,错误状态码(SW1 SW2)的编码如下:

        SW1         SW2       含义  
          ‘64’       ‘00’     GET RESPONSE失败 
          ‘67’       ‘00’     域长度错误 
          ‘6A’       ‘86’     P1 P2≠’00’ 

  3.2 T="1协议下" APDU的传送 

    C-APDU 从 TAL 传送到 TTL,TTL 将其不加变化地映射到 C-APDU 的一个 I 块的 INF域中,然后把这个I块发送到IC卡。IC卡在I块的INF域中向TTL回送响应数据(如果存在)和状态码,I块的INF域的内容不加变化地被映射到R-APDU,然后返回给TAL。

    如果有必要,C-APDU和响应数据/状态码可以分成多个数据块的INF域的链接。

  4、应用层 

    应用协议由TAL和TTL之间一组有序的数据交换组成,本节的后续部分定义了应用协议。

    应用层交换的每一步由命令响应对组成,其中 TAL 通过 TTL 给 IC 卡发送命令,IC卡处理该命令后通过TTL返回一个响应给TAL。每一个特定的命令都与一个特定的响应相匹配。一个APDU就是一个命令报文或一个响应报文。 命令报文和响应报文都可以包含数据,传输协议通过TTL来管理四种命令情况的情 况,如下所示:

           APDU中数据存在的情况:

       情况     命令数据     响应数据 

         1           无         无 
         2           无         有 
         3           有          无 
         4           有         有 

    需要注意的是,应用层中有一种特殊的报文叫安全报文,它在原有命令的基础上添加了安全数据MAC,所以安全报文传送总有数据要送往IC卡,因此仅适用于命令情况3和4的情况。当使用安全报文传送时,情况1的命令就变为情况3,情况2的命令就变为情况4。 

  4.1  C-APDU 

    C-APDU 包含一个必备的连续四字节的命令头,用 CLA、INS、P1 和 P2 表示,同时包括一个可变长度的条件体。

    命令头定义如下:

    * CLA:指令类型,1Byte;除’FF’外可赋任何值。 
    * INS:指令类型的指令码,1Byte。只有在低半字节为0,且高半字节既不是‘6’也不是’9’时,INS才有效。 
    * P1 P2:参数字节,分别1Byte,根据不同的INS来定义。 


    条件体定义如下:

    * Lc 占一个字节,定义了在 C-APDU 中发送数据的字节数。Lc 的取值范围从 1到255。 
    * Le 占一个字节,指出 R-APDU 中期望返回的最大字节数。Le 的取值范围从 0到255;如果Le=0,期望返回数据的字节数的最大长度是256。 

    可能的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 

   4.2  R-APDU

    R-APDU 是一串字节,这一串字节由一个条件体以及必备的两字节状态码 SW1 SW2组成。条件体是一串数据字节,其最大长度在C-APDU中的Le中定义。 必备的状态码标明IC卡在处理完命令后的状态。

    SW1 SW2的编码遵循下述规定:

    * SW1的高半字节是’6’或’9’; 
    * 禁止SW1的值为’60’; 
    * SW1的值为’61’或’6C’时,应作为一个错误来处理; 
    * 命令正常结束时,SW1 SW2的取值为’9000’; 
    * 当SW1的高半字节为’9’,且低半字节不为’0’时,其含义依赖于相关的应用; 
    * 当SW1的高半字节为’6’,且低半字节不为’0’时,SW1的含义与应用无关。 

你可能感兴趣的:(IC卡的传输协议)