1. 程式人生 > >檔案系統建立—Java Card開發第二篇

檔案系統建立—Java Card開發第二篇

首先要知道Java card裡面的檔案系統結構,也就是有哪些檔案:





包括四大類檔案,應用基本檔案——也就是髮卡方官方的一些資訊,然後是持卡人個人資訊的檔案,再就是EP(電子錢包)檔案,以及最重要的金鑰檔案。並且金鑰檔案必須先於其他三個檔案之前建立,因為沒密碼你弄啥操作不科學呀。

幾大檔案反應到程式碼中就是幾大資料結構:


理解了檔案系統之後就要一一去看各個檔案程式碼模組是怎麼實現的:

舉個例子:


這是二進位制檔案資料結構的部分程式碼,可以看到它的建構函式需要傳進一個pdata引數,其實就是要傳輸apdu命令的data部分給它。由於這幾大資料結構程式碼課上都給得差不多了,而且本篇只講檔案系統的建立,所以目前只需要知道這幾大檔案資料結構的介面就夠了,主要還是看主程式程式碼,也就是purse.java。嗯,本次java card的開發就是以電子錢包的開發作為專案來學習的。

先直接上主程式purse.java的程式碼,其他幾個java檔案的程式碼在後面學習篇再放:


既然是要建立檔案,當然就要先從終端獲取apdu命令,判斷它的命令裡面是不是要卡片建立檔案,怎麼判斷呢?通過ins值,就是這句程式碼:
case condef.INS_CREATE_FILE:       	return create_file();


這裡有個常量,在condef.java中定義:
condef.java檔案裡面定義了一些ins值常量,還有就是如果是要建立檔案,那要建立的是什麼檔案呢,通過pdata的第一位判斷,也就是pdata[0]:


所以condef.java裡面也定義了這部分檔案型別的常量。

既然已經判斷出了apdu命令是要我們建立檔案,同時又判斷出了要建立的是什麼檔案,接下來就簡單了,就是直接呼叫幾大檔案資料結構的介面去建立相應的檔案,同時,這裡要判斷一些異常的情況,也就是apdu命令有輸入錯誤的情況,然後返回相應的異常給終端。比如:

		if(papdu.cla != (byte)0x80)
			ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
		
		if(papdu.lc != (byte)0x07)
			ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
		
		if(EPfile != null)//有檔案了還重複建立則會報錯
			ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
		
		if(keyfile == null)//都還沒金鑰檔案(必須先於任何其他檔案建立)
			ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);

嗯,建立檔案就是這麼簡單了,主要就是要理解檔案系統裡面的幾大檔案,同時看懂檔案資料結構的幾個java檔案是怎麼實現的。然後呼叫就很簡單了。

最後,看看執行結果,由於終端要傳送不少命令,所以可以把命令全部放到檔案裡面,然後直接在命令列中讀取檔案,然後就會在模擬器中執行檔案裡面的所有命令了。

首先,把命令指令碼名稱改一下,主要是改字尾名為jcsh:


然後執行之後再命令列中先輸入:

/set-var path "檔案路徑(不包括檔名.jcsh)"

查詢檔案路徑的快速方法(通用電腦小常識),查詢檔案屬性,然後就可以看到檔案所在的路徑了。

輸入上面那條路徑命令之後,就再輸入檔名(不包括字尾),比如這裡是purse,然後回車就可以讓模擬器執行命令腳本里面的所有命令了,注意,有時候指令碼檔案裡面會有一些奇奇怪怪的未註釋的中文字元,比如中文的空格,有很多軟體開發工具都對這些非常敏感會導致執行指令碼出錯,我在執行指令碼的時候就遇到了,解決辦法是重新建一個txt檔案,然後改下檔名,把指令碼命令複製進來。

命令指令碼內容:


執行結果:


可以看到都是No Error.也就把四大檔案都給建立好了,後面的就是在檔案裡面進行新增金鑰等等的操作了,這是後面學習篇的內容。值得注意的是,每次重新執行的時候,模擬器不會儲存你之前建立的檔案,畢竟只是個模擬器嘛。所以除非一直執行著保留著上面建立檔案的狀態,否則重新執行後應當重新建立檔案。