张李静 张秋燕
摘 要:设计了智能卡操作系统底层驱动模块和FLASH读写模块,并提出针对这些模块函数的测试方案。首先介绍智能卡操作系统的基本概念和智能卡硬件的基本结构;然后以接触式智能卡为例,从芯片的硬件结构出发,提出COS操作系统通信和硬件模块以及操作系统的异常处理机制的设计方案,并提出一种操作系统底层的测试方案,即Testing COS。这里从COS性能的角度出发设计底层模块,并提出针对底层模块函数的测试方案。
关键词:操作系统;ISO7816-3;测试模块;Testing COS
中图分类号:TP368.1 文献标识码:A 文章编号:1004-373X(2009)04-027-04
Research on Design and Testing Scheme of Smart Card COS Chip Module
ZHANG Lijing,ZHANG Qiuyan
(Electronic and Communication Project Engineering,Tianjin University of Technology,Tianjin,300191,China)
Abstract:A bottom drive module of smart card and the read and write module of FLASH are designed,and a programme to test the functions of these modules is proposed.First,it introduces the basic concept of the COS and the basic construction of the chip′s hardware.Then,takes the contact chip as an example,proposes communication and hardware module and the anomaly handling mechanism of the COS based on the chip′s hardware.At the same time,it supplies a testing programme of bottom of the operating system,namely Testing COS.The bottom module is designed based on the performance of COS,and testing method of the bottom module is put forward.
Keywords:operating system;ISO7816-3;testing module;Testing COS
0 引 言
随着科学技术的不断进步,智能卡的应用已经越来越广泛,涉及到人类生活的各个领域,如商业、医疗、保险、交通、社会公共事业等多种领域,所以如何设计一个高效稳定的智能卡操作系统[1]具有较高的社会意义。这里针对智能卡的硬件结构设计了操作系统的通信和硬件其他模块[2],并提出了一种测试方案以检测芯片底层模块的稳定性。
1 智能卡操作系统概述
片内操作系统(Chip Operating System,COS)一般是紧紧围绕着它所服务的智能卡的特点而开发的[3]。与常见的微机上的操作系统相比,COS在本质上更加接近于监控程序[4]。在此以具体开发实例说明卡片操作系统的基本问题,并提出一种可行可测试的芯片层设计方案及一种芯片底层的测试方案。
2 COS芯片模块设计
COS底层模块在设计时一般都是紧密结合智能卡内存储器分区的情况,按照国际标准中所
规定的一些功能进行设计、开发。
ISO7816是接触式智能卡必须遵循的国际规范[5]。其中ISO7816-3主要描述接触式智能卡的电信号和传输协议,其中包括各个触点的电压电流承受范围、卡复位应答各个信息位的实际表示和T=0,T=1的传输协议。 ISO/IEC 7816-3规定了IC卡的电气特性和传输协议。包括该类卡和接口设备间的电源、电气信号协议和信息交换协议。通信过程中,由接口设备给IC卡提供电源(Vcc),复位信号(RST)和时钟(CLK),卡和接口设备间通过I/O端口进行串行通信。
(1)通信模块设计。
根据T=0异步半双工字符传输协议,IC卡和接口设备之间以字符为单位(简称字符帧)进行传输,采用偶校验,每个字符由10 b组成。传输字符帧之前,I/O线处于状态Z,第1 b为起始位(状态A);后面8 b为数据位D1~D8;第10 b为偶校验位,即8位数据和奇偶校验位中1的个数为偶数。
串行通信是按位传送的,每位信息宽度(持续时间)定义为基本时间单位ETU(Elementary Time Unit)。在复位应答期间的信息宽度称为“初始ETU”,它等于372个时钟周期,即1ETU=372/f。复位应答后的信息宽度称为“当前ETU”,其计算公式为:当前ETU=(F/D)(1/f)。其中:F是时钟频率变换因数;D是比特率调整因数;f是时钟频率。
IC卡必须与相应的读写设备(IFD)通信。从这个角度讲,智能IC卡操作系统的作用就是从读写设备(IFD)接收命令、执行命令并将结果返回读写设备(IFD)[6]。所以,通信管理功能模块在操作系统中具有十分重要的作用。通信管理功能模块主要实现以下几种功能:实现某一通信协议的数据链路层的传输管理功能;实现ISO/IEC 7816标准规定的ATR(复位响应)等功能;为操作系统中的其他功能模块提供相应接口。
按ISO/IEC 7816标准,IC卡和读写设备之间的通信协议有多种,一般一种卡片只支持某一种通信协议。下面以符合ISO/IEC 7816-3标准的T=0字符传输协议的智能IC卡为例介绍通信管理功能(支持其他通信协议的卡的通信管理功能与此相似)。
ICC上电之后,IFD将向ICC发送命令数据,在这样一次典型的通信过程中,通信管理功能主要从事6个步骤的具体工作。如图1所示。
以下是卡片接收指令相关的源代码:
BYTE General_Receive(void)
{
BYTE i,j,c1;
BYTE c2 =0;
BYTE XOR_PPS = 0;
WORD addr;
ccc:
CommandHead[0] = UART_IO_ReceiveByte(); //接收指令第1字节
if( (FlagByte & 0x80) == 0 )
{
if( CommandHead[0] == 0xff )//PPS选择
{
CommandHead[1] = UART_IO_ReceiveByte();//接收PPS0
i = 1;
if(CommandHead[1]&0x40) i++;
if(CommandHead[1]&0x20) i++;
if(CommandHead[1]&0x10) i++;
for(j=2;i>0;j++,i--)
{
if(j == 5)
{
XOR_PPS = UART_IO_ReceiveByte();
break;
}
CommandHead[j] = UART_IO_ReceiveByte();
}
i = j;
c1= 0;
for(j=0;j
c1 ^= CommandHead[j];
if( c1 ^ XOR_PPS) //如果PPS校验和错误,死锁
{
for(;;) ;
}
else
{
UART_IO_SendString(CommandHead,i); //回送PPS数据,表示支持94
if(j == 5)
UART_IO_SendByte(XOR_PPS);
UART_Set_Baud(CommandHead[2]); //更改BAUD参数设置
FlagByte = FlagByte | 0x80;//设置PPS有效标志
goto ccc;
}
}
}
FlagByte = FlagByte | 0x80;//设置PPS有效标志
for(i=1;i<5;i++) CommandHead[i]=UART_IO_ReceiveByte(); //不是PPS,继续接收后4字节指令头数据
c1 = API_JudgeClaIns();
if( c1 != 0 ) return c1; //判断CLA/INS
for(i=0;i<11;i++)
{
if(Command_INS== GetByte_C((ADWORD)(s2Command+i)) )
goto Receive_OK;//2S指令,5个头接完就返回
}
addr = GetSysWord(S2_COMMADDR);
c1 = GetSysByte(addr);
for( i = 0;i { if(Command_INS==GetSysByte(addr+1+i)) goto Receive_OK;//2S指令,5个头接完就返回 } UART_IO_SendByte(Command_INS);//3S指令,先回送INS再接后续数据 for(i=0;i CommandData[i]= UART_IO_ReceiveByte(); Receive_OK: UART_RunWaitingEtuTimer(0x01); //打开计时器 return 0; } (2) 硬件模块设计。 智能卡COS上电后首先要进行芯片初始化,其主要设置以下几个方面:芯片初始工作时的频率,以及使用外频还是内频;芯片串口初始工作的速率(一般为“11”的波特率);芯片串口的工作模式(包括T=0还是T=1协议,正向传输还是反向传输,奇校验还是偶校验等);存储器的初始映射方式。 智能卡芯片(以下以51系列智能卡芯片为例)一般包含几十到几百KB的FLASH,以1个页面为单位进行擦除,根据FLASH编程写的特点,也就是1能写成0,而0不能写成1,故在设计编程写函数时为了保证写数据的正确性,特采取如下的方式实现此功能: 第一步:取出要写入地址的数据(为A),与要写入的数据(为B)进行与操作(结果为C); 第二步:在要写入数据的地址写入数据(B); 第三步:取出写入数据后的地址的数据与数据C进行比较。 对于51系列智能卡芯片,由于标准的8051对程序存储器最大值支持64 KB,所以芯片采用BANK的编址方式[7]。这时往往需要一个映射函数来实现不同BANK的跳转。如果一款智能卡芯片的程序存储器采用128 KB的FLASH用来存放COS和用户数据。128 KB的FLASH均分4个32 KB的BANK,在这4个区域里,Commom区是3个Bnak的公共区域,即Commom区和每个32 KB的BANK都可以组成64 KB的连续空间。3个Bnak之间不能直接互相访问,而必须调用Commom区里的程序才能实现相互的访问[2]。所以在创建工程时要把经常使用的程序和常数,如中断入口函数、Bank Switch跳转表等都放到Commom区里,这样才能实现各个区域的相互访问。 (3) 异常保护模块设计。 ISO7816-3规定2个连续字符上升沿之间的延迟至少是12 ETU,且2个连续字符上升沿之间的延迟应不超过9 600 ETU。所以COS在设计时要加入发送“60”来实现正常的通信[8]。 发送“60”采用芯片定时器中断的方式,设置定时器的工作模式,使用时钟和的初始值。定时器的中断服务程序的实现流程:关闭发送“60”定时器;发送“60”;打开发送“60”定时器。 操作系统的异常处理,此函数为COS进行异常状态时调用的函数。进入异常状态时,要关闭发送“60”的定时器,然后进入死循环状态。 3 芯片测试方案设计 以下提出一种针对芯片模块函数的测试方案。即嵌入式Testing COS。 (1) Testing COS测试平台组成。 T-COS平台由MAIN.C文件、API.C文件、常量配置、A51文件以及芯片库、LIB文件组成。其中,针对不同的芯片,main.c,api.c是相同的,而常量配置文件和芯片库文件则不同,在使用时需要更改或更换。 另外,MAIN.C文件中的CommandInterpreter()命令解释器函数是对发送命令的识别解释(在此函数中,为所有需要测试的函数定义了指令吗)。被测函数的函数体在API.C文件中。芯片库在API.C文件中被具体调用。 此Testing COS可直接写入智能卡中,设计思路是:采用直接APDU指令调用的形式,直接调用硬件模块函数,如擦一页函数。执行完指令,函数返回一个状态字。 主程序是一个死循环,如下: void main(void) { UART_InitChip(); ClearRam(); //清全局变量 MakeATRSend(); //回送ATR(rom数据) //主程序循环 while (1) { if( (General_Receive() ) == 0 )//数据接收错误,直接返回错误码 { CommandInterpreter(); //命令解释器 } else { FlagByte = FlagByte & 0xfd; //接受数据错误,如果已经有返回数据标志位,清除 } MakeData();//回送数据
}
}
命令解释器函数支持多个函数,为用户对硬件的直接操作提供接口,可以通过发送APDU指令实现对芯片的多种操作[9]。
void CommandInterpreter()
{
switch(Command_INS)
{
case 0x00: g_bStatusByte = Api_ErasePage();break;
case 0x02: g_bStatusByte = Api_WriteByte();break;
case 0x06: g_bStatusByte = Api_Mem_Copy();break;
case 0x07: g_bStatusByte = Api_Mem_Set();break;
case 0x08: g_bStatusByte = Api_Mem_Cmp();break;
case 0x09: g_bStatusByte = Api_ReadByte();break;
case 0x0A: g_bStatusByte = Api_ReadWord();break;
case 0x0B: g_bStatusByte = Api_ReadTriByte();break;
case 0x0C: g_bStatusByte = Api_ReadData();break;
case 0x0D: g_bStatusByte = Api_ReadByte_C();break;
case 0x0E: g_bStatusByte = Api_ReadData_C();break;
case 0x16: g_bStatusByte = Api_PrgByte();break;
case 0x17: g_bStatusByte = Api_PrgData();break;
default : break;
}
}
例如:APDU:80 00 10 00 00 表示擦除地址0x1000所在页面。
APDU:80 0C 10 00 10 表示从地址0x1000开始读取长度为0x10的数据。
(2) Testing COS测试平台的使用。
T-COS测试平台测试流程,如图2所示:
(3) Testing COS测试平台局限性分析。
T-COS平台使用方便简洁,易于观察执行结果,但是其不能观察过程。因此,在返回结果与预期结果不一致,或者出现错误的情况下,无法判断产生错误的原因。在这种情况下,需要借助仿真器,跟踪执行过程,最终找出产生问题的原因。
4 结 语
智能卡操作系统根本的部分就在于芯片底层各个模块的稳固性。芯片层开发是电信、税控等产品开发的重要组成部分之一,也是最基础的部分。为了保证电信、税控产品可以在不同芯片之间的平稳移植,需要对芯片层的开发提出一定的要求和标准,这样可以保证上层开发的一致性。
参 考 文 献
[1]王爱英.智能卡技术.北京:清华大学出版社,1996.
[2][德]Rankl W.智能卡大全:智能卡的结构功能应用.北京:电子工业出版社,2002.
[3]张志刚,赵奎.智能卡操作系统研究和实例分析.企业技术开发,2005,24(9):20-22.
[4]亨德里.智能卡安全与应用.北京:人民邮电出版社,2002.
[5]International Standard ISO 7816-1,-2,-3,-4[S].Identification Cards:Integrated Circuits Cards with Contacts:1997.
[6]杨志峰,王志新.智能卡的操作系统:COS.现代电子技术,2005,28(8):91-93.
[7]李金良.智能卡操作系统(COS)编程语言及编译器系统设计与实现.中国集成电路,2005(11):67-69.
[8]李翔.智能卡研发技术与工程实践.北京:人民邮电出版社,2003.
[9]张利华.智能卡操作系统开发中的测试技术.计算机工程与设计,2004,25(6):901-902.
[10]李浩,谢桂海,王新锋,等.一种基于零知识证明的RFID鉴别协议.现代电子技术,2006,29(17):23-25.
作者简介 张李静 1983年出生,天津理工大学电子信息与通信工程学院硕士。
张秋燕 1949年出生,天津理工大学电子信息与通信工程学院教授,研究生导师。