对于 I S O / I E C 7816 ISO/IEC\quad 7816 ISO/IEC7816协议的介绍我直接将维基百科和 I S O ISO ISO组织的该协议的标准文档中的介绍复制了过来:
从以上的介绍中我们可以知道 I S O / I E C 7816 ISO/IEC\quad 7816 ISO/IEC7816协议主要是针对我们生活中常见的“身份证”、“手机SIM卡”、“银行卡”、“公交卡”(当然不止提到的这些,还有很多)等的智能卡片的通讯协议标准。 I S O / I E C 7816 ISO/IEC\quad 7816 ISO/IEC7816协议又被划分为15个部分之多,每个部分都对应特定的内容。在 I S O ISO ISO的官方网站上有 I S O / I E C 7816 ISO/IEC\quad 7816 ISO/IEC7816协议的官方文档,但是不免费。第一部分和第二部分主要介绍卡片必须满足的一些物理特性以及卡片的尺寸、触电的位置以及布局等。对于软件工程师来说,这两部分没要太多要关心的。第三部分我觉得还是很重要的,我也主要只大概了解了这一部分,今天的介绍主要以第三部分为主。如果你以后要从事着方面的工作的话可以根据项目需要再决定详细研究一下特定部分的内容。以下是我从官方文档上复制过来的对于每一部分文档内容的介绍。可以知道第三部分主要介绍了电子接口以及异步卡的传输协议。我这里有ISO 7816的第三和第四部分,需要的可以下载。
Five parts are specific to cards with galvanic contacts and three of them specify electrical interfaces.
All the other parts are independent of the physical interface technology. They apply to cards accessed by contacts and/or by contactless technology.
首先从图一可以看一下接触式卡的引脚数量以及布局。第三部分讲的是异步卡,因此下面的时钟信号不是用来同步通信的而是用来驱动卡片上的芯片的(如果有的话)。这里只有一根数据通讯线 C 7 C7 C7,既用于输入,也用于输出。
对于 C 1 C1 C1的电源输入,卡片可以分为以下三类:
接口设备(读卡器)和卡片的交互过程包含了以下一些内容:
下面讲一下激活和冷复位的流程,图2截取来至于第三部分的 I S O / I E C 7816 ISO/IEC\quad 7816 ISO/IEC7816官方文档。接口设备激活卡片的时候(时间 T a T_a Ta之前):
冷复位开始于卡片时钟信号引脚有时钟信号输入后,即时间 T a T_a Ta之后,这时卡片应该在200个时钟周期之内(时间跨度区域 t a t_a ta)将 I O IO IO信号线拉高。冷复位产生的条件是从时间 T a T_a Ta开始复位引脚处于低电平状态至少400个时钟周期(时间跨度区域 t b t_b tb),接口设备在复位引脚为低电平的时候会忽略IO引脚的状态。在时间 T b T_b Tb,接口设备将复位引脚拉高,这时从时间 T b T_b Tb开始算起,卡片应该在400到40000个时钟周期区间内(时间跨度区域 t c t_c tc)向接口设备发送 A n s w e r T o R e s e t ( A T R ) Answer\quad To\quad Reset(ATR) AnswerToReset(ATR),如果接口设备没有收到的话,接口设备会对卡片执行 D E A C T I V A T I O N DEACTIVATION DEACTIVATION操作。
热复位的流程基本和冷复位一样,只不过卡片向接口设备发送的 A n s w e r T o R e s e t ( A T R ) Answer\quad To\quad Reset(ATR) AnswerToReset(ATR)在热复位和冷复位的情况下可能有所不同,并且热复位的时机比较随意,甚至可以在卡片向接口设备发送的 A n s w e r T o R e s e t ( A T R ) Answer\quad To\quad Reset(ATR) AnswerToReset(ATR)期间进行热复位。
接口设备可能最开始不知道卡片的类型( 5 V , 3 V , 1.8 V 5V,3V,1.8V 5V,3V,1.8V),这里也有一个流程是接口设备怎么去确定卡片的类型,这里就不具体讲述了,有需求的可以看一下官方 7816 − 3 7816-3 7816−3文档的 6.2.4 6.2.4 6.2.4小节。
当接口设备收到卡片发送的 A n s w e r T o R e s e t ( A T R ) Answer\quad To\quad Reset(ATR) AnswerToReset(ATR)之后,接下来接口设备和卡片要协商一下具体使用哪种通信协议以及通信的参数。这里只是一个大概,后面还会有关于 A n s w e r T o R e s e t ( A T R ) Answer\quad To\quad Reset(ATR) AnswerToReset(ATR)的结构以及各部分含义和协商过程的详细说明。图3是该过程的流程图,截取来至于第三部分的 I S O / I E C 7816 ISO/IEC\quad 7816 ISO/IEC7816官方文档。
当接口设备接收到的 A n s w e r T o R e s e t ( A T R ) Answer\quad To\quad Reset(ATR) AnswerToReset(ATR)中包含 T A 2 TA_2 TA2字节时,表明卡片处于特别的模式,这时接口设备应该使用 T A 2 TA_2 TA2字节中规定的具体协议和参数和卡片通信。
当接口设备接收到的 A n s w e r T o R e s e t ( A T R ) Answer\quad To\quad Reset(ATR) AnswerToReset(ATR)中不包含 T A 2 TA_2 TA2字节时,表明卡片处于协商模式。这时接口设备向卡片发送数据时使用的是卡片向接口设备发送 A n s w e r T o R e s e t ( A T R ) Answer\quad To\quad Reset(ATR) AnswerToReset(ATR)时使用的传输参数,其实就是默认参数。
官方文档第三部分的 6.3.1 6.3.1 6.3.1小节中对该部分还有一些注意事项,有需要的可以看看。当接口设备和卡片的信息交换完成或被终止(卡片不响应,卡片被移除)之后,接口设备应该执行 D E A C T I V A T I O N DEACTIVATION DEACTIVATION操作。具体流程如下:
协议规定一个比特的持续时间 E l e m e n t a r y T i m e U n i t ( e t u ) Elementary \quad Time\quad Unit(etu) ElementaryTimeUnit(etu)为:
1 e t u = F D × 1 f 1etu = \dfrac{F}{D}\times \dfrac{1}{f} 1etu=DF×f1
这里的 F F F和 D D D是接口设备和卡片需要协商的参数, F F F和 D D D的默认值分别是372和1,也即是卡片向接口设备发送 A n s w e r T o R e s e t Answer\quad To\quad Reset AnswerToReset时使用的参数值, f f f是提供给卡片的时钟频率。协议的字符帧的格式和 U S A R T USART USART协议的一样,如图4所示。一个比特开始位,接下来是8比特数据位然后是奇偶校验位(协议使用的是偶校验),最后是停止位。不同的是如果接收方通过接收到的奇偶校验位发现接收到的数据有错误,则接收方会在本来的停止位区间拉低信号线(持续最少一个 e t u etu etu,最多两个 e t u etu etu),并期待发送方重发刚才出错的数据字节,如图5所示。当接收方通过接收到的奇偶校验位发现接收到的数据有错误时,支持 T = 0 T=0 T=0协议的卡片必须在本来的停止位区间拉低信号线。而对于接口设备和不支持 T = 0 T=0 T=0协议的卡片可以选择拉低或不拉低信号线。 S T M 32 STM32 STM32的 F 10 F10 F10系列芯片的 U S A R T USART USART模块也有对应的支持 7816 − 3 7816-3 7816−3异步智能卡协议的模式。
接下来我们来看一下 A n s w e r T o R e s e t ( A T R ) Answer\quad To\quad Reset(ATR) AnswerToReset(ATR)的结构,如图6所示。 A T R ATR ATR的第一个字节数据为 T S TS TS初始化字节, T S TS TS初始化字节后面最多可以有32个字节数据。 T S TS TS初始化字节是卡片向接口设备告知卡片的编码习惯,一共有两种情况(这里 L L L表示低电平, H H H表示高电平,从左到右依次表示一个字节数据的8个比特位的第7到第0位):
格式化字符 T 0 T0 T0的结构如图7所示,比特0到比特3一共四个比特的值表示一共有 k k k个历史字符字节 T 1 , T 2 , . . . , T k T_1,T_2,...,T_k T1,T2,...,Tk。比特7到比特4的值分别表示 T A 1 , T B 1 , T C 1 , T D 1 , TA_1,TB_1,TC_1,TD_1, TA1,TB1,TC1,TD1,字节数据是否存在(0:不存在,1:存在)。接口字符 T D i TD_i TDi的结构如图8所示,比特0到比特3一共四个比特的值表示卡片支持的协议或其它信息。如果 T D 1 , T D 2 TD_1,TD_2 TD1,TD2和其它的 T D i TD_i TDi字节存在,则它们编码的协议号应该呈现升序,比如在 T D 1 TD_1 TD1中编码协议号0,比如在 T D 2 TD_2 TD2中编码协议号1。如果 T D 1 TD_1 TD1存在的话,它编码卡片第一个支持的协议,如果 T D 1 TD_1 TD1不存在的话,则说明卡片仅仅支持 T = 0 T=0 T=0协议。比特7到比特4的值分别表示 T A i + 1 , T B i + 1 , T C i + 1 , T D i + 1 TA_{i+1},TB_{i+1},TC_{i+1},TD_{i+1} TAi+1,TBi+1,TCi+1,TDi+1字节数据是否存在(0:不存在,1:存在)
接口字符 T A i , T B i , T C i , T D i TA_{i},TB_{i},TC_{i},TD_{i} TAi,TBi,TCi,TDi可以是全局的或特定的:
下面来简单讲几个接口字符的含义。 T A 1 TA_1 TA1给出了前面提到的参数 F F F和 D D D以及卡片支持的输送给它的最大频率值 f m a x f_{max} fmax。 F F F, D D D和 f m a x f_{max} fmax的默认值为 372 , 1 , 5 M H Z 372,1,5MHZ 372,1,5MHZ。 T A 2 TA_2 TA2是特别模式字节,在前面提到的图3中需要。比特3到比特0的值表示该特别模式的协议类型,如果比特4为0则表示参数 F F F和 D D D应该使用 T A 1 TA_1 TA1给出的值,如果比特4为1则表示参数 F F F和 D D D应该使用默认值。如果比特7为1,则接口设备只能使用比特3到比特0定义的特定协议和比特4规定的参数和卡片通信(如果接口设备支持该特定的协议和参数的话,否则接口设备就要热复位卡片或 D A C T I V A T I O N DACTIVATION DACTIVATION卡片),如果比特7为0,则此时还可以转换为图3的协商模式。如果 A T R ATR ATR中不存在 T A 2 TA_2 TA2特别模式字节且从 A T R ATR ATR中知道卡片仅仅支持一种传输协议(在 T D 1 TD_1 TD1中)则此时是没有图3中的 P P S e x c h a n g e PPS\quad exchange PPSexchange过程的。否则就有图3中的 P P S e x c h a n g e PPS\quad exchange PPSexchange过程,也就是和卡片确定双方交流过程中的通信协议和参数。
在 P P S e x c h a n g e PPS\quad exchange PPSexchange过程中:
P P S e x c h a n g e PPS\quad exchange PPSexchange请求和响应的结构相同,如图9所示。 P P S S PPSS PPSS固定为 0 x F F 0xFF 0xFF, P P S S 0 PPSS0 PPSS0的第4、5和第6个比特的值的0和1分别表明 P P S S 1 PPSS1 PPSS1字节、 P P S S 2 PPSS2 PPSS2字节和 P P S S 3 PPSS3 PPSS3字节不存在或存在。第7个比特保持为0。第3到第0个比特表示的值表明接口设备想和卡片进行通信而使用的协议。 P P S S 2 PPSS2 PPSS2的值表明接口设备想和卡片进行通信而使用的协议的参数 F F F和 D D D,其编码方式和 T A 1 TA_1 TA1一样。如果 P P S e x c h a n g e PPS\quad exchange PPSexchange过程成功的话, P P S e x c h a n g e PPS\quad exchange PPSexchange请求和响应的每一个字节数据应该一样,当然也可能有区别,至于细节的内容可以查看官方文档。
接下来就应该是具体的协议了,其实这部分还是挺多的,我接触的不多,就不准备继续写下去了。其实这里就像 I S O ISO ISO官方对 7816 7816 7816协议每部分的初始介绍一样,具体的协议应该就已经和具体的物理接口没有关系了。这里的 7816 − 3 7816-3 7816−3对应的是异步卡, 7816 − 10 7816-10 7816−10对应的是同步卡, 7816 − 12 7816-12 7816−12对应的是 U S B USB USB卡。我这里算是开了个头,如果以后想深入了解看官方文档就可以了。
s t m 32 stm32 stm32的 F 10 F10 F10系列芯片的 U S A R T USART USART模块有对 7816 − 3 7816-3 7816−3协议异步卡的支持,官方也给出了对应的 D E M O DEMO DEMO和库文件,如图10所示。有需要的可以利用其来开发一些简单的 D E M O DEMO DEMO。