1-数据传输格式和初始化
对于刚接触智能卡的工程师来说,在阅读7816-3规范的时候,常常被其中的一些术语迷惑,读起来会觉得有些别扭。尤其是在看到复位应答中的F和D设置以及对应的etu的时候,会觉得有些复杂和难以理解。
其实从本质上说7816-3定义了智能卡(这里指的是接触式CPU卡,对于逻辑加密卡以及非接触IC卡不在此列)和读写设备之间的通讯协议,说白了就是数据位传输的格式。
如果学习或者接触过单片机,那么对于RS232一定不会陌生,它属于异步串行通讯接口(UART),通过RxD、TxD进行数据的收发,RS232曾经是PC机的标配,但是目前在多数PC上基本不复存在了(当然还可以通过USB-232转换器来扩展)。
接下来我们看看7816-3定义的通讯协议,其实基本上可以说是RS232的翻版并在此基础上进行的改进,7816中只有一个IO同时兼具数据收发的功能,这点和RS232用RxD和TxD进行数据收发是不同的。在RS232中我们有9600波特率、起始位、奇偶校验位、停止位这些概念,而在7816-3中都完整地保留了下来,只不过7816-3中引入了etu,没有使用bps(其实1etu=1 / 1bps),但是基本原理是一致的。etu的定义可以更加精确地描述每个数据位在传输过程中收发双方的职责和角色转换。
根据定义在智能卡上电复位的时候 1 etu = 372 / f(372=F/D,下一段讲到) ,其中f = 读写设备通过CLK管脚提供给智能卡的时钟频率,通常在1--5 MHz(自己分频的时候注意范围)之间。etu的单位是时间单位秒(毫秒、微秒),等同于传输每个数据位所需的时间。对其取倒数得出来的就是每秒传输的数据位,也就是bps。我们取f = 3.579545 MHz,用3579545除以372结果等于9622.4约为9600 bps。
通用的etu计算公式: 1 etu = (F / D) * (1 / f) ,F和D的值根据7816-3规范中的约定来进行设置。对于上电复位时的取值 F = 372,D = 1即作为默认值Fd和Dd。如果智能卡支持其他速率则需要在ATR中的TA1来指出其他的F和D的值,比如设定F=372,可以把D分别设定为2/4,那么智能卡能支持的通讯速率可以分别为19200/38400。
由此可见,这些参数的选择都是为了能够更好地利用当时既有的标准和技术,要知道7816-3在1989年的时候就已经制定了,按照当时的主流PC机配置把串口速率设为9600,用一个232接口芯片(比如Max232)再加上3.579545MHz的晶振,再配合几片74系列的门电路外加5伏的直流电源和几个阻容器件,这就是最基本的RS232串口读卡器了(当然这是指上个世纪80年代的时候,对于现在的智能卡芯片设计技术而言实现任意分频的控制都不是问题了,如下笔者操作的就是一个实际的例子)。
7816-3定义了智能卡和读写设备之间的通讯协议,说白了就是数据位传输的格式。ISO 7816-4规范有定义APDU(= ApplicationProtocol data unit, 是智能卡与智能卡读卡器之间传送的信息单元, (给智能卡发送的命令)指令)
2-APDU常用指令
APDU格式:
CLA | INS | P1 | P2 | Lc | Data | Le |
其中:
CLA为指令类别;INS为指令码;P1、P2为参数;Lc为Data的长度;Le为希望响应时回答的数据字节数,0表最大可能长度。
举例子:
00A4040000:发送一个空的选择命令,获取卡和主安全域的信息。 00A40400是select选择对应的CLA,INS,P1和P2,后面2位是发送的文件名的长度。此命令使用文件名或应用标示符来选择IC卡内DF(专用文件)或EF(基本文件)。
eg-1:80此命令创建卡片文件系统,
80CA9F7F00:获取CPLC信息。
8050XXXXX: 双向认证并建立会话密钥。
eg-2:非接触CPU卡(智能卡)应该支持以下与应用无关的常用指令命令:
比如在PSAM卡上的要求也是按照apdu协议的操作来 定制协议的:
比如,SIM卡使用的APDU指令操作:
一个APDU可以是一个命令,也可以是命令的响应。
命令APDU的一般格式: CLA INS P1 P2 P3 Data
响应APDU的一般格式: Data SW1 SW2
意义如下:
输入:CLA: 是指令类型,GSM应用为0xA0。INS:每个命令的指令编码,P1,P2,P3:指令参数。0xFF是个无效值,P3给出了数据单元的长度。对于传送命令,当SIM 流出数据时,P3=0表示数据的长度为256,而SIM 流入数据时P3=0表 示没有数据。
响应:SW1,SW2:命令结果是否成功的状态。
响应指令的5种情况:
情况1:没有输入/没有输出 CLA INS P1 P2 P3(lgth=0x00) ==>SW1=0x90 SW2=0x00
情况2:没有输入/输出长度已知 CLA INS P1 P2 P3(长度值lgth) DATA(长度为lgth) ==>SW1=0x90 SW2=0x00
情况3:没有输入/输出长度未知 CLA INS P1 P2 P3(lgth=0)==>SW1=0x9F SW2=lgth1
GET RESPONSE CLA INS P1 P2 P3(lgth2) DATA(长度leth1<=leth2) ==> SW1=0x90 SW2=0x00
情况4:有输入/没有输出 CLA INS P1 P2 P3(lgth) DATA(长度为lgth) ==>SW1=0x90 SW2=0
情况5:有输入/输出长度未知或已知 CLA INS P1 P2 P3(lgth) DATA(长度为lgth)==>SW1=0x9F SW2=lgth1
GET RESPONSE CLA INS P1 P2 P3(lgth2) DATA(长度lgth2<=lgth1)==>SW1=0x90 SW2=0x00
参考:https://www.cnblogs.com/hbtmwangjin/articles/8760199.html