張李靜 張秋燕
摘 要:設(shè)計(jì)了智能卡操作系統(tǒng)底層驅(qū)動(dòng)模塊和FLASH讀寫(xiě)模塊,并提出針對(duì)這些模塊函數(shù)的測(cè)試方案。首先介紹智能卡操作系統(tǒng)的基本概念和智能卡硬件的基本結(jié)構(gòu);然后以接觸式智能卡為例,從芯片的硬件結(jié)構(gòu)出發(fā),提出COS操作系統(tǒng)通信和硬件模塊以及操作系統(tǒng)的異常處理機(jī)制的設(shè)計(jì)方案,并提出一種操作系統(tǒng)底層的測(cè)試方案,即Testing COS。這里從COS性能的角度出發(fā)設(shè)計(jì)底層模塊,并提出針對(duì)底層模塊函數(shù)的測(cè)試方案。
關(guān)鍵詞:操作系統(tǒng);ISO7816-3;測(cè)試模塊;Testing COS
中圖分類號(hào):TP368.1 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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 引 言
隨著科學(xué)技術(shù)的不斷進(jìn)步,智能卡的應(yīng)用已經(jīng)越來(lái)越廣泛,涉及到人類生活的各個(gè)領(lǐng)域,如商業(yè)、醫(yī)療、保險(xiǎn)、交通、社會(huì)公共事業(yè)等多種領(lǐng)域,所以如何設(shè)計(jì)一個(gè)高效穩(wěn)定的智能卡操作系統(tǒng)[1]具有較高的社會(huì)意義。這里針對(duì)智能卡的硬件結(jié)構(gòu)設(shè)計(jì)了操作系統(tǒng)的通信和硬件其他模塊[2],并提出了一種測(cè)試方案以檢測(cè)芯片底層模塊的穩(wěn)定性。
1 智能卡操作系統(tǒng)概述
片內(nèi)操作系統(tǒng)(Chip Operating System,COS)一般是緊緊圍繞著它所服務(wù)的智能卡的特點(diǎn)而開(kāi)發(fā)的[3]。與常見(jiàn)的微機(jī)上的操作系統(tǒng)相比,COS在本質(zhì)上更加接近于監(jiān)控程序[4]。在此以具體開(kāi)發(fā)實(shí)例說(shuō)明卡片操作系統(tǒng)的基本問(wèn)題,并提出一種可行可測(cè)試的芯片層設(shè)計(jì)方案及一種芯片底層的測(cè)試方案。
2 COS芯片模塊設(shè)計(jì)
COS底層模塊在設(shè)計(jì)時(shí)一般都是緊密結(jié)合智能卡內(nèi)存儲(chǔ)器分區(qū)的情況,按照國(guó)際標(biāo)準(zhǔn)中所
規(guī)定的一些功能進(jìn)行設(shè)計(jì)、開(kāi)發(fā)。
ISO7816是接觸式智能卡必須遵循的國(guó)際規(guī)范[5]。其中ISO7816-3主要描述接觸式智能卡的電信號(hào)和傳輸協(xié)議,其中包括各個(gè)觸點(diǎn)的電壓電流承受范圍、卡復(fù)位應(yīng)答各個(gè)信息位的實(shí)際表示和T=0,T=1的傳輸協(xié)議。 ISO/IEC 7816-3規(guī)定了IC卡的電氣特性和傳輸協(xié)議。包括該類卡和接口設(shè)備間的電源、電氣信號(hào)協(xié)議和信息交換協(xié)議。通信過(guò)程中,由接口設(shè)備給IC卡提供電源(Vcc),復(fù)位信號(hào)(RST)和時(shí)鐘(CLK),卡和接口設(shè)備間通過(guò)I/O端口進(jìn)行串行通信。
(1)通信模塊設(shè)計(jì)。
根據(jù)T=0異步半雙工字符傳輸協(xié)議,IC卡和接口設(shè)備之間以字符為單位(簡(jiǎn)稱字符幀)進(jìn)行傳輸,采用偶校驗(yàn),每個(gè)字符由10 b組成。傳輸字符幀之前,I/O線處于狀態(tài)Z,第1 b為起始位(狀態(tài)A);后面8 b為數(shù)據(jù)位D1~D8;第10 b為偶校驗(yàn)位,即8位數(shù)據(jù)和奇偶校驗(yàn)位中1的個(gè)數(shù)為偶數(shù)。
串行通信是按位傳送的,每位信息寬度(持續(xù)時(shí)間)定義為基本時(shí)間單位ETU(Elementary Time Unit)。在復(fù)位應(yīng)答期間的信息寬度稱為“初始ETU”,它等于372個(gè)時(shí)鐘周期,即1ETU=372/f。復(fù)位應(yīng)答后的信息寬度稱為“當(dāng)前ETU”,其計(jì)算公式為:當(dāng)前ETU=(F/D)(1/f)。其中:F是時(shí)鐘頻率變換因數(shù);D是比特率調(diào)整因數(shù);f是時(shí)鐘頻率。
IC卡必須與相應(yīng)的讀寫(xiě)設(shè)備(IFD)通信。從這個(gè)角度講,智能IC卡操作系統(tǒng)的作用就是從讀寫(xiě)設(shè)備(IFD)接收命令、執(zhí)行命令并將結(jié)果返回讀寫(xiě)設(shè)備(IFD)[6]。所以,通信管理功能模塊在操作系統(tǒng)中具有十分重要的作用。通信管理功能模塊主要實(shí)現(xiàn)以下幾種功能:實(shí)現(xiàn)某一通信協(xié)議的數(shù)據(jù)鏈路層的傳輸管理功能;實(shí)現(xiàn)ISO/IEC 7816標(biāo)準(zhǔn)規(guī)定的ATR(復(fù)位響應(yīng))等功能;為操作系統(tǒng)中的其他功能模塊提供相應(yīng)接口。
按ISO/IEC 7816標(biāo)準(zhǔn),IC卡和讀寫(xiě)設(shè)備之間的通信協(xié)議有多種,一般一種卡片只支持某一種通信協(xié)議。下面以符合ISO/IEC 7816-3標(biāo)準(zhǔn)的T=0字符傳輸協(xié)議的智能IC卡為例介紹通信管理功能(支持其他通信協(xié)議的卡的通信管理功能與此相似)。
ICC上電之后,IFD將向ICC發(fā)送命令數(shù)據(jù),在這樣一次典型的通信過(guò)程中,通信管理功能主要從事6個(gè)步驟的具體工作。如圖1所示。
以下是卡片接收指令相關(guān)的源代碼:
BYTE General_Receive(void)
{
BYTE i,j,c1;
BYTE c2 =0;
BYTE XOR_PPS = 0;
WORD addr;
ccc:
CommandHead[0] = UART_IO_ReceiveByte(); //接收指令第1字節(jié)
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校驗(yàn)和錯(cuò)誤,死鎖
{
for(;;) ;
}
else
{
UART_IO_SendString(CommandHead,i); //回送PPS數(shù)據(jù),表示支持94
if(j == 5)
UART_IO_SendByte(XOR_PPS);
UART_Set_Baud(CommandHead[2]); //更改BAUD參數(shù)設(shè)置
FlagByte = FlagByte | 0x80;//設(shè)置PPS有效標(biāo)志
goto ccc;
}
}
}
FlagByte = FlagByte | 0x80;//設(shè)置PPS有效標(biāo)志
for(i=1;i<5;i++) CommandHead[i]=UART_IO_ReceiveByte(); //不是PPS,繼續(xù)接收后4字節(jié)指令頭數(shù)據(jù)
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個(gè)頭接完就返回
}
addr = GetSysWord(S2_COMMADDR);
c1 = GetSysByte(addr);
for( i = 0;i { if(Command_INS==GetSysByte(addr+1+i)) goto Receive_OK;//2S指令,5個(gè)頭接完就返回 } UART_IO_SendByte(Command_INS);//3S指令,先回送INS再接后續(xù)數(shù)據(jù) for(i=0;i CommandData[i]= UART_IO_ReceiveByte(); Receive_OK: UART_RunWaitingEtuTimer(0x01); //打開(kāi)計(jì)時(shí)器 return 0; } (2) 硬件模塊設(shè)計(jì)。 智能卡COS上電后首先要進(jìn)行芯片初始化,其主要設(shè)置以下幾個(gè)方面:芯片初始工作時(shí)的頻率,以及使用外頻還是內(nèi)頻;芯片串口初始工作的速率(一般為“11”的波特率);芯片串口的工作模式(包括T=0還是T=1協(xié)議,正向傳輸還是反向傳輸,奇校驗(yàn)還是偶校驗(yàn)等);存儲(chǔ)器的初始映射方式。 智能卡芯片(以下以51系列智能卡芯片為例)一般包含幾十到幾百KB的FLASH,以1個(gè)頁(yè)面為單位進(jìn)行擦除,根據(jù)FLASH編程寫(xiě)的特點(diǎn),也就是1能寫(xiě)成0,而0不能寫(xiě)成1,故在設(shè)計(jì)編程寫(xiě)函數(shù)時(shí)為了保證寫(xiě)數(shù)據(jù)的正確性,特采取如下的方式實(shí)現(xiàn)此功能: 第一步:取出要寫(xiě)入地址的數(shù)據(jù)(為A),與要寫(xiě)入的數(shù)據(jù)(為B)進(jìn)行與操作(結(jié)果為C); 第二步:在要寫(xiě)入數(shù)據(jù)的地址寫(xiě)入數(shù)據(jù)(B); 第三步:取出寫(xiě)入數(shù)據(jù)后的地址的數(shù)據(jù)與數(shù)據(jù)C進(jìn)行比較。 對(duì)于51系列智能卡芯片,由于標(biāo)準(zhǔn)的8051對(duì)程序存儲(chǔ)器最大值支持64 KB,所以芯片采用BANK的編址方式[7]。這時(shí)往往需要一個(gè)映射函數(shù)來(lái)實(shí)現(xiàn)不同BANK的跳轉(zhuǎn)。如果一款智能卡芯片的程序存儲(chǔ)器采用128 KB的FLASH用來(lái)存放COS和用戶數(shù)據(jù)。128 KB的FLASH均分4個(gè)32 KB的BANK,在這4個(gè)區(qū)域里,Commom區(qū)是3個(gè)Bnak的公共區(qū)域,即Commom區(qū)和每個(gè)32 KB的BANK都可以組成64 KB的連續(xù)空間。3個(gè)Bnak之間不能直接互相訪問(wèn),而必須調(diào)用Commom區(qū)里的程序才能實(shí)現(xiàn)相互的訪問(wèn)[2]。所以在創(chuàng)建工程時(shí)要把經(jīng)常使用的程序和常數(shù),如中斷入口函數(shù)、Bank Switch跳轉(zhuǎn)表等都放到Commom區(qū)里,這樣才能實(shí)現(xiàn)各個(gè)區(qū)域的相互訪問(wèn)。 (3) 異常保護(hù)模塊設(shè)計(jì)。 ISO7816-3規(guī)定2個(gè)連續(xù)字符上升沿之間的延遲至少是12 ETU,且2個(gè)連續(xù)字符上升沿之間的延遲應(yīng)不超過(guò)9 600 ETU。所以COS在設(shè)計(jì)時(shí)要加入發(fā)送“60”來(lái)實(shí)現(xiàn)正常的通信[8]。 發(fā)送“60”采用芯片定時(shí)器中斷的方式,設(shè)置定時(shí)器的工作模式,使用時(shí)鐘和的初始值。定時(shí)器的中斷服務(wù)程序的實(shí)現(xiàn)流程:關(guān)閉發(fā)送“60”定時(shí)器;發(fā)送“60”;打開(kāi)發(fā)送“60”定時(shí)器。 操作系統(tǒng)的異常處理,此函數(shù)為COS進(jìn)行異常狀態(tài)時(shí)調(diào)用的函數(shù)。進(jìn)入異常狀態(tài)時(shí),要關(guān)閉發(fā)送“60”的定時(shí)器,然后進(jìn)入死循環(huán)狀態(tài)。 3 芯片測(cè)試方案設(shè)計(jì) 以下提出一種針對(duì)芯片模塊函數(shù)的測(cè)試方案。即嵌入式Testing COS。 (1) Testing COS測(cè)試平臺(tái)組成。 T-COS平臺(tái)由MAIN.C文件、API.C文件、常量配置、A51文件以及芯片庫(kù)、LIB文件組成。其中,針對(duì)不同的芯片,main.c,api.c是相同的,而常量配置文件和芯片庫(kù)文件則不同,在使用時(shí)需要更改或更換。 另外,MAIN.C文件中的CommandInterpreter()命令解釋器函數(shù)是對(duì)發(fā)送命令的識(shí)別解釋(在此函數(shù)中,為所有需要測(cè)試的函數(shù)定義了指令嗎)。被測(cè)函數(shù)的函數(shù)體在API.C文件中。芯片庫(kù)在API.C文件中被具體調(diào)用。 此Testing COS可直接寫(xiě)入智能卡中,設(shè)計(jì)思路是:采用直接APDU指令調(diào)用的形式,直接調(diào)用硬件模塊函數(shù),如擦一頁(yè)函數(shù)。執(zhí)行完指令,函數(shù)返回一個(gè)狀態(tài)字。 主程序是一個(gè)死循環(huán),如下: void main(void) { UART_InitChip(); ClearRam(); //清全局變量 MakeATRSend(); //回送ATR(rom數(shù)據(jù)) //主程序循環(huán) while (1) { if( (General_Receive() ) == 0 )//數(shù)據(jù)接收錯(cuò)誤,直接返回錯(cuò)誤碼 { CommandInterpreter(); //命令解釋器 } else { FlagByte = FlagByte & 0xfd; //接受數(shù)據(jù)錯(cuò)誤,如果已經(jīng)有返回?cái)?shù)據(jù)標(biāo)志位,清除 } MakeData();//回送數(shù)據(jù)
}
}
命令解釋器函數(shù)支持多個(gè)函數(shù),為用戶對(duì)硬件的直接操作提供接口,可以通過(guò)發(fā)送APDU指令實(shí)現(xiàn)對(duì)芯片的多種操作[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所在頁(yè)面。
APDU:80 0C 10 00 10 表示從地址0x1000開(kāi)始讀取長(zhǎng)度為0x10的數(shù)據(jù)。
(2) Testing COS測(cè)試平臺(tái)的使用。
T-COS測(cè)試平臺(tái)測(cè)試流程,如圖2所示:
(3) Testing COS測(cè)試平臺(tái)局限性分析。
T-COS平臺(tái)使用方便簡(jiǎn)潔,易于觀察執(zhí)行結(jié)果,但是其不能觀察過(guò)程。因此,在返回結(jié)果與預(yù)期結(jié)果不一致,或者出現(xiàn)錯(cuò)誤的情況下,無(wú)法判斷產(chǎn)生錯(cuò)誤的原因。在這種情況下,需要借助仿真器,跟蹤執(zhí)行過(guò)程,最終找出產(chǎn)生問(wèn)題的原因。
4 結(jié) 語(yǔ)
智能卡操作系統(tǒng)根本的部分就在于芯片底層各個(gè)模塊的穩(wěn)固性。芯片層開(kāi)發(fā)是電信、稅控等產(chǎn)品開(kāi)發(fā)的重要組成部分之一,也是最基礎(chǔ)的部分。為了保證電信、稅控產(chǎn)品可以在不同芯片之間的平穩(wěn)移植,需要對(duì)芯片層的開(kāi)發(fā)提出一定的要求和標(biāo)準(zhǔn),這樣可以保證上層開(kāi)發(fā)的一致性。
參 考 文 獻(xiàn)
[1]王愛(ài)英.智能卡技術(shù).北京:清華大學(xué)出版社,1996.
[2][德]Rankl W.智能卡大全:智能卡的結(jié)構(gòu)功能應(yīng)用.北京:電子工業(yè)出版社,2002.
[3]張志剛,趙奎.智能卡操作系統(tǒng)研究和實(shí)例分析.企業(yè)技術(shù)開(kāi)發(fā),2005,24(9):20-22.
[4]亨德里.智能卡安全與應(yīng)用.北京:人民郵電出版社,2002.
[5]International Standard ISO 7816-1,-2,-3,-4[S].Identification Cards:Integrated Circuits Cards with Contacts:1997.
[6]楊志峰,王志新.智能卡的操作系統(tǒng):COS.現(xiàn)代電子技術(shù),2005,28(8):91-93.
[7]李金良.智能卡操作系統(tǒng)(COS)編程語(yǔ)言及編譯器系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn).中國(guó)集成電路,2005(11):67-69.
[8]李翔.智能卡研發(fā)技術(shù)與工程實(shí)踐.北京:人民郵電出版社,2003.
[9]張利華.智能卡操作系統(tǒng)開(kāi)發(fā)中的測(cè)試技術(shù).計(jì)算機(jī)工程與設(shè)計(jì),2004,25(6):901-902.
[10]李浩,謝桂海,王新鋒,等.一種基于零知識(shí)證明的RFID鑒別協(xié)議.現(xiàn)代電子技術(shù),2006,29(17):23-25.
作者簡(jiǎn)介 張李靜 1983年出生,天津理工大學(xué)電子信息與通信工程學(xué)院碩士。
張秋燕 1949年出生,天津理工大學(xué)電子信息與通信工程學(xué)院教授,研究生導(dǎo)師。