專(zhuān)利名稱(chēng):一種在cap文件中替換函數(shù)的方法、裝置及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及智能卡領(lǐng)域,尤其涉及Java Card應(yīng)用中一種在CAP文件中替換函數(shù) 的方法、裝置及系統(tǒng)。
背景技術(shù):
智能卡的存儲(chǔ)器體系主要是由讀寫(xiě)存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)以及可擦寫(xiě) 編程存儲(chǔ)器(EEPR0M)組成,智能卡所有的程序內(nèi)容都保存在非易失性的存儲(chǔ)器中。Java Card是可以運(yùn)行Java程序代碼的智能卡??紤]智能卡的存儲(chǔ)空間有限,不能直接存儲(chǔ)Java源代碼或class類(lèi)文件,在將 Java Card類(lèi)導(dǎo)入一個(gè)Java Card設(shè)備之前,需要通過(guò)轉(zhuǎn)換裝置將類(lèi)文件轉(zhuǎn)換為標(biāo)準(zhǔn)的轉(zhuǎn)化 小應(yīng)用程序(Converted Applet, CAP)文件,該CAP文件包含了 Java程序包中的所有類(lèi)文 件。在Java編程語(yǔ)言中,方法是實(shí)現(xiàn)功能的最小單位,為了敘述方便,這里統(tǒng)一將方法稱(chēng)為 函數(shù)。對(duì)于Java源代碼中的每個(gè)函數(shù),轉(zhuǎn)換為CAP文件后,都是由方法頭和多個(gè)操作碼組 成,其中,每個(gè)操作碼用一個(gè)字節(jié)表示,能夠?qū)崿F(xiàn)特定的功能。現(xiàn)有技術(shù)中,在將CAP文件導(dǎo)入Java Card設(shè)備后,對(duì)于存儲(chǔ)在ROM中的CAP文 件,如果CAP文件中的某個(gè)Java函數(shù)出現(xiàn)錯(cuò)誤,或者是需要修改某個(gè)函數(shù)以實(shí)現(xiàn)新的功能 時(shí),不能直接改寫(xiě)CAP文件的操作碼,可能需要更換新的Java Card設(shè)備。同樣,對(duì)于存儲(chǔ) 在EEPR0M中的CAP文件,理論上可以改寫(xiě)操作碼,但是實(shí)際應(yīng)用中,由于CAP文件在下載到 Java Card設(shè)備上時(shí),每個(gè)函數(shù)占用的存儲(chǔ)空間已經(jīng)確定,可能使得存放新函數(shù)操作碼的存 儲(chǔ)空間不足,再者,在下載CAP文件時(shí),可能已經(jīng)經(jīng)過(guò)鏈接并包含用戶(hù)數(shù)據(jù),CAP文件內(nèi)容各 組件之間的關(guān)系已經(jīng)確定,如果直接改寫(xiě)該CAP文件中的函數(shù),可能會(huì)引起錯(cuò)誤。綜上所述,需要尋求一種替換已下載到Java Card設(shè)備上的函數(shù)的方法,以克服不 能改寫(xiě)Java Card設(shè)備存儲(chǔ)的CAP文件中的函數(shù),或者改寫(xiě)時(shí)容易出現(xiàn)錯(cuò)誤的缺陷。
發(fā)明內(nèi)容
本發(fā)明提供一種在CAP文件中替換函數(shù)的方法、裝置及系統(tǒng),用以在不影響CAP文 件其它功能以及用戶(hù)數(shù)據(jù)的情況下,對(duì)存儲(chǔ)在Java Card設(shè)備上的CAP文件中的函數(shù)進(jìn)行替換。本發(fā)明實(shí)施例提供的具體技術(shù)方案如下一種在CAP文件中替換函數(shù)的方法,包括接收卡片接受設(shè)備發(fā)送的第一應(yīng)用程序協(xié)議數(shù)據(jù)單元(APDU)命令;在本地預(yù)存的CAP文件中確定需更改的第一函數(shù),并確定該第一函數(shù)歸屬的類(lèi);確定所述類(lèi)中定義的用于放置新生成函數(shù)的存儲(chǔ)位置,并根據(jù)所述第一 APDU命 令生成相應(yīng)的用于替換第一函數(shù)的第二函數(shù),以及將第二函數(shù)存入所述存儲(chǔ)位置;接收卡片接受設(shè)備發(fā)送的第二 APDU命令,根據(jù)該第二 APDU命令,從所述存儲(chǔ)位置 讀取第二函數(shù),對(duì)所述CAP文件中的第一函數(shù)進(jìn)行替換。
一種在CAP文件中替換函數(shù)的裝置,包括第一處理單元,用于接收卡片接受設(shè)備發(fā)送的第一應(yīng)用程序協(xié)議數(shù)據(jù)單元(APDU) 命令;第二處理單元,用于在本地預(yù)存的CAP文件中確定需更改的第一函數(shù),并確定該 第一函數(shù)歸屬的類(lèi);第三處理單元,用于確定所述類(lèi)中定義的用于放置新生成函數(shù)的存儲(chǔ)位置,并根 據(jù)所述第一 APDU命令生成相應(yīng)的用于替換第一函數(shù)的第二函數(shù),以及將第二函數(shù)存入所 述存儲(chǔ)位置;第四處理單元,用于接收卡片接受設(shè)備發(fā)送的第二 APDU命令,根據(jù)該第二 APDU命 令,從所述存儲(chǔ)位置讀取第二函數(shù),對(duì)所述CAP文件中的第一函數(shù)進(jìn)行替換。一種在CAP文件中替換函數(shù)的系統(tǒng),包括卡片接受設(shè)備,用于向Java Card設(shè)備發(fā)送第一 APDU命令以及第二 APDU命令;Java Card設(shè)備,用于接收卡片接受設(shè)備發(fā)送的第一應(yīng)用程序協(xié)議數(shù)據(jù)單元 (APDU)命令,在本地預(yù)存的CAP文件中確定需更改的第一函數(shù),確定該第一函數(shù)歸屬的類(lèi), 以及確定所述類(lèi)中定義的用于放置新生成函數(shù)的存儲(chǔ)位置,根據(jù)所述第一 APDU命令生成 相應(yīng)的用于替換第一函數(shù)的第二函數(shù),以及將第二函數(shù)存入所述存儲(chǔ)位置,并接收卡片接 受設(shè)備發(fā)送的第二 APDU命令,根據(jù)該第二 APDU命令,從所述存儲(chǔ)位置讀取第二函數(shù),對(duì)所 述CAP文件中的第一函數(shù)進(jìn)行替換。基于上述技術(shù)方案,本發(fā)明實(shí)施例中,通過(guò)在源程序中添加方法數(shù)組生成函數(shù),將 新函數(shù)(第二函數(shù))對(duì)應(yīng)的數(shù)據(jù)文件保存到方法數(shù)組中,再采用該方法數(shù)組替換CAP文件 中存在的第一函數(shù),對(duì)第二函數(shù)的保存是通過(guò)創(chuàng)建方法數(shù)組來(lái)實(shí)現(xiàn)的,不需要預(yù)留存儲(chǔ)空 間,只需在源程序中對(duì)預(yù)期會(huì)改變的函數(shù)添加方法數(shù)組生成函數(shù),即可根據(jù)APDU命令替換 CAP文件中的函數(shù),達(dá)到修正錯(cuò)誤或?qū)崿F(xiàn)新功能的目的,同時(shí),對(duì)CAP文件中的其他功能和 數(shù)據(jù)不會(huì)造成影響,可以方便快捷地對(duì)CAP文件中的函數(shù)進(jìn)行替換,提高了效率,節(jié)約了成 本。
圖1為本發(fā)明實(shí)施例中在CAP文件中替換函數(shù)的系統(tǒng)架構(gòu)圖;圖2為本發(fā)明實(shí)施例中在CAP文件中替換函數(shù)的裝置結(jié)構(gòu)圖;圖3為本發(fā)明實(shí)施例中在CAP文件中替換函數(shù)的詳細(xì)流程圖。
具體實(shí)施例方式為了克服Java Card存儲(chǔ)方式導(dǎo)致的無(wú)法修改CAP文件中的函數(shù)這一技術(shù)缺陷, 本發(fā)明實(shí)施例提供了一種在CAP文件中替換函數(shù)的方法,能夠在不影響Java Card已有的 功能和數(shù)據(jù)的情況下,對(duì)Java Card上存儲(chǔ)的CAP文件中的函數(shù)進(jìn)行替換,提高效率,節(jié)約 成本。該方法為接收卡片接受設(shè)備發(fā)送的第一應(yīng)用程序協(xié)議數(shù)據(jù)單元(APDU)命令,在本 地預(yù)存的CAP文件中確定需更改的第一函數(shù),并確定該第一函數(shù)歸屬的類(lèi),確定上述類(lèi)中 定義的用于放置新生成函數(shù)的存儲(chǔ)位置,并根據(jù)上述第一 APDU命令生成相應(yīng)的用于替換 第一函數(shù)的第二函數(shù),以及將第二函數(shù)存入上述存儲(chǔ)位置,并接收卡片接受設(shè)備發(fā)送的第
5二 APDU命令,根據(jù)該第二 APDU命令,從上述存儲(chǔ)位置讀取第二函數(shù),對(duì)上述CAP文件中的
第一函數(shù)進(jìn)行替換。下面結(jié)合附圖對(duì)本發(fā)明優(yōu)選的實(shí)施方式進(jìn)行詳細(xì)說(shuō)明。參閱附圖1所示,本發(fā)明實(shí)施例中,在CAP文件中替換函數(shù)的系統(tǒng)主要包括卡片接 受設(shè)備10和Java Card設(shè)備11,其中,卡片接受設(shè)備10,用于向Java Card設(shè)備11發(fā)送第一 APDU命令以及第二 APDU命 令;Java Card設(shè)備11,用于接收卡片接受設(shè)備10發(fā)送的第一應(yīng)用程序協(xié)議數(shù)據(jù)單元 (APDU)命令,在本地預(yù)存的CAP文件中確定需更改的第一函數(shù),并確定該第一函數(shù)歸屬的 類(lèi),確定該類(lèi)中定義的用于放置新生成函數(shù)的存儲(chǔ)位置,并根據(jù)上述第一 APDU命令生成相 應(yīng)的用于替換第一函數(shù)的第二函數(shù),以及將第二函數(shù)存入上述存儲(chǔ)位置,并接收卡片接受 設(shè)備發(fā)送的第二 APDU命令,根據(jù)該第二 APDU命令,從上述存儲(chǔ)位置讀取第二函數(shù),對(duì)上述 CAP文件中的第一函數(shù)進(jìn)行替換。參閱附圖2所示,本發(fā)明實(shí)施例中,Java Card設(shè)備11主要包括以下處理單元第一處理單元111,用于接收卡片接受設(shè)備發(fā)送的第一應(yīng)用程序協(xié)議數(shù)據(jù)單元 (APDU)命令;第二處理單元112,用于在本地預(yù)存的CAP文件中確定需更改的第一函數(shù),并確定 該第一函數(shù)歸屬的類(lèi);第三處理單元113,用于確定所述類(lèi)中定義的用于放置新生成函數(shù)的存儲(chǔ)位置,并 根據(jù)所述第一 APDU命令生成相應(yīng)的用于替換第一函數(shù)的第二函數(shù),以及將第二函數(shù)存入 所述存儲(chǔ)位置;第四處理單元114,用于接收卡片接受設(shè)備發(fā)送的第二 APDU命令,根據(jù)該第二 APDU命令,從所述存儲(chǔ)位置讀取第二函數(shù),對(duì)所述CAP文件中的第一函數(shù)進(jìn)行替換。為了實(shí)現(xiàn)上述技術(shù)方案,本發(fā)明實(shí)施例中,首先需要在操作系統(tǒng)中新增本地應(yīng)用 程序編程接口,該本地應(yīng)用程序編程接口用于實(shí)現(xiàn)新函數(shù)調(diào)用。^jftjSfflfMj^lSfM^n (native Application Program Interface,native API) 是指采用非Java語(yǔ)言實(shí)現(xiàn)的本地函數(shù),native API能夠代替部分Java源代碼,以達(dá)到提 高效率或?qū)崿F(xiàn)特殊功能的目的。這些nativeAPI可以通過(guò)CAP文件中自定義的特殊標(biāo)記來(lái) 區(qū)分,并在運(yùn)行調(diào)用相應(yīng)的native API。例如,CAP文件方法頭中的第一個(gè)字節(jié)是0X20,表示該方法頭對(duì)應(yīng)的函數(shù)屬于 native API。在Java Card操作系統(tǒng)中新增的native API能夠被所有的Java源程序調(diào)用。本發(fā)明實(shí)施例中,新增的native API的參數(shù)至少包括一個(gè)byte數(shù)據(jù)類(lèi)型的數(shù)組 的引用。在Java Card操作系統(tǒng)中新增的native API的參考格式如下所示,public static void callMethod(byte[]bArray, short offset), native API ( MWi callMethod)實(shí)王見(jiàn) 的功能為從輸入?yún)?shù)byte數(shù)據(jù)類(lèi)型數(shù)組bArray中,由short數(shù)據(jù)類(lèi)型的參數(shù)offset所確 定的偏移位置開(kāi)始,進(jìn)行Java函數(shù)的調(diào)用。其次,需要在源程序中定義方法數(shù)組生成函數(shù),該方法數(shù)組生成函數(shù)用于生成方 法數(shù)組。
該方法數(shù)組用于保存第二函數(shù)轉(zhuǎn)換為CAP文件后對(duì)應(yīng)的方法頭和操作碼,該第二 函數(shù)用于替換Java Card設(shè)備上存儲(chǔ)的CAP文件中的第一函數(shù)。在需要下載到j(luò)ava Card設(shè)備的Java源程序中,增加方法數(shù)組生成函數(shù),該方法 數(shù)組生成函數(shù)的功能為根據(jù)輸入數(shù)據(jù)生成方法數(shù)組,將該方法數(shù)組作為上述新增native API的輸入,執(zhí)行native API調(diào)用。本發(fā)明實(shí)施例中,方法數(shù)組生成函數(shù)的參數(shù)至少包括一個(gè)目的byte數(shù)據(jù)類(lèi)型數(shù) 組的引用,一個(gè)源byte數(shù)據(jù)類(lèi)型數(shù)組的應(yīng)用,源byte數(shù)據(jù)類(lèi)型數(shù)組內(nèi)數(shù)據(jù)的起始地址,以 及從源byte數(shù)據(jù)類(lèi)型數(shù)組的起始地址開(kāi)始的數(shù)據(jù)長(zhǎng)度。在Java源程序中增加方法數(shù)組生成函數(shù)的參考格式如下所示,public void saveMethod (byte [] destArray, byte [] srcArray, short offset,short length),該方法數(shù) 組生成函數(shù)實(shí)現(xiàn)的功能為將輸入?yún)?shù)的源數(shù)組srcArray中,以offset字節(jié)的偏移量所確 定的位置作為起始位置,截取length字節(jié)長(zhǎng)度的數(shù)據(jù),生成新的byte數(shù)據(jù)類(lèi)型的方法數(shù) 組。也就是,將源數(shù)組中指定的數(shù)據(jù)起始地址開(kāi)始的指定長(zhǎng)度的數(shù)據(jù)復(fù)制到上述方法數(shù)組 中,并使得destArray指向該方法數(shù)組的存儲(chǔ)位置。在Java Card應(yīng)用中,應(yīng)用程序協(xié)議數(shù)據(jù)單元(Application Protocol Data Unit,APDU)命令用于卡片接受設(shè)備10和Java Card設(shè)備11之間進(jìn)行通信。Java Card接 收任何卡片接受設(shè)備10發(fā)送的APDU命令,并傳送到相應(yīng)的應(yīng)用程序中,應(yīng)用程序處理APDU 命令并返回響應(yīng)APDU,APDU遵守IS0/IEC7816-3和7816-4。APDU命令包括命令頭(Header) 和命令體(Body),其中,命令頭由五個(gè)字節(jié)組成,第1個(gè)字節(jié)(CLA字節(jié))用于識(shí)別指令的一 個(gè)特定應(yīng)用程序類(lèi),第2個(gè)字節(jié)(INS字節(jié))用于指示CLA字節(jié)中標(biāo)示的某個(gè)指令類(lèi)中的一 個(gè)特定指令,該特定指令用于完成特定的功能,第5個(gè)字節(jié)用于存放APDU命令體的總長(zhǎng)度, 第3、4字節(jié)可以由用戶(hù)根據(jù)需要自行定義,本發(fā)明實(shí)施例中,第3、4字節(jié)可用于表示命令體 中存放數(shù)據(jù)文件的位置和長(zhǎng)度,APDU命令體部分用于存放數(shù)據(jù)文件(如,某函數(shù)對(duì)應(yīng)數(shù)據(jù) 文件)。本發(fā)明實(shí)施例中,需要找到Java Card設(shè)備上的CAP文件在被下載到JavaCard設(shè) 備之前,保存在Java Card設(shè)備之外(如,計(jì)算機(jī)上)的Java源文件,在該Java源文件中, 直接刪除原來(lái)的第一函數(shù),并且在原來(lái)第一函數(shù)的位置加入第二函數(shù),再將重新編輯后的 Java源文件轉(zhuǎn)換為新的CAP文件,從該新的CAP文件中截取出第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件, 并將該第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件發(fā)送給卡片接受設(shè)備10,以將第二函數(shù)的數(shù)據(jù)文件保存在 APDU命令體中,上述第二函數(shù)的數(shù)據(jù)文件包括方法頭和操作碼。在APDU命令頭中存放用 于指示命令體中包含的第二函數(shù)數(shù)據(jù)文件的存放位置以及長(zhǎng)度的指示信息,在SaveMethod 函數(shù)中,將APDU命令作為源數(shù)組傳入函數(shù)中,并從APDU命令頭中提取用于指示第二函數(shù)的 數(shù)據(jù)文件在命令體中的存放位置信息以及長(zhǎng)度信息的指示信息,以獲得saveMethod輸入 參數(shù)中的offset和length。例如,APDU命令為 0x00 0x30 0x00 0x00 0x06 0x01 0x00 0x05 0x81 0x000x01,其中 0x00 0x30 0x00 0x00 0x06 前 5 個(gè)字節(jié)的內(nèi)容為命令頭,0x01 0x000x05 0x81 0x00 0x01為命令體,根據(jù)命令頭中前兩個(gè)字節(jié)可知該APDU命令需要對(duì)Java Card 設(shè)備上的第一函數(shù)進(jìn)行更新,對(duì)第一函數(shù)進(jìn)行更新的第二函數(shù)對(duì)應(yīng)的方法頭和操作碼保存 在命令體中,根據(jù)命令頭中后3個(gè)字節(jié),可以確定第二函數(shù)對(duì)應(yīng)的方法頭和操作碼為0x010x00 0x05 0x81 0x00 0x01?;谏鲜鲈?,參閱附圖3所示,本發(fā)明實(shí)施例中,實(shí)現(xiàn)在CAP文件中替換函數(shù)的 詳細(xì)流程如下步驟301 接收卡片接受設(shè)備10發(fā)送的第一應(yīng)用程序協(xié)議數(shù)據(jù)單元(APDU)命令。其中,第一 APDU命令用于調(diào)用方法數(shù)組生成函數(shù),同時(shí),該第一 APDU命令中包含 新函數(shù)的數(shù)據(jù)文件,以及用于指示該數(shù)據(jù)文件位置信息和長(zhǎng)度信息的指示信息。上述數(shù)據(jù) 文件由方法頭和操作碼組成。步驟302 在本地預(yù)存的CAP文件中確定需更改的第一函數(shù),并確定該第一函數(shù)歸 屬的類(lèi)。步驟303 確定上述類(lèi)中定義的用于放置新生成函數(shù)的存儲(chǔ)位置,并根據(jù)上述第 一 APDU命令生成相應(yīng)的用于替換第一函數(shù)的第二函數(shù),以及將第二函數(shù)存入上述存儲(chǔ)位置。根據(jù)上述第一 APDU命令生成相應(yīng)的用于替換第一函數(shù)的第二函數(shù),具體為根據(jù) 第一 APDU命令中特定的指令,調(diào)用方法數(shù)組生成函數(shù);根據(jù)第一 APDU命令中預(yù)定義的指 令,從該第一 APDU命令中獲取上述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件,以及該第二函數(shù)對(duì)應(yīng)的數(shù)據(jù) 文件的長(zhǎng)度信息;在上述方法數(shù)組生成函數(shù)中,根據(jù)上述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件的長(zhǎng)度 創(chuàng)建方法數(shù)組;將上述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件保存至上述方法數(shù)組。其中,第一 APDU命令中特定的指令是指該第一 APDU命令的命令頭中INS字節(jié)所 指示的特定指令,該特定指令用于完成特定的功能,在源程序執(zhí)行過(guò)程中,通過(guò)第一 APDU 命令的命令頭中的特定指令(如,0X30)的指示,來(lái)執(zhí)行方法數(shù)組生成函數(shù),以將第二函數(shù) 保存為方法數(shù)組。其中,第一 APDU命令中預(yù)定義的指令是指在該第一 APDU命令的命令頭中(第3、4 字節(jié))預(yù)定義的用于指示第一APDU命令中包含的數(shù)據(jù)文件的位置信息和長(zhǎng)度信息的指令。本發(fā)明實(shí)施例中,在第一函數(shù)歸屬的類(lèi)中定義引用類(lèi)型的實(shí)例域,該引用類(lèi)型的 實(shí)例域用于指示方法數(shù)組的存儲(chǔ)位置,即用于指示第二函數(shù)的存儲(chǔ)位置,在方法數(shù)組生成 函數(shù)生成與第二函數(shù)對(duì)應(yīng)的方法數(shù)組后,將第二函數(shù)對(duì)應(yīng)的方法數(shù)組的引用保存至上述引 用類(lèi)型的實(shí)例域。例如,在需要更改的第一函數(shù)所屬的類(lèi)中,定義byte數(shù)據(jù)類(lèi)型的數(shù)組的引用 destArray,在savaMethod函數(shù)中,將生成的方法數(shù)組的引用保存至byte數(shù)據(jù)類(lèi)型的數(shù)組 的引用destArray中,通過(guò)destArray輸出第二函數(shù)對(duì)應(yīng)方法數(shù)組。步驟304 接收卡片接受設(shè)備10發(fā)送的第二 APDU命令,根據(jù)該第二 APDU命令,從 上述存儲(chǔ)位置讀取第二函數(shù),對(duì)上述CAP文件中的第一函數(shù)進(jìn)行替換。具體為根據(jù)第二 APDU命令中特定的指令,判斷上述存儲(chǔ)位置保存的數(shù)據(jù)是否為 空,若是,執(zhí)行第一函數(shù);否則,通過(guò)本地應(yīng)用程序編程接口(native API)調(diào)用第二函數(shù)對(duì) 第一函數(shù)進(jìn)行替換。上述native API即為在操作系統(tǒng)中定義的callMethod函數(shù)。其中, 通過(guò)native API調(diào)用第二函數(shù)對(duì)應(yīng)的方法數(shù)組,并執(zhí)行所述方法數(shù)組,對(duì)第一函數(shù)進(jìn)行替 換。其中,根據(jù)第二 APDU命令中特定的指令,判斷上述存儲(chǔ)位置保存的數(shù)據(jù)為空,表 示在上述存儲(chǔ)位置中沒(méi)有保存第二函數(shù)對(duì)應(yīng)的方法數(shù)組,即沒(méi)有調(diào)用方法數(shù)組生成函數(shù),也就是并不需要對(duì)本地CAP文件中的第一函數(shù)進(jìn)行替換,直接根據(jù)第二 APDU命令執(zhí)行第一 函數(shù)即可。而根據(jù)第二 APDU命令中特定的指令,判斷上述存儲(chǔ)位置保存的數(shù)據(jù)非空,表示 已存在第二函數(shù)相對(duì)應(yīng)的方法數(shù)組,該方法數(shù)組保存有第二函數(shù)的數(shù)據(jù)文件,執(zhí)行native API調(diào)用該第二函數(shù)對(duì)應(yīng)的方法數(shù)組,通過(guò)執(zhí)行native API來(lái)實(shí)現(xiàn)執(zhí)行第二函數(shù),從而取 代第一函數(shù),達(dá)到對(duì)第一函數(shù)進(jìn)行替換的目的。 下面以?xún)蓚€(gè)具體的程序?yàn)槔?,?duì)本發(fā)明實(shí)施例中在CAP文件中替換函數(shù)的方法進(jìn) 行進(jìn)一步的說(shuō)明。例1,未采用本發(fā)明實(shí)施例對(duì)Java Card設(shè)備上的函數(shù)進(jìn)行替換時(shí)的情況private byte a ;public void process (APDU apdu){byte buffer [] = apdu. getBuffer();short bytesRead = apdu. setlncomingAndReceive();if (buffer [IS07816. 0FFSET_INS] ==0x20){methodlO ;}}public void method 1 (){byte a = (byte) 1 ;}M 1 為 Java Card 中在 process 中i周用 methodl 函■,在 methodl 中有一f byte
類(lèi)型的實(shí)例域a,如果APDU命令中攜帶的預(yù)定義的指令為0x20,執(zhí)行函數(shù)methodl,將a的 值置為1。如果例1所示的程序已經(jīng)下載到Java Card設(shè)備上,在后續(xù)的測(cè)試過(guò)程中出現(xiàn)問(wèn) 題或者需要對(duì)函數(shù)功能進(jìn)行修改,如將methodl修改為,public void methodl (){byte a = (byte) 2 ;}如果例1是掩膜在ROM中則無(wú)法對(duì)methodl進(jìn)行修改。例2,采用本發(fā)明實(shí)施例對(duì)Java Card設(shè)備上的函數(shù)進(jìn)行替換的實(shí)現(xiàn)程序如下private byte a ;public byte[]methodl_patch ;public void process(APDU apdu){byte buffer [] = apdu. getBuffer ();short bytesRead = apdu. setlncomingAndReceive();if (buffer [IS07816. 0FFSET_INS] ==0x20)
9
{
if (methodl_patch = = null)
{
methodl ();
}
else
{
nativeAPI. callMethod(methodl—patch,(short)0);
}
}
else if (buffer [IS07816. 0FFSET_INS] ==0x30)
{
saveMethod(methodl_patch, buffer, buffer[IS07816. 0FFSET_CDATA],
buffer[IS07816. 0FFSET_LC]);
}
}
public void saveMethod (byte[]destArray, byte []srcArray, shortoffset, short
length)
{
destArray = new byte [length];
Util.arrayCopy(srcArray, offset, length, destArray, (short)0);
}
例2的process中加入了本發(fā)明實(shí)施例中對(duì)Java Card設(shè)備上的函數(shù)進(jìn)行替換的
方法,在process中增加了方法數(shù)組的引用methodlpatch,方法數(shù)組用于保存第二函數(shù)對(duì) 應(yīng)的方法頭和操作碼。根據(jù)APDU命令頭中預(yù)定義的指令執(zhí)行相應(yīng)的操作,如果APDU命令頭 中預(yù)定義的指令為0x20,則需要執(zhí)行具有特定功能的函數(shù),這時(shí),需要判斷是否存在第二函 數(shù)用以替換Java Card上具有特定功能的第一函數(shù),這里通過(guò)判斷引用methodlpatch是 否為空值,來(lái)判斷是否存在對(duì)第一函數(shù)進(jìn)行替換的第二函數(shù),如果是空值,表示不存在第二 函數(shù)對(duì)應(yīng)的方法數(shù)組,也就是不需要對(duì)第一函數(shù)進(jìn)行替換,直接執(zhí)行第一函數(shù)即可,否則, 引用methodlpatch不是空值,表示存在methodlpatch引用的方法數(shù)組,就是存在用以更 新第一函數(shù)的第二函數(shù),這時(shí)需要通過(guò)定義的native API執(zhí)行第二函數(shù)對(duì)應(yīng)的方法數(shù)組, 實(shí)現(xiàn)將第一函數(shù)更新為第二函數(shù)。如果APDU命令頭中預(yù)定義的指令為0x30,則需要對(duì)Java Card上保存的第一函數(shù)進(jìn)行更新,這時(shí)調(diào)用savaMethod函數(shù),將APDU命令體中包含的第 二函數(shù)的方法頭和操作碼保存為方法數(shù)組,并將該方法數(shù)組保存至引用methodlpatch,在 process再次判斷APDU命令體中預(yù)定義的指令為0x20需要執(zhí)行特定的功能函數(shù)時(shí),通過(guò) nativeAPI執(zhí)行第二函數(shù)對(duì)應(yīng)的方法數(shù)組。 基于上述實(shí)施例,對(duì)存儲(chǔ)在Java Card設(shè)備ROM或EEPR0M上的CAP文件中的函數(shù)
10進(jìn)行替換時(shí),在源程序中添加方法數(shù)組生成函數(shù),生成的方法數(shù)組用以保存第二函數(shù)對(duì)應(yīng) 的方法頭和操作碼,第二函數(shù)是用以替換Java Card設(shè)備上已經(jīng)存在的第一函數(shù)的,在操作 系統(tǒng)中定義native API,用以執(zhí)行方法數(shù)組。這樣,對(duì)第二函數(shù)的保存是通過(guò)創(chuàng)建數(shù)組來(lái)實(shí) 現(xiàn)的,不需要預(yù)留空間,只要在源程序中對(duì)預(yù)期可能會(huì)改變的函數(shù)添加新函數(shù)的方法數(shù)組 生成函數(shù),以及與生成的方法數(shù)組相對(duì)應(yīng)的引用,即可根據(jù)APDU中預(yù)定義的指令在CAP文 件中進(jìn)行函數(shù)替換,以達(dá)到修正錯(cuò)誤或者實(shí)現(xiàn)新功能的目的,同時(shí),對(duì)程序的其他功能和用 戶(hù)數(shù)據(jù)不會(huì)造成影響,并且通過(guò)方便快捷地對(duì)在Java Card設(shè)備上存儲(chǔ)的CAP文件中的函 數(shù)進(jìn)行替換,提高了效率,節(jié)約了成本。 顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精 神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍 之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。
權(quán)利要求
一種在CAP文件中替換函數(shù)的方法,其特征在于,包括接收卡片接受設(shè)備發(fā)送的第一應(yīng)用程序協(xié)議數(shù)據(jù)單元APDU命令;在本地預(yù)存的CAP文件中確定需更改的第一函數(shù),并確定該第一函數(shù)歸屬的類(lèi);確定所述類(lèi)中定義的用于放置新生成函數(shù)的存儲(chǔ)位置,并根據(jù)所述第一APDU命令生成相應(yīng)的用于替換第一函數(shù)的第二函數(shù),以及將第二函數(shù)存入所述存儲(chǔ)位置;接收卡片接受設(shè)備發(fā)送的第二APDU命令,根據(jù)該第二APDU命令,從所述存儲(chǔ)位置讀取第二函數(shù),對(duì)所述CAP文件中的第一函數(shù)進(jìn)行替換。
2.如權(quán)利要求1所述的方法,其特征在于,根據(jù)所述第一APDU命令生成相應(yīng)的用于替 換第一函數(shù)的第二函數(shù),包括根據(jù)所述第一 APDU命令中特定的指令,調(diào)用方法數(shù)組生成函數(shù);根據(jù)所述第一 APDU命令中預(yù)定義的指令,從所述第一 APDU命令中獲取所述第二函數(shù) 對(duì)應(yīng)的數(shù)據(jù)文件,以及所述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件的長(zhǎng)度信息;在所述方法數(shù)組生成函數(shù)中,根據(jù)所述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件的長(zhǎng)度創(chuàng)建方法數(shù)組;將所述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件保存至所述方法數(shù)組。
3.如權(quán)利要求2所述的方法,其特征在于,所述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件由方法頭和 操作碼組成。
4.如權(quán)利要求2所述的方法,其特征在于,所述第一APDU命令中預(yù)定義的指令為用于 指示第一 APDU命令中包含的數(shù)據(jù)文件的位置信息和長(zhǎng)度信息。
5.如權(quán)利要求1所述的方法,其特征在于,根據(jù)第二APDU命令,從所述存儲(chǔ)位置讀取第 二函數(shù),對(duì)所述CAP文件中的第一函數(shù)進(jìn)行替換,包括根據(jù)第二 APDU命令中特定的指令,判斷所述存儲(chǔ)位置保存的數(shù)據(jù)是否為空,若是,執(zhí) 行第一函數(shù);否則,通過(guò)本地應(yīng)用程序編程接口 native API調(diào)用第二函數(shù)對(duì)第一函數(shù)進(jìn)行 替換。
6.如權(quán)利要求5所述的方法,其特征在于,通過(guò)nativeAPI調(diào)用第二函數(shù)對(duì)第一函數(shù) 進(jìn)行替換,包括通過(guò)native API調(diào)用第二函數(shù)對(duì)應(yīng)的方法數(shù)組,并執(zhí)行所述方法數(shù)組,對(duì)第一函數(shù)進(jìn) 行替換。
7.如權(quán)利要求5所述的方法,其特征在于,所述nativeAPI為在操作系統(tǒng)中定義的函 數(shù),能夠被所有的Java源程序調(diào)用。
8.—種在CAP文件中替換函數(shù)的裝置,其特征在于,包括第一處理單元,用于接收卡片接受設(shè)備發(fā)送的第一應(yīng)用程序協(xié)議數(shù)據(jù)單元APDU命令;第二處理單元,用于在本地預(yù)存的CAP文件中確定需更改的第一函數(shù),并確定該第一 函數(shù)歸屬的類(lèi);第三處理單元,用于確定所述類(lèi)中定義的用于放置新生成函數(shù)的存儲(chǔ)位置,并根據(jù)所 述第一 APDU命令生成相應(yīng)的用于替換第一函數(shù)的第二函數(shù),以及將第二函數(shù)存入所述存 儲(chǔ)位置;第四處理單元,用于接收卡片接受設(shè)備發(fā)送的第二 APDU命令,根據(jù)該第二 APDU命令, 從所述存儲(chǔ)位置讀取第二函數(shù),對(duì)所述CAP文件中的第一函數(shù)進(jìn)行替換。
9.如權(quán)利要求8所述的裝置,其特征在于,所述第三處理單元根據(jù)所述第一APDU命令 生成相應(yīng)的用于替換第一函數(shù)的第二函數(shù),具體為第三處理單元根據(jù)所述第一 APDU命令中特定的指令,調(diào)用方法數(shù)組生成函數(shù);第三處理單元根據(jù)所述第一 APDU命令中預(yù)定義的指令,從所述第一 APDU命令中獲取 所述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件,以及所述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件的長(zhǎng)度信息;第三處理單元在所述方法數(shù)組生成函數(shù)中,根據(jù)所述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件的長(zhǎng)度 創(chuàng)建方法數(shù)組;第三處理單元將所述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件保存至所述方法數(shù)組。
10.如權(quán)利要求9所述的裝置,其特征在于,所述第三處理單元從所述第一APDU命令中 獲取的所述第二函數(shù)對(duì)應(yīng)的數(shù)據(jù)文件由方法頭和操作碼組成。
11.如權(quán)利要求8所述的裝置,其特征在于,所述第四處理單元根據(jù)第二APDU命令,從 所述存儲(chǔ)位置讀取第二函數(shù),對(duì)所述CAP文件中的第一函數(shù)進(jìn)行替換,具體為根據(jù)第二 APDU命令中特定的指令,判斷所述存儲(chǔ)位置保存的數(shù)據(jù)是否為空,若是,執(zhí) 行第一函數(shù);否則,通過(guò)本地應(yīng)用程序編程接口 native API調(diào)用第二函數(shù)對(duì)第一函數(shù)進(jìn)行 替換。
12.如權(quán)利要求11所述的裝置,其特征在于,所述第四處理單元通過(guò)nativeAPI調(diào)用 第二函數(shù)對(duì)第一函數(shù)進(jìn)行替換時(shí),通過(guò)native API調(diào)用第二函數(shù)對(duì)應(yīng)的方法數(shù)組,并執(zhí)行 所述方法數(shù)組,對(duì)第一函數(shù)進(jìn)行替換。
13.—種在CAP文件中替換函數(shù)的系統(tǒng),其特征在于,包括卡片接受設(shè)備,用于向Java Card設(shè)備發(fā)送第一 APDU命令以及第二 APDU命令;Java Card設(shè)備,用于接收卡片接受設(shè)備發(fā)送的第一應(yīng)用程序協(xié)議數(shù)據(jù)單元APDU命 令,在本地預(yù)存的CAP文件中確定需更改的第一函數(shù),確定該第一函數(shù)歸屬的類(lèi),以及確定 所述類(lèi)中定義的用于放置新生成函數(shù)的存儲(chǔ)位置,根據(jù)所述第一 APDU命令生成相應(yīng)的用 于替換第一函數(shù)的第二函數(shù),以及將第二函數(shù)存入所述存儲(chǔ)位置,并接收卡片接受設(shè)備發(fā) 送的第二 APDU命令,根據(jù)該第二 APDU命令,從所述存儲(chǔ)位置讀取第二函數(shù),對(duì)所述CAP文 件中的第一函數(shù)進(jìn)行替換。
全文摘要
本發(fā)明公開(kāi)了一種在CAP文件中替換函數(shù)的方法、裝置及系統(tǒng),以對(duì)JavaCard設(shè)備CAP文件的函數(shù)進(jìn)行替換。該方法為接收第一APDU命令,在本地CAP文件中確定需更改的第一函數(shù),以及該函數(shù)歸屬的類(lèi),并確定該類(lèi)中定義的用于放置新函數(shù)的存儲(chǔ)位置,根據(jù)第一APDU命令生成用于替換第一函數(shù)的第二函數(shù),將第二函數(shù)存入所述存儲(chǔ)位置,并接收第二APDU命令,根據(jù)該命令從所述存儲(chǔ)位置讀取第二函數(shù),對(duì)CAP文件中的第一函數(shù)進(jìn)行替換。這樣,將第二函數(shù)保存為方法數(shù)組,再替換第一函數(shù),不需預(yù)留存儲(chǔ)空間即可替換CAP文件中的函數(shù),提高了效率,節(jié)約了成本。本發(fā)明同時(shí)公開(kāi)了一種在CAP文件中替換函數(shù)的裝置及系統(tǒng)。
文檔編號(hào)G06F11/00GK101976211SQ201010292309
公開(kāi)日2011年2月16日 申請(qǐng)日期2010年9月26日 優(yōu)先權(quán)日2010年9月26日
發(fā)明者周偉楠 申請(qǐng)人:北京握奇數(shù)據(jù)系統(tǒng)有限公司