非接触式CPU卡的空中传输协议的软硬件设计分析
普通的逻辑加密卡,如Mifare1卡(即M1卡),由非易失性存储器和硬件加密逻辑组成,通过校验密码的方式来保护卡内的数据,其具有一定的安全性,但这只是低层次的安全保护,无法防范恶意性的攻击,因此无法满足更高的安全性和更复杂的多应用的需求。而CPU卡内部具有微处理器芯片,且固化有COS操作系统,可执行严谨的加密运算,安全性极高,灵活性强,且存储容量大。来看一组金融领域的数据,截至2014年6月底,全国金融IC卡累计发行超过8.7亿张,其中上半年金融IC卡新增2.84亿张,占新增银行 卡总量的82%,商户POS和ATM实现全面受理,行业应用不断涌新。随着应用环境的日渐成熟,各商业银行将于年底前逐步关闭金融IC卡降级交易,并将在2015年后,发行纯芯片卡。可以看到,原本的磁条卡时代正在缓缓落幕,银行 卡“芯”时代已成大势所趋,与此同时,相应的终端机具需求量必将剧增,这给企业带来了巨大的商业契机。
本文在研究了ISO/IEC14443标准以及相关的金融标准基础上,基于RC632射频收发芯片,对非接触式CPU卡和终端机具之间通信所采用的空中传输协议进行了设计与实现,并进行有关测试,给出测试结果。
1 ISO14443协议简介
ISO14443协议是13.56MHz下非接触式IC卡的国际标准协议,由以下4部分组成:(1)物理特性:规定了接近式IC卡(PICC)的物理特性;(2)射频功率和信号接口:规定了在接近式耦合设备(PCD)和接近式IC卡(PICC)之间提供功率和双向通信的场的性质与特征;(3)初始化和防冲突:描述了PICC进入PCD工作场的轮询,规定了在PCD和PICC之间通信的初始阶段所使用的字节格式、帧格式和帧时序,以及在冲突发生的情况下如何从多张卡片中选出一张(防冲突)的方法;(4)传输协议:规定了非接触式应用中具有特色的半双工传输协议。随着应用场景的不断多元化,尤其是在快速消费领域,由于卡片和终端机具的需求量与日俱增,ISO14443协议应用也越来越广泛,像国内很多行业标准,如中国金融集成电路(IC)卡规范等,都是在它的基础上修订的。
2 系统硬件部分
2.1 MCU控制电路
本系统中MCU芯片我们选取STM32F103RBT6,它是基于Cortex-M3 ARM内核的高性能32位处理器,具有128KB Flash、20 KB SRAM,主频可达72 MHz,且具有功耗低、价格便宜、接口资源丰富等特点;与传统的8位单片机相比,32位的高性能ARM处理器拥有更高的通信效率、更强的控制功能,更加方便后期的系统扩展。
2.2 射频收发电路
射频收发电路是本系统的核心部分,由RC632应用电路和天线组成。RC632是NXP推出的一款多协议非接触式读写芯片,集成了在13.56MHz下所有类型的被动非接触式通信方式和协议,也就是说它支持ISO14443(包括Type A和Type B)和ISO15693(包括I·CODE1)两种国际标准。它的发送器电路设计成具有非常低的阻抗,只需要很少的用于匹配和滤波的无源器件就可以直接驱动天线,操作卡片的距离可达10cm,其引脚TX1和TX2上传递的信号是由包络信号调制的13.56MHz的载波信号,这两个信号可通过寄存器TxControl进行控制;它的接收器设计有一个正交调制电路,该电路从输入到RX引脚的13.56MHz的ASK调制信号中解析出副载波信号,该副载波信号经过放大滤波,然后输入到相关性电路,对相关性结果数字化后输入到数字电路。方便的并行接口可直接连接到任何8位微处理器,这给读写器及终端的设计带来了极大的灵活性;另外,RC632支持通过SPI方式连接到微处理器。
本系统中我们采用SPI的方式将RC632连接到MCU,其原理图如图1所示。图中的MOSI_rf,MISO_rf,SCK_rf,NSS_rf四个脚需连接到MCU的SPI外设,C16f,C17f两端的GND_rf网络是需要绘制天线线圈(天线的设计不在本文范围内)的。硬件焊接调试完成后,其实物图如图2所示。
图1 射频收发电路
3 系统软件部分
与M1卡一样,非接触式CPU卡(以后称PICC)符合ISO14443-1、-2、-3标准,不同的是它通过RATS命令可进入到CPU模式,以后都按照ISO14443-4的块传输协议与读写设备(以后称PCD)进行信息交互。PCD访问PICC的工作流程如图3所示,激活CPU卡的过程总共包括寻卡,防冲突,寻卡,RATS四步,其中RATS是在判断选卡命令的响应支持ISO14443-4标准的情况下发送的,以便进入CPU模式。
图3 读写设备访问卡片工作流程
根据OSI参考模型分层原理设计的思想,对PCD和PICC之间的半双工块传输协议进行概况,可抽象出三层,如图4所示。物理层处在该层次结构的最底层,它利用空中射频信道为上层协议提供了一个传输数据的物理媒介,在这一层数据的单位是bit;数据链路层起着承上启下的作用,它负责在物理层提供的传输媒介上将应用层的数据加工后发送出去;应用层则是提供符合某行业标准的APDU命令。由于应用层和数据链路层联系很紧密,故本节将二者合并为协议层加以介绍。
图4 半双工传输协议软件设计的层次划分
3.1 物理层设计
物理层的实现在双方通信过程中起着“桥梁”的作用,本系统中“担此重任”的角色就是射频收发芯片RC632。在程序初始化时,配置RC632的相关寄存器,使芯片工作在ISO14443 Type A模式;而针对不同的传输要求,需及时调整相关寄存器的值,使PCD和PICC之间的底层“对话”按照规定的比特流进行,比如通信采用短帧还是标准帧可通过调整BitFraming寄存器,有无奇偶校验或者CRC校验可通过调整ChannelRedundancy寄存器。RC632的状态由可执行特定命令集的内部状态机决定,这些命令通过将相应的命令码写入到Command寄存器来启动。本系统中主要用到了Transceive指令,其指令码是0x1E,该指令从FIFO缓冲区中取出数据并送到发送器发送出去,接收器在间隔约定时间后自动启动,所有从RF接口接收到的数据再通过FIFO缓冲区返回;而处理一个命令所需要的变量或者数据则要通过FIFOData寄存器写入到FIFO缓冲区,然后进行交换。概况起来,RC632的射频收发过程如下:在Idle命令有效时,将所有要发送到卡片的数据通过FIFOData寄存器写入到FIFO,之后将Transceive指令码写入到Command寄存器来启动收发过程,然后再通过FIFOData寄存器从FIFO中取出返回的数据。
3.2 协议层设计
要运行一个应用,还需要在终端上实现一个附加的应用协议层,这个协议层包括向卡片发送命令、卡片内处理命令和返回IC卡处理响应等步骤。应用层发出的命令报文和卡片返回到应用层的响应报文统称为应用协议数据单元(APDU);响应是和命令相对应的,通常被称为APDU命令-响应对;在一个APDU命令-响应对中,命令报文(C-APDU)或响应报文(R-APDU)都可能包含数据[4]。
C-APDU由4字节长的必备头和变长的条件体构成,如图5所示。其中,CLA表示指令类型,INS表示指令码,P1表示指令参数1,P2表示指令参数2,Lc表示命令数据域中发送的数据字节数,Data表示命令发送的数据串,Le表示期望返回的数据字节数。当Le存在且值为0时,表示需要最大字节数(256字节);在命令报文需要时,Le可始终被设为‘00’。
R-APDU由变长的条件体和两字节长的必备尾组成,如图6所示。其中,Data表示响应中接收的数据串,SW1、SW2表示卡片执行命令的返回代码。当SW1的高半字节为‘9’,且低半字节不为‘0’时,其含义依赖于相关应用;当SW1的高半字节为‘6’,且低半字节不为‘0’时,其含义与应用无关[5]。
图6 R-APDU 格式
PCD和PICC之间的半双工协议支持块格式传输,块格式由一个开始域(强制),一个信息域(可选),一个结束域(强制)组成,如图7所示。其中,方括号中的数据为可选数据。本系统开始域中只含有强制的PCB(协议控制字节),信息域中的数据是基于某行业标准的APDU命令,结束域则是CRC校验,该校验值可由射频芯片RC632自动产生。
图7 块格式
协议控制字节PCB用于传送控制数据传输所需要的信息,它的设计实现在本程序中起着至关重要的作用。根据PCB编码的不同,协议定义了块的三种基本类型:用于为应用层的使用传送信息的信息块(I-块);用于传送确认或不确认的接收准备块(R-块);用于在 PCD 和 PICC 间交换控制信息的管理块(S-块)。PCB的编码依赖于它的类型,具体可参看协议ISO14443-4。需要详述的是这样一个关键点:I-块和R-块的PCB中最低位表示块号,它遵循如图8所示的特定的编码规则。具体描述如下:(1) PCD规则:对于当前被激活的PICC,PCD块编号应初始化为0;当接收到一个块编号与当前块编号相等的正确的I块或正确的R-块(ACK)时,PCD在发送任意一个块之前,应反转当前的PICC块编号。
(2) PICC规则:在激活时,PICC块编号应初始化为1;当接收到一个I-块,PICC应在接收I-块之后立即反转它的块编号;当接收到一个块编号不等于目前的PICC的块编号的R-块(ACK)时,PICC应在接收R-块(ACK)之后立即反转它的块编号。
图8 PCB中块编号规则
关键部分代码如下:
void APDU_Handle(u8 *APDU_Data)
{
if((APDU_Data[0]&PCB_BlkNo_Mask)==Blk_Info.PCB_BlkNo)
{Blk_Info.PCB_BlkNo ^= PCB_BlkNo_Mask;} //反转块号
else { return; } //块号不对!
switch(APDU_Data[0]&PCB_Type_Mask)
{
case 0x00: //收到I块
{
if(!(APDU_Data[0]&I_PCB_Link_Mask))
{ }//PICC发送的最后一块数据,后续无链接
else
{ }//PICC分段发送响应数据,后续有链接。PCD需要发送R-块确认
break;
}
case 0x80: //收到R块
{
//说明PCD分段发送请求数据,需通过链接位。
break;
}
case 0xC0: //收到S块
{
if((APDU_Data[0]&0x30)==0x30) //PICC请求等待时间扩展
{
//以后的等待超时时间(Timeout)需要随之改变!
}
break;
}
default:
{ break; }
}
}
4 测试
我们选取复旦微电子的非接触式CPU卡做测试。点击“寻找卡片”,依次执行图3中的寻卡,防冲突,选卡等三个步骤,获得卡片序列号和卡片类型;点击“RATS”,发送选择应答请求来激活CPU模式,PICC返回ATS响应“107880B0022090000000000026BAB4A2”,具体含义如表1所示;发送表2所示的取随机数指令,PICC返回表3所示的四字节随机数;发送表4所示的选择MF主文件命令,PICC返回表5所示的嵌套TLV格式的文件控制信息(FCI)。测试效果图如图9所示。
图9 上位机测试效果图
结语
本文硬件电路采用ARM内核的32位微处理器芯片STM32F103RBT6和NXP公司的RC632来完成,软件开发则从物理层和协议层两个层面对PCD和PICC之间的无线射频通信进行设计实现。经实际测试证明,该读写设备工作稳定,抗干扰能力强,读卡准确且操作距离大于5cm。由此可见,对空中传输协议进行了较好的实现。另外,还可以进行扩展改进,如增加GPRS模块再结合相关的非接触式IC卡支付规范,便可实现方便快捷的移动支付。