摘要:DS8007是一款低成本的多协议双智能卡接口,满足所有ISO 7816、EMV™和GSM11-11的要求。这个混合信号外设可以管理微控制器和两个独立智能卡间的所有接口细节。本应用笔记介绍智能卡以及如何与智能卡通信的一些基础知识,还会提供智能卡通过DS8007与DS5002安全处理器接口的软件。
图1. 智能卡举例
智能卡中嵌入的集成电路可以是简单的、非易失性的存储设备,或者是一些如微控制器一样高级的电路,可以执行复杂的操作。支付卡中简单的非易失性存储设备可以取代磁条来存储数据。在很多的类似设备中,存储体中会组合一些附加逻辑,用来限制对部分或者全部存储体的读取。但是,智能卡的真正能力在于嵌入的微控制器具有执行数据运算和/或加密的功能。这个处理能力可以提高安全性能。然而随着复杂度的提高,卡的成本也提高了。嵌入控制器的智能卡成本在$7.00至$15.00 (美元)之间,而使用磁条的支付卡成本可以低至$0.75¹ (美元)。智能卡更高的成本减缓了从简单技术的全面转移,但是随着对安全需求的增加,对智能卡的需求也会增加。
DS8007提供了微控制器与两个独立的智能卡物理连接时所必须的所有电信号。器件包含有专用的内部时序电路,用来控制卡的自动激活和关闭,以及一个用来数据通信的ISO UART。器件在2.7V至6.0V的电源电压下都可以工作,通过电荷泵和电压调节器,还可以输出两路独立的智能卡供电电压,每路都可选1.8V,3.0V或5V。通过标准的并行8bit数据线可以与微控制器进行通信,可以配置为非复用方式,或者是数据和地址复用。
表1. 智能卡连接
图2. 接点尺寸和位置
VCC触点(C1)
这个触点为卡片提供电源电压。最初的规范中VCC只包括5V DC ±10%。但是,目前在分阶段的过渡到低电压卡。只能支持最初规范的卡被称为A类卡,在2009年的6月底前它们会被AB类卡或者ABC类卡取代。不同类型卡的VCC规范:
A类卡: 4.5V ≤ VCC ≤ 5.5V @ ≤ 50mA
AB类: 2.70V ≤ VCC ≤ 3.3V @ ≤ 50mA
ABC类: 1.62V ≤ VCC ≤ 1.98V @ ≤ 30mA
DS8007卡接口包含有电荷泵和电压调节器,当器件工作在2.6V至6.0V的电源电压时,它可以为所有三种卡类型提供合适的电压。
I/O触点(C7)
智能卡上的I/O触点在接收来自终端的数据时作为输入(接收模式),或者给终端发送数据时作为输出(发送模式)。在接收模式,当输入符合下面的规范时卡会识别有效的数据。
A类卡
A类卡
时钟触点(C3)
时钟触点是个输入端,输入源为接口终端,比如DS8007。这个信号用来控制交易过程中的数据传输时钟。指定的频率范围为1.0MHz至5.0MHz。这个触点具有以下的电气规范:
A类卡
RST触点是卡上的输入端,输入源为接口终端。这个信号低有效,会引起卡的异步复位。这个触点与CLK触点有相同的电气特性,但是它的最大上升和下降时间是1.0µs。
从上面的规范可以看到,与智能卡接口的终端必须提供不同的电源电压和信号电平。接口规范也要求终端可以承受卡触点任意两点间的短路。鉴于这些原因,与采用大量的分立模拟IC来构建电路相比,采用专用设备来提供必要的电源电压和信号电平很明显更有优势。DS8007就是这样的一个专用器件。除了包含有实现这些功能的模拟电路外,它还包含有FIFO和其它数控逻辑,可以实现一个完整卡操作所需的状态排序和同步。
每个字符的含义
信息在智能卡和终端的接口间通过双向I/O触点串行通信。比特的持续时间被定义为基本时间单元,或者ETU。ETU的时间周期与终端通过CLK触点提供的时钟信号有直接的线性关系。ATR期间字符的比特同步被称为初始ETU。这个初始ETU由下面的公式定义:
式中ƒ是以赫兹为单位的时钟信号频率。
ATR之后,比特持续时间被称为当前ETU,它是参数F、D和时钟频率的函数(参数F和D在下面的TA1字符部分有更详细的讨论)
式中ƒ 是以赫兹为单位的时钟信号频率。
任何通信中的每个字符都由10个比特组成,所以总的持续时间就是10个ETU。字符的第一个比特位被称为起始位,它总是低电平。起始位之前,I/O线上会保持默认的高电平。字符的最后一个比特是奇偶位,它或高或低,由数据源确定,所以可以保持字符中1的总数为偶数。图3所示为这个比特码型的图例。
图3. 10位字符帧
卡插入终端后,并且当所有触点保持"低"状态时,电源电压迅速施加于VCC触点。当终端确定电压稳定而且处于规定的范围内时,终端的I/O触点驱动器被置为接收模式,其时钟信号传输至卡的CLK触点。在时钟信号初始化的200个周期内,终端的I/O线一直处于接收模式,而卡会将其I/O线置为发送模式。在40,000至45,000个时钟周期后,终端对卡的RST触点释放一个高有效信号。在400至40,000个时钟周期后,卡通过一系列的字符串来作出响应,称为ATR。ATR包含的信息会详细确定后续通信如何实现,包括T=0或T=1协议的选择。如果没有指定协议,那么假定为T=0。(下文会有ATR和ATR包含信息的完整细节。)
EMV规范为协议T=0定义的ATR内容如表2所示,协议T=1时如表3所示。
表2. 基本的EMV ATR (T=0)
表3. 基本的EMV ATR (T=1)
*注意:m.s. nibble = 最高有效半字节;l.s. nibble = 最低有效半字节
TS初始字符
ATR序列的第一个字符被定义为初始字符TS。根据它的比特码型,这个字符同步信息定义所有后续字符的极性。TS的前四个比特组成如下:低电平的开始位,然后是两个高电平比特,紧随其后又是一个低电平位。这个固定的比特码型保证了同步。后续的三个比特可以都为高电平代表直接约定,也可以是都为低电平代表反向约定。对于直接约定,I/O线上的高电平就代表逻辑1,数据传输时首先发送最低有效位。对于反向约定,I/O线上的低电平就代表逻辑1,数据传输时首先发送最高有效位。由于规范容许反向约定,所以EMV建议所有当前的卡设计都采用直接约定。最后的三个比特是两位高电平、一位低电平。ATR或者任何其它10比特字符帧中的最后一个比特位都是奇偶位,它会通过置高或者置低来保证帧中1的总数目为一个偶数。
T0格式字符
ATR序列的第二个字符被定义为格式字符,称为T0。这个字符包含有两个部分,都用来确定有哪些字符会包含在其余的ATR序列中。最高有效的四个比特位用Y1来表示,它们代表TA1,TB1,TC1或者TD1是否会被发送。对于Y1的每个逻辑1,每个字符的出现由下面的方式确定:
Bit 8 (msb) = 1代表字符TD1会被发送
Bit 7 = 1代表字符TC1会被发送
Bit 6 = 1代表字符TB1会被发送
Bit 5 = 1代表字符TA1会被发送
T0的四个最低有效比特位用K来表示。这些比特将会确定包含在其余ATR系列中的"历史字节"的数量,0至15个。历史字节会传送一些卡的通用信息,比如卡的制造商,卡中的芯片,芯片中的掩模ROM,或者卡的使用期限等。无论是ISO 7816还是EMV规范都没有精确定义哪些(如果有)信息应该被传送。
从上面的表2我们可以看到,Y1的b7和b6为高,比特b8和b5为低('6x')。这代表TC1和TB1会被发送,而字符TA1和TD1则不发送(如表中所示)。对于协议T=0,字符TB1和TC1完成最基本的ATR序列。在表3中,Y1的比特8也为高,所以对于协议T=1来讲,字符TD1也会被发送。
TA1字符
无论是协议T=0或是T=1,基本的EMV ATR响应中都没有发送字符TA1,它在ISO 7816规范中被定义用作其它通信。在使用时,TA1会分为上下两个半字节。上半字节确定时钟速率变换因子F,它用来调整时钟信号的频率。下半字节确定比特速率调整因子D,它用来调整ATR后续的比特持续时间。上面的公式2中有对这些参数的使用。在ATR期间初始ETU选用默认值,F = 372, D = 1,如果没有在基本ATR以外修改,那么在后续交互中依然使用默认值。
TB1字符
TB1字符传送关于智能卡编程电压要求的信息。比特b1至b5 (称为PI1)传送编程电压,比特b6和b7 (称为II)传送智能卡要求的最大编程电流。对于基本的ATR,TB1 = '00'代表VPP引脚在智能卡上没有连接。
TC1字符
TC1字符传送N的大小,它用来确定终端向智能卡发送连续字符时要加入的额外保护时间。这个值与卡发往终端的字符或者有相反发送方向的两个字符都没有关系。N是个二进制数,它代表着作为额外保护时间而附加的ETU。当TC1 = 'FF'时,两个字符间应该使用最小延时。对于协议T=0,此值为12个ETU,对于协议T=0,此值为11。N的大小可以在0至255间任意取值。如果TC1没有在ATR中返回,终端会默认接收到00而继续工作。因为这个值可以在字符发送间增加时间,所以为了加速交易应该减小此值。
TD1字符
TD1字符表明如果要发送更多的接口字节时,将会采用哪个协议。字符TD1是通用字符TDx的一个特定实例。TDx的最高有效半字节代表是否TA(x + 1), TB(x + 1),TC(x + 1)或TD(x + 1)要被发送。对于每个逻辑1,后续发送的每个字符是否出现按照下面的原则确定:
Bit 8 (msb) = 1代表字符TD(x + 1)会被发送
Bit 7 = 1代表字符TC(x + 1)会被发送
Bit 6 = 1代表字符TB(x + 1)会被发送
Bit 5 = 1代表字符TA(x + 1)会被发送
TD1字符(统一为TDx)的最低有效半字节的值或者是0x0,或者是0x1,分别代表协议T=0或者T=1。
如果采用协议T=0,字符TD1不会包含在ATR序列中,后续传送会采用协议T = 0。如果采用协议T=1,字符TD1会包含在内,其值为0x81。这个值代表将会有TD2,而且所有的后续传送会采用协议T=1。
TA2字符
由于无论是协议T=0或是T=1,TA2字符都不在基本的EMV ATR响应中发送,所以它由ISO 7816规范定义。TA2的出现与否用来确定在ATR之后,智能卡是工作在特殊模式还是交易模式。没有TA2就代表操作将采用交易模式。
TB2字符
由于无论是协议T=0或是T=1,TB2字符都不在基本的EMV ATR响应中发送,所以它由ISO 7816规范定义。字符TB2传送PI2,它确定智能卡需要的编程电压值。当存在字符TB2时,字符TB1中的PI1值将会被取代。
TC2字符
由于无论是协议T=0或是T=1,TC2字符都不在基本的EMV ATR响应中发送,所以它由ISO 7816规范定义。当存在TC2时,它将指定采用协议类型T=0。TC2会传送工作等待时间整数(WI),它用来确定由智能卡发送的任意字符和由智能卡或者终端发送的前一个字符在起始位的上升沿之间的最大间隔。工作等待时间的数值按下式计算:
式中D是比特速率调整因子(参见上面TA1部分的介绍)。
当ATR系列中不含有TC2时,假定WI = 0x0A为其默认值。
TD2字符
TD2字符和TD1字符具有同样的功能。详细情况请看上面的TD1介绍。对于协议T=1,表3中出现了TD2,其值为0x31。这个值代表:将会有TA3和TB3,没有TC3和TD3,而协议类型会是T=1。
TA3字符
TA3字符为智能卡传送信息域大小整数(IFSI)。IFSI为智能卡确定信息域的大小,它是卡能接收的数据块的信息域(INF)部分的最大长度。域的大小可以是0x01至0xFE间的任意值。值0x0和0xFF保留给将来使用。在采用T=1协议的基本ATR中,TA3的数值范围是0x10至0xFE,因此代表着IFSC在16至254个字节之间。对于不含TA3的ATR,终端会假定为默认值0x20。
TB3字符
TB3字符代表字符等待时间整数(CWI)和块等待时间整数(BWI)的数值,它们用来计算字符等待时间(CWT)和块等待时间(BWT)。TB3的最低有效半字节(b1至b4)代表CWI的数值,最高有效半字节(b5至b8)代表BWI的数值。在采用T=1协议的基本ATR中,TB3字符的最低有效半字节范围为0至5 (CWI = 0至5),最高有效半字节范围为0至4 (BWI = 0至4)。
TC3字符
由于无论是协议T=0或是T=1,TC3字符都不在基本的EMV ATR响应中发送,所以它由ISO 7816规范定义。当存在TC3时,它代表将要采用的块错误检测类型。当没有TC3时,块错误检测将采用默认的纵向冗余校验(LRC)。
TCK字符
TCK字符是校验字符,它的值可以用来核对ATR期间发送数据的完整性。只要T0至TCK间包含的所有字节做异或运算结果为0,TCK可以是任意值。T=0时不采用TCK,但是在其它所有情况下都会在ATR中返回。
ATR的总结
终端接收至ATR序列的最后一个字符,所有必要的参数都从卡发送到了终端后,对DS8007可以进行接口参数的必要调整。由此可以开始后续通信。
执行一个应用时,智能卡和终端必须交互信息。信息的共享通过命令响应数据交换来完成。终端创建并发送一个命令给智能卡,然后智能卡会对指令译码并发出响应。这个命令响应信息对被称为一个应用协议数据单元(APDU)。终端发送的特定命令信息(C-APDU)会收到来自卡的特定响应信息(R-APDU)。这些信息都称作为APDU命令响应对。EMV规范中详细介绍了这两种信息类型的格式。它们的格式如下所述。
C-APDU格式
终端发起所有的命令APDU。它们必须包含4字节的头,随后是可选的数据部分,其长度可变。C-APDU中数据的字节数由命令字节Lc指定,而终端希望从智能卡响应中接收的字节数由指令Le指定。表4所示为C-APDU的格式,表5为字符描述。
表4. APDU命令结构
表5. APDU命令内容说明
命令APDU的第一个字节被定义为指令类别,称为CLA。这个字节除了0xFF外可以是任意的8比特值,但是目前只在最高优先半字节使用了0至8。最高优先半字节为0时定义为行业间的命令,为8时定义为EMV规范专用。
命令APDU的第二个字节是指令代码,称为INS。这个字节只有在最低有效位为0,并且最高有效半字节不是6或者9的情况下才有效。
必须的头部分中,P1和P2包含有特定命令的参数,可以是任意值。如果没有使用,参数字节必须取值0x00。
R-APDU
智能卡接收并译码来自终端的APDU命令后会返回响应。如同规范中定义的一样,响应由长度可变的可选数据部分,跟随一个必须的两字节报尾组成。表6所示为其格式,表7所示为APDU响应的内容。
表6. APDU卡响应格式
表7. APDU命令响应内容
智能卡响应的预期长度通过APDU命令的Le代码部分发送,响应的实际长度被称为Lr。虽然卡并不发送Lr的值,如果应用需要的话终端可以计算此值。
对于正常的命令结束,智能卡会在SW1中返回0x90,在SW2中返回0x00。其它任何响应都代表有错误或者告警发生²。
图4. 软件输出
我们采用Advanced Card Systems (ACS)公司的基于微控制器的智能卡来测试这个范例软件。作为基于微控制器的设备,这张卡会执行称为ACS智能卡操作系统版本1,或者ACOS1的嵌入式操作系统中的功能。这张卡具有以下的特性:
对于这个有一个APDU的范例软件,执行开始会话命令。这个命令具有如下的格式:
对开始会话命令的响应具有如下的格式;
图4所示的软件输出表明来自卡的返回随机数是0xCB,0xC4,0xBD,0xD5,0xA4,0x7E,0x36和0x3F。它还表明返回状态为0x90,0x00,这表明成功完成了命令。
¹java.sun.com/products/javacard/smartcards.html。来源:Gartner Group
²EMV规范的Book-1 Part II Section 6有对命令APDU响应错误或者警告状态代码的详细介绍。
本文的一个中文版发表在EDN China的2007年9月刊当中。
概述
什么是智能卡?智能卡通常定义为包含有嵌入式集成电路的小型卡片。由于有嵌入式的集成电路,智能卡有时被称为集成电路卡,或者ICC。图1所示为一个典型的例子。由于可适用于很多不同的场合,所以这些卡片替代了我们熟悉的支付卡(借记卡或者信用卡),它们利用磁条来存储卡的账户信息。在支付应用中,向智能卡的转(迁)移主要是因为这样可以增加功能,特别是采用这种技术后可以提高安全性。但是,在评估最后一项能力时必须考虑到智能卡更高的成本。图1. 智能卡举例
智能卡中嵌入的集成电路可以是简单的、非易失性的存储设备,或者是一些如微控制器一样高级的电路,可以执行复杂的操作。支付卡中简单的非易失性存储设备可以取代磁条来存储数据。在很多的类似设备中,存储体中会组合一些附加逻辑,用来限制对部分或者全部存储体的读取。但是,智能卡的真正能力在于嵌入的微控制器具有执行数据运算和/或加密的功能。这个处理能力可以提高安全性能。然而随着复杂度的提高,卡的成本也提高了。嵌入控制器的智能卡成本在$7.00至$15.00 (美元)之间,而使用磁条的支付卡成本可以低至$0.75¹ (美元)。智能卡更高的成本减缓了从简单技术的全面转移,但是随着对安全需求的增加,对智能卡的需求也会增加。
DS8007提供了微控制器与两个独立的智能卡物理连接时所必须的所有电信号。器件包含有专用的内部时序电路,用来控制卡的自动激活和关闭,以及一个用来数据通信的ISO UART。器件在2.7V至6.0V的电源电压下都可以工作,通过电荷泵和电压调节器,还可以输出两路独立的智能卡供电电压,每路都可选1.8V,3.0V或5V。通过标准的并行8bit数据线可以与微控制器进行通信,可以配置为非复用方式,或者是数据和地址复用。
智能卡详述
人们所熟知的大部分智能卡的形状就是信用卡大小的一个设备,词组"智能卡"也可以用来指用户识别模块(SIM),它大概有邮票那么大,经常用在蜂窝电话中。这种SIM的形状也可以用在支付终端里,为终端提供特定的支付系统数据和详细的应用信息。信用卡大小的设备(部分)通常由聚氯乙烯(PVC)来制造,而且一般会模压出账户号码以及有可能加上一个有效日期。无论采用什么形式,所有的机电结构规范都基于ISO 7861系列标准。另外,EuroCard®,MasterCard®和Visa® (EMV)公司的一个联盟也已经专门为解决智能卡以及它们在支付系统中的应用开发了一套标准(称作EMV规范)。EMV规范通常基于ISO 7816文件。智能卡触点
上述的标准中明确的定义了智能卡触点的数目、排位和功能。图2所示为智能卡上集成电路的位置和触点的尺寸。ISO 7816定义了8个可能的触点位置。在这8个位置中,目前有5个用在EMV应用中。表1所列为这些触点的名称和功能。ISO 7816定义触点C6为VPP,但是根据EMV规范,目前的卡并没有使用这个编程电压。触点C4和C8没有使用,而且不需要有物理接头。下面有EMV规范定义的每个触点的更详细的讨论。表1. 智能卡连接
Contact Name | Contact Function |
C1 | Supply voltage to card (VCC) |
C2 | Reset (RST) |
C3 | Clock (CLK) |
C4 | Provided on the DS8007; not used in EMV |
C5 | Ground (GND) |
C6 | VPP; not used in EMV |
C7 | Input/output (I/O) |
C8 | Provided on the DS007; not used in EMV |
图2. 接点尺寸和位置
VCC触点(C1)
这个触点为卡片提供电源电压。最初的规范中VCC只包括5V DC ±10%。但是,目前在分阶段的过渡到低电压卡。只能支持最初规范的卡被称为A类卡,在2009年的6月底前它们会被AB类卡或者ABC类卡取代。不同类型卡的VCC规范:
A类卡: 4.5V ≤ VCC ≤ 5.5V @ ≤ 50mA
AB类: 2.70V ≤ VCC ≤ 3.3V @ ≤ 50mA
ABC类: 1.62V ≤ VCC ≤ 1.98V @ ≤ 30mA
DS8007卡接口包含有电荷泵和电压调节器,当器件工作在2.6V至6.0V的电源电压时,它可以为所有三种卡类型提供合适的电压。
I/O触点(C7)
智能卡上的I/O触点在接收来自终端的数据时作为输入(接收模式),或者给终端发送数据时作为输出(发送模式)。在接收模式,当输入符合下面的规范时卡会识别有效的数据。
A类卡
- 输入高电压: 0.7 × VCC ≤ VIH ≤ VCC
输入低电压: 0.0 ≤ VIL ≤ 0.8V
上升时间/下降时间: ≤ 1µs
- 输入高电压: 0.7 × VCC ≤ VIH ≤ VCC
≤VCC
输入低电压: 0.0 ≤ VIL ≤ 0.2 × VCC
上升时间/下降时间: ≤ 1µs
A类卡
- 输出高电压: 0.7 × VCC ≤ VOH ≤ VCC, -20µA < IOH < 0, VCC = min
输出低电压: 0.0 ≤ VOL ≤ 0.4V, 0 < IOL < 1mA, VCC = min
上升时间/下降时间: ≤ 1.0µs
- 输出高电压: 0.7 × VCC ≤ VOH ≤ VCC, -20µA < IOH < 0, VCC = min
输出低电压: 0.0 ≤ VOL ≤ 0.15 × VCC, 0 < IOL < 1mA, VCC = min
上升时间/下降时间: ≤ 1.0µs
时钟触点(C3)
时钟触点是个输入端,输入源为接口终端,比如DS8007。这个信号用来控制交易过程中的数据传输时钟。指定的频率范围为1.0MHz至5.0MHz。这个触点具有以下的电气规范:
A类卡
- 输入高电压: VCC - 0.7 ≤ VIH ≤ VCC
输入低电压: 0.0 ≤ VIL ≤ 0.5V
上升时间/下降时间: ≤ 9%的时钟周期
- 输入高电压: 0.7 × VCC ≤ VIH ≤ VCC
输入低电压: 0.0 ≤ VIL ≤ 0.2 × VCC
上升时间/下降时间: ≤ 9%的时钟周期
RST触点是卡上的输入端,输入源为接口终端。这个信号低有效,会引起卡的异步复位。这个触点与CLK触点有相同的电气特性,但是它的最大上升和下降时间是1.0µs。
从上面的规范可以看到,与智能卡接口的终端必须提供不同的电源电压和信号电平。接口规范也要求终端可以承受卡触点任意两点间的短路。鉴于这些原因,与采用大量的分立模拟IC来构建电路相比,采用专用设备来提供必要的电源电压和信号电平很明显更有优势。DS8007就是这样的一个专用器件。除了包含有实现这些功能的模拟电路外,它还包含有FIFO和其它数控逻辑,可以实现一个完整卡操作所需的状态排序和同步。
终端接口要求
卡的操作过程包含有下面几步:- 将卡插入终端,触点连接并激活
- 卡复位,终端和卡之间建立通信(ATR时序—如下)
- 执行交易
- 关闭触点,移除卡片
每个字符的含义
信息在智能卡和终端的接口间通过双向I/O触点串行通信。比特的持续时间被定义为基本时间单元,或者ETU。ETU的时间周期与终端通过CLK触点提供的时钟信号有直接的线性关系。ATR期间字符的比特同步被称为初始ETU。这个初始ETU由下面的公式定义:
初始ETU = 372/ƒ秒 | (公式1) |
式中ƒ是以赫兹为单位的时钟信号频率。
ATR之后,比特持续时间被称为当前ETU,它是参数F、D和时钟频率的函数(参数F和D在下面的TA1字符部分有更详细的讨论)
当前ETU = F/(Dƒ)秒 | (公式2) |
式中ƒ 是以赫兹为单位的时钟信号频率。
任何通信中的每个字符都由10个比特组成,所以总的持续时间就是10个ETU。字符的第一个比特位被称为起始位,它总是低电平。起始位之前,I/O线上会保持默认的高电平。字符的最后一个比特是奇偶位,它或高或低,由数据源确定,所以可以保持字符中1的总数为偶数。图3所示为这个比特码型的图例。
图3. 10位字符帧
智能卡通信协议
在ISO 7816规范中,用四个比特位来选择卡操作时的通信协议。目前主要采用16个可用协议中的2个,他们被定义为T=0和T=1。两个协议都是半双工的(每次都是单方向)异步通信。T=0协议是基于字符的格式,T=1则是基于块的格式。EVM兼容的所有智能卡必须支持T=0或者T=1协议,而终端必须两种方式都支持。卡插入终端后,并且当所有触点保持"低"状态时,电源电压迅速施加于VCC触点。当终端确定电压稳定而且处于规定的范围内时,终端的I/O触点驱动器被置为接收模式,其时钟信号传输至卡的CLK触点。在时钟信号初始化的200个周期内,终端的I/O线一直处于接收模式,而卡会将其I/O线置为发送模式。在40,000至45,000个时钟周期后,终端对卡的RST触点释放一个高有效信号。在400至40,000个时钟周期后,卡通过一系列的字符串来作出响应,称为ATR。ATR包含的信息会详细确定后续通信如何实现,包括T=0或T=1协议的选择。如果没有指定协议,那么假定为T=0。(下文会有ATR和ATR包含信息的完整细节。)
响应复位(ATR)
在最初被终端复位后,EMV智能卡通过一串被称为响应复位或者ATR的字符来做出响应。这些字符包括一个初始字符,TS,然后跟随有最多32个附加字符。这些字符一起为终端提供如何与卡进行后续工作通信的信息。下面的部分介绍每一个字符。EMV规范为协议T=0定义的ATR内容如表2所示,协议T=1时如表3所示。
表2. 基本的EMV ATR (T=0)
Character | Value | Remarks |
TS | '3B' or '3F' | Indicates direct (3B) or inverse (3F) convention. |
T0 | '6x | TB1 and TC1 present, TA1 and TD1 absent; x indicates the number of historical bytes present. |
TB1 | '00' | VPP is not required. |
TC1 | '00' to 'FF' | Indicates the amount of extra guard time required. Value 'FF' has a special meaning. (See TC1 description below.) |
表3. 基本的EMV ATR (T=1)
Character | Value | Remarks |
TS | '3B' or '3F' | Indicates direct (3B) or inverse (3F) convention. |
T0 | 'Ex' | TB1, TC1, and TD1 present, TA1 is absent; x indicates the number of historical bytes present. |
TB1 | '00' | VPP is not required. |
TC1 | '00' to 'FF' | Indicates the amount of extra guard time required. |
TD1 | '81' | TA2, TB2, and TC2 absent; TD2 present; T=1 to be used. |
TD2 | '31' | TA3 and TB3 present; TC3 and TD3 absent; T=1 to be used. |
TA3 | '10' to 'FE' | Returns IFSI, which indicates the initial value for the card's information field size and IFSC of 16 bytes to 254 bytes. |
TB3 | m.s. nibble* '0' to '4'; l.s. nibble '0' to '5' | BWI = 0 to 4 CWI = 0 to 5 |
TCK | Check character. Exclusive ORing of all ATR bytes from T0 to TCK inclusive is null. |
TS初始字符
ATR序列的第一个字符被定义为初始字符TS。根据它的比特码型,这个字符同步信息定义所有后续字符的极性。TS的前四个比特组成如下:低电平的开始位,然后是两个高电平比特,紧随其后又是一个低电平位。这个固定的比特码型保证了同步。后续的三个比特可以都为高电平代表直接约定,也可以是都为低电平代表反向约定。对于直接约定,I/O线上的高电平就代表逻辑1,数据传输时首先发送最低有效位。对于反向约定,I/O线上的低电平就代表逻辑1,数据传输时首先发送最高有效位。由于规范容许反向约定,所以EMV建议所有当前的卡设计都采用直接约定。最后的三个比特是两位高电平、一位低电平。ATR或者任何其它10比特字符帧中的最后一个比特位都是奇偶位,它会通过置高或者置低来保证帧中1的总数目为一个偶数。
T0格式字符
ATR序列的第二个字符被定义为格式字符,称为T0。这个字符包含有两个部分,都用来确定有哪些字符会包含在其余的ATR序列中。最高有效的四个比特位用Y1来表示,它们代表TA1,TB1,TC1或者TD1是否会被发送。对于Y1的每个逻辑1,每个字符的出现由下面的方式确定:
Bit 8 (msb) = 1代表字符TD1会被发送
Bit 7 = 1代表字符TC1会被发送
Bit 6 = 1代表字符TB1会被发送
Bit 5 = 1代表字符TA1会被发送
T0的四个最低有效比特位用K来表示。这些比特将会确定包含在其余ATR系列中的"历史字节"的数量,0至15个。历史字节会传送一些卡的通用信息,比如卡的制造商,卡中的芯片,芯片中的掩模ROM,或者卡的使用期限等。无论是ISO 7816还是EMV规范都没有精确定义哪些(如果有)信息应该被传送。
从上面的表2我们可以看到,Y1的b7和b6为高,比特b8和b5为低('6x')。这代表TC1和TB1会被发送,而字符TA1和TD1则不发送(如表中所示)。对于协议T=0,字符TB1和TC1完成最基本的ATR序列。在表3中,Y1的比特8也为高,所以对于协议T=1来讲,字符TD1也会被发送。
TA1字符
无论是协议T=0或是T=1,基本的EMV ATR响应中都没有发送字符TA1,它在ISO 7816规范中被定义用作其它通信。在使用时,TA1会分为上下两个半字节。上半字节确定时钟速率变换因子F,它用来调整时钟信号的频率。下半字节确定比特速率调整因子D,它用来调整ATR后续的比特持续时间。上面的公式2中有对这些参数的使用。在ATR期间初始ETU选用默认值,F = 372, D = 1,如果没有在基本ATR以外修改,那么在后续交互中依然使用默认值。
TB1字符
TB1字符传送关于智能卡编程电压要求的信息。比特b1至b5 (称为PI1)传送编程电压,比特b6和b7 (称为II)传送智能卡要求的最大编程电流。对于基本的ATR,TB1 = '00'代表VPP引脚在智能卡上没有连接。
TC1字符
TC1字符传送N的大小,它用来确定终端向智能卡发送连续字符时要加入的额外保护时间。这个值与卡发往终端的字符或者有相反发送方向的两个字符都没有关系。N是个二进制数,它代表着作为额外保护时间而附加的ETU。当TC1 = 'FF'时,两个字符间应该使用最小延时。对于协议T=0,此值为12个ETU,对于协议T=0,此值为11。N的大小可以在0至255间任意取值。如果TC1没有在ATR中返回,终端会默认接收到00而继续工作。因为这个值可以在字符发送间增加时间,所以为了加速交易应该减小此值。
TD1字符
TD1字符表明如果要发送更多的接口字节时,将会采用哪个协议。字符TD1是通用字符TDx的一个特定实例。TDx的最高有效半字节代表是否TA(x + 1), TB(x + 1),TC(x + 1)或TD(x + 1)要被发送。对于每个逻辑1,后续发送的每个字符是否出现按照下面的原则确定:
Bit 8 (msb) = 1代表字符TD(x + 1)会被发送
Bit 7 = 1代表字符TC(x + 1)会被发送
Bit 6 = 1代表字符TB(x + 1)会被发送
Bit 5 = 1代表字符TA(x + 1)会被发送
TD1字符(统一为TDx)的最低有效半字节的值或者是0x0,或者是0x1,分别代表协议T=0或者T=1。
如果采用协议T=0,字符TD1不会包含在ATR序列中,后续传送会采用协议T = 0。如果采用协议T=1,字符TD1会包含在内,其值为0x81。这个值代表将会有TD2,而且所有的后续传送会采用协议T=1。
TA2字符
由于无论是协议T=0或是T=1,TA2字符都不在基本的EMV ATR响应中发送,所以它由ISO 7816规范定义。TA2的出现与否用来确定在ATR之后,智能卡是工作在特殊模式还是交易模式。没有TA2就代表操作将采用交易模式。
TB2字符
由于无论是协议T=0或是T=1,TB2字符都不在基本的EMV ATR响应中发送,所以它由ISO 7816规范定义。字符TB2传送PI2,它确定智能卡需要的编程电压值。当存在字符TB2时,字符TB1中的PI1值将会被取代。
TC2字符
由于无论是协议T=0或是T=1,TC2字符都不在基本的EMV ATR响应中发送,所以它由ISO 7816规范定义。当存在TC2时,它将指定采用协议类型T=0。TC2会传送工作等待时间整数(WI),它用来确定由智能卡发送的任意字符和由智能卡或者终端发送的前一个字符在起始位的上升沿之间的最大间隔。工作等待时间的数值按下式计算:
工作等待时间 = 960 × D × WI | (公式3) |
式中D是比特速率调整因子(参见上面TA1部分的介绍)。
当ATR系列中不含有TC2时,假定WI = 0x0A为其默认值。
TD2字符
TD2字符和TD1字符具有同样的功能。详细情况请看上面的TD1介绍。对于协议T=1,表3中出现了TD2,其值为0x31。这个值代表:将会有TA3和TB3,没有TC3和TD3,而协议类型会是T=1。
TA3字符
TA3字符为智能卡传送信息域大小整数(IFSI)。IFSI为智能卡确定信息域的大小,它是卡能接收的数据块的信息域(INF)部分的最大长度。域的大小可以是0x01至0xFE间的任意值。值0x0和0xFF保留给将来使用。在采用T=1协议的基本ATR中,TA3的数值范围是0x10至0xFE,因此代表着IFSC在16至254个字节之间。对于不含TA3的ATR,终端会假定为默认值0x20。
TB3字符
TB3字符代表字符等待时间整数(CWI)和块等待时间整数(BWI)的数值,它们用来计算字符等待时间(CWT)和块等待时间(BWT)。TB3的最低有效半字节(b1至b4)代表CWI的数值,最高有效半字节(b5至b8)代表BWI的数值。在采用T=1协议的基本ATR中,TB3字符的最低有效半字节范围为0至5 (CWI = 0至5),最高有效半字节范围为0至4 (BWI = 0至4)。
TC3字符
由于无论是协议T=0或是T=1,TC3字符都不在基本的EMV ATR响应中发送,所以它由ISO 7816规范定义。当存在TC3时,它代表将要采用的块错误检测类型。当没有TC3时,块错误检测将采用默认的纵向冗余校验(LRC)。
TCK字符
TCK字符是校验字符,它的值可以用来核对ATR期间发送数据的完整性。只要T0至TCK间包含的所有字节做异或运算结果为0,TCK可以是任意值。T=0时不采用TCK,但是在其它所有情况下都会在ATR中返回。
ATR的总结
终端接收至ATR序列的最后一个字符,所有必要的参数都从卡发送到了终端后,对DS8007可以进行接口参数的必要调整。由此可以开始后续通信。
应用协议数据单元(APDU)
如前所述,卡操作的下一个阶段是交易的执行。在交易期间执行的特定操作依赖于卡的类型、账户(信用卡、借记卡等)以及用户的请求。无论什么特定的操作,交易都通过终端对智能卡发送命令来完成。智能卡执行被请求的服务,有可能会回复一个结果。卡的操作可以简单到读取存储器中的一个位置,或者复杂如执行加密工作。无论什么操作,终端和卡之间的通信通过应用协议数据单元,或APDU来实现。执行一个应用时,智能卡和终端必须交互信息。信息的共享通过命令响应数据交换来完成。终端创建并发送一个命令给智能卡,然后智能卡会对指令译码并发出响应。这个命令响应信息对被称为一个应用协议数据单元(APDU)。终端发送的特定命令信息(C-APDU)会收到来自卡的特定响应信息(R-APDU)。这些信息都称作为APDU命令响应对。EMV规范中详细介绍了这两种信息类型的格式。它们的格式如下所述。
C-APDU格式
终端发起所有的命令APDU。它们必须包含4字节的头,随后是可选的数据部分,其长度可变。C-APDU中数据的字节数由命令字节Lc指定,而终端希望从智能卡响应中接收的字节数由指令Le指定。表4所示为C-APDU的格式,表5为字符描述。
表4. APDU命令结构
CLA | INS | P1 | P2 | Lc | Data | Le |
←Mandatory Header→ | ←Conditional Body→ |
表5. APDU命令内容说明
Code | Description | Length |
CLA | Class of instruction | 1 |
INS | Instruction code | 1 |
P1 | Instruction parameter 1 | 1 |
P2 | Instruction parameter 2 | 1 |
Lc | Number of bytes present in command date field | 0 or 1 |
Data | String of data bytes sent in command (= Lc) | Variable |
Le | Maximum number of data bytes expected in data field of response | 0 or 1 |
命令APDU的第一个字节被定义为指令类别,称为CLA。这个字节除了0xFF外可以是任意的8比特值,但是目前只在最高优先半字节使用了0至8。最高优先半字节为0时定义为行业间的命令,为8时定义为EMV规范专用。
命令APDU的第二个字节是指令代码,称为INS。这个字节只有在最低有效位为0,并且最高有效半字节不是6或者9的情况下才有效。
必须的头部分中,P1和P2包含有特定命令的参数,可以是任意值。如果没有使用,参数字节必须取值0x00。
R-APDU
智能卡接收并译码来自终端的APDU命令后会返回响应。如同规范中定义的一样,响应由长度可变的可选数据部分,跟随一个必须的两字节报尾组成。表6所示为其格式,表7所示为APDU响应的内容。
表6. APDU卡响应格式
Data | SW1 | SW2 |
←Body→ | ←Trailer→ |
表7. APDU命令响应内容
Code | Description | Length |
Data | String of data bytes received in APDU response | Var (= Lr) |
SW1 | Command processing status | 1 |
SW2 | Command processing qualifier | 1 |
智能卡响应的预期长度通过APDU命令的Le代码部分发送,响应的实际长度被称为Lr。虽然卡并不发送Lr的值,如果应用需要的话终端可以计算此值。
对于正常的命令结束,智能卡会在SW1中返回0x90,在SW2中返回0x00。其它任何响应都代表有错误或者告警发生²。
范例代码
本应用笔记提供的软件包含在可下载文件an4029_sw.zip中。这个文件包括用来生成可执行十六进制文件(ds8007.hex)所需的所有的C(main.c,ds8007.c,LCD_Funct.c)和汇编语言(Startup.a51)源代码。代码通过Keil PK51专业开发套件和µVision®集成开发环境(IDE)编译和链接。µVision项目文件(ds8007.Uv2)也包括在.zip文件中。Maxim提供可装载并运行在DS8007智能卡接口板上的.HEX文件,接口板包含在DS8007评估(EV)套件中。范例软件实现了一个完整的智能卡工作过程,包括上电、ATR,APDU以及断电操作。当连接至一个哑终端时,电路板通过软件会产生一个38,400波特率的RS-232串口输出,这个输出如下面的图4所示。关于该软件的详细说明已经超出本应用笔记的范围,但我们提供的源代码可以作为一套完整的智能卡接口的基础,该接口基于DS5002安全处理器和DS8007多协议双智能卡接口芯片。图4. 软件输出
我们采用Advanced Card Systems (ACS)公司的基于微控制器的智能卡来测试这个范例软件。作为基于微控制器的设备,这张卡会执行称为ACS智能卡操作系统版本1,或者ACOS1的嵌入式操作系统中的功能。这张卡具有以下的特性:
- 8kB的EEPROM存储区,用于应用数据
- 兼容ISO 7816-3,T=0协议
- DES和MAC的能力
- 会话密钥基于随机数
- PIN可由持卡人更改
- 用于相互认证的密钥对
对于这个有一个APDU的范例软件,执行开始会话命令。这个命令具有如下的格式:
CLA | INS | P1 | P2 | P3 |
0x80 | 0x84 | 0x00 | 0x00 | 0x08 |
对开始会话命令的响应具有如下的格式;
Data | SW1 | SW2 |
RNDc (8 bytes from card) | Status | Status |
图4所示的软件输出表明来自卡的返回随机数是0xCB,0xC4,0xBD,0xD5,0xA4,0x7E,0x36和0x3F。它还表明返回状态为0x90,0x00,这表明成功完成了命令。
结论
DS8007是个混合信号外设,它减轻了微控制器和智能卡间接口的难度,提供了与两个独立的智能卡物理连接时所必须的所有电信号。专用的内部时序电路用来控制卡的自动激活和关闭,还有一个用来数据通信的ISO UART。DS8007在2.7V至6.0V的电源电压下都可以工作,通过电荷泵和电压调节器,还可以同时输出两路独立的智能卡供电电压,每路都可选1.8V,3.0V或5V。通过标准的并行8比特数据线可以与微控制器进行通信,可以配置为非复用方式,或者是数据和地址复用方式。通过DS5002安全微处理器,并利用DS8007作为其智能卡接口,我们提供的软件实现了一个完整的智能卡会话。智能卡在其ATR中返回的字符以38400的波特率在板子的串口上输出,并且卡会发送"Start Session"命令APDU。结果随机数也会在串口上输出。¹java.sun.com/products/javacard/smartcards.html。来源:Gartner Group
²EMV规范的Book-1 Part II Section 6有对命令APDU响应错误或者警告状态代码的详细介绍。
本文的一个中文版发表在EDN China的2007年9月刊当中。
评论
查看更多