一種JavaCard庫包后下載的方法
作者/ 許晶1,2 王于波1,2 張彥杰1,2 袁艷芳1,2 付青琴1,2
本文引用地址:http://www.j9360.com/article/201610/311929.htm1.北京智芯微電子科技有限公司 國家電網公司重點實驗室 電力芯片設計分析實驗室(北京100192)
2.北京智芯微電子科技有限公司 北京市電力高可靠性集成電路設計工程技術研究中心(北京100192)
摘要: JavaCard將標準API的定義引入了嵌入式開發,這帶來了平臺和應用開發的分離,使得開發更為便利。而當發行后的平臺有新增功能的需求時,需要考慮在平臺還是應用層來進行實現。如需在每個應用中進行實現,代碼會冗余、空間占用會增大;如采用傳統的補丁方式,實現又有較多限制。在避免重新掩膜的情況下,本文提出一種后下載庫包的方法,將新增功能定義為庫包,庫包的實現采用Java包的方式,在平臺上先下載實現好的庫包,再下載調用庫包的應用。驗證表明,該方法具有節省空間、方便實現以及節省成本等優點。
引言
由于具有靈活性和安全性,JAVA卡在智能卡領域的應用越來越多。當一張JAVA卡發行后,如果多個應用需要調用同一個功能模塊,現有的辦法是在每個應用(JavaCard Applet)中實現此功能。這將導致空間占用的增加,在存儲資源有限的情況下,會使得JAVA卡上支持的應用個數減少。如果使用補丁機制將此功能模塊做成智能卡的補丁,開發一個完整的功能模塊會受到補丁機制的靈活性限制。如要重新進行卡片掩膜,又將涉及到成本的增加。
本文將有類似需求的功能模塊作為JAVA卡的一個外部庫包,每個應用不需要單獨實現這些功能,而采用調用新增的庫包的方式,減少了空間的占用。庫包實現方式靈活,便于快速開發。在ROM掩膜的平臺上,也免除了重新掩膜的成本。試驗結果證明,此方法能具有很好的靈活性和安全性,并節省了智能卡的空間。
1 JAVA卡平臺和應用開發模式
1.1 傳統的智能卡平臺應用開發模式
傳統智能卡COS開發時,平臺和應用通常是由一個廠商開發的[1]。平臺負責實現底層芯片驅動、算法模塊及文件系統等功能。應用實現滿足行業規范的開卡、交易流程及安全機制等,比如裝載密鑰、內部認證、加解密等功能。如圖1所示,各行業發布規范,各智能卡廠商根據規范開發出多款產品,每一款產品都有單獨的平臺和行業應用,以提供給不同的行業進行商用。
1.2 JAVA卡平臺應用開發模式
隨著越來越多的行業開始使用智能卡,人們對一張卡上集成多個應用的需求也隨之增長[2]。90年代開始,多應用芯片卡開放系統陸續出現。其中使用最為廣泛的就是JavaCard平臺[3]。JAVA卡的平臺和應用完全分離。一張搭載JAVA卡平臺的卡片,能夠在平臺發行后再下載應用,這是JAVA卡比使用本地語言如C語言的Native卡有著更為便利的優勢,一張JAVA卡能夠適應不同的應用場景,而不需要開發多個版本的COS(Chip Operation System,片上操作系統)[4]。
而平臺和應用的分離是通過統一的API來實現的。JAVA卡API是JAVA卡運行環境的重要組成部分之一[5],它提供了一套統一的、基于國際標準的、用于應用開發的編程接口,包括I/O接口、異常管理、安全管理等接口[6]。JAVA卡平臺實現API接口,JAVA卡應用可以通過調用API接口來進行編程,生成可下載文件。
在JAVA卡發行之后,還能夠進行應用的下載、安裝、刪除等管理[5]。不同的應用開發商開發的JAVA卡應用,也可以下載到不同平臺開發商開發的、支持同一API版本的JAVA卡平臺上。如圖2所示。
應用開發時,引用JAVA卡API庫包進行編譯,生成可下載文件CAP包。應用下載到平臺后,對平臺庫包API的調用采用動態鏈接機制,通過平臺編譯的Token值索引,找到調用的JAVA包、類和方法,完成相應功能的實現[8]。
2 通用的JAVA卡新增功能實現方式及問題
本文將實現了具體功能的API包稱為庫包。常見的JAVA卡標準庫包包括java.io、java.lang、javacard.framework、javacard.security、javacardx. crypto等[6]。庫包java.io和java.lang定義了一些常見的異常(Exception),javacard.framework定義了JAVA卡平臺運行環境的各種操作接口,javacard.security和javacardx. crypto定義了國際算法和密碼相關的安全接口。
在一張JAVA卡發行后,如果不同的應用需要平臺新增實現相同的功能,傳統的實現方法,第一種是每個應用都實現一套相同的功能函數;第二種方法是采用JAVA卡傳統的補丁方式,將功能實現增加到平臺中;第三種方法是重新開發平臺,如果為ROM掩膜的卡片,還需要重新進行平臺掩膜。
現有的新增通用功能的方法都有各自的問題:
1)第一種方法,每個應用內部實現一套功能函數,這樣導致代碼量的冗余,在智能卡有限的空間中,如果單個應用的代碼量增大,會導致可加載應用的個數減少;
2)第二種方法,JAVA卡傳統的補丁方式,一般是在JAVA卡運行環境中,在調用方法的時候進行補丁函數的判斷,如果該方法有補丁函數,則運行補丁函數;如果沒有補丁函數,則運行現有的函數,這種方法增加了判斷的時間,使得卡運行效率降低,而且補丁函數的開發有較多的限制;
3)第三種方法,重新開發一版新平臺,這種方法不僅導致芯片可能有重新掩膜的成本,而且增加了多個版本的維護工作。
3 JAVA卡庫包后下載的方法
本文將后下載的庫包分為兩個模塊,庫實現包模塊和庫接口包模塊,此處的庫,指的是Java卡外部庫,非標準庫,即卡內未預置的庫,需要新增功能的庫包。
實現時,首先實現一個庫實現包,庫實現包作為一個JAVA卡的包(Package),基于JAVA卡標準庫包進行開發,包中包含了新增庫的功能函數(Java文件)。Java文件通過javac編譯器引用Java API,生成庫實現Java可裝載文件(Class文件),然后,通過JavaCard編譯器converter引用JavaCard和GP(Global Platform,應用安全管理平臺)的API[9],將Class文件生成庫實現Java卡可裝載文件(CAP文件),如圖3所示。
然后,用庫實現源文件生成庫接口源文件,只保留方法的聲明。如果希望庫接口包中含有最少的函數聲明,可以將需要提供的接口所在的類和函數都放在最前位置編譯。由于converter中JAVA卡外部類按照字母順序來生成排序的類Token值[8],需要將提供接口的類排列在包的最前位置。接口文件的實現,保證了實現的代碼不會被泄露。應用需要獲取庫接口文件JAVA卡庫文件,通過javac編譯器生成應用Java可裝載文件后,使用converter工具,除了引用JavaCard和GP API外,還需引用庫接口JAR包,生成應用的JAVA卡可裝載文件。
最后,完成應用的裝載安裝過程。在應用裝載前,需要寫在現有的標準JAVA卡上,通過JavaCardLoader(下載器)先將庫實現JAVA卡可裝載文件安裝進JAVA卡,然后,再通過JavaCard Loader和Installer(安裝器)將應用的Java卡可裝載文件下載并安裝進JAVA卡中,完成應用的下載和安裝。如圖4所示。
4 結論
將本文的方法與傳統的方法相比較。相比第一種方法,在應用中實現庫包的功能,減少了代碼量。如果庫功能實現的代碼量為n Kbytes,應用實現的代碼量是m Kbytes,當一張卡上有i個應用需要調到該庫的功能時,第一種方法需要的代碼量是i*(n+m)Kbytes,而本方法需要的代碼量是n+i*m Kbytes,減少了(i-1)*n Kbytes的代碼量。代碼量的減少,可以在芯片選型時,選擇空間較小,成本較低的芯片。
與第二種方法相比,縮短了開發時間,降低了開發難度,并提高了運行效率。依靠傳統的補丁方式實現功能庫函數時,需要在設計時就考慮到有可能出現的問題,設計好補丁入口。在實現時,有較多開發上的限制。采用JAVA卡包來實現新增功能的庫函數,能縮短開發時間,降低開發難度。運行時,傳統的補丁需要在函數調用時判斷是否具有補丁函數,在每個方法調用前都增加了運行時間成本,本方法提高了運行效率。
與第三種方法相比,減少了版本維護,如果在ROM掩膜的芯片上,還節約了芯片掩膜成本。此方法在功能函數缺失或需要新增的時候,只需將Java庫實現包下載進JAVA卡,并提供相應的庫接口包給應用開發的用戶,無需重新開發一版COS,減少了COS的版本。在ROM掩膜的芯片上,無需再次進行芯片掩膜,直接將功能庫進行下載,大大節約了多次掩膜的成本。
綜上所述,相比傳統方法,本文提出的JAVA卡庫包后下載的方法具有節省卡片空間、便于開發、節約成本的優點。
參考文獻:
[1]王愛英.智能卡技術[M].北京:清華大學出版社, 2009.
[2]馬多賀.Java智能卡開發及應用技術研究[M].哈爾濱工業大學,2006.
[3]Michael Baentsch, Peter Buhler, etc.IEEE Concurrency, Oct.-Dec.1999,JavaCard-From Hype to Reality, 1999.
[4]張旭.基于JavaCard的智能存儲卡多行業應用研究[M].北京郵電大學,2008.
[5]Runtime Environment Specification, JavaCardTM Platform, Version 2.2.2, March 2006.
[6] Application Programming Interface, JavaCardTMPlatform, Version 2.2.2, March 2006.
[7] Virtual Machine Specification, JavaCardTM Platform, Version 2.2.2, March 2006.
[8] Development Kit User’s Guide, For the Source Release. Java CardTM Platform, Version 2.2.2, 2006
[9]GlobalPlatform Card Specification, Card Specification, Version2.2, March 2006.
本文來源于中國科技期刊《電子產品世界》2016年第10期第47頁,歡迎您寫論文時引用,并注明出處。
評論