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