2015-08-15 114 views
2

there(Javacard)APDU命令'選擇文件'的類錯誤測試

我不明白爲什麼錯誤'類不支持'不會發生。

首先,我的源代碼和APDU命令如下

<源代碼>

package SelectFileTest; 
import javacard.framework.*; 

public class SelectFileTest extends Applet{ 
    public static void install(byte[] bArray, short bOffset, byte bLength) { 
     new SelectFileTest(bArray, bOffset, bLength); 
    } 
    private SelectFileTest(byte bArray[], short bOffset, byte bLength){  
     register(); 
    } 

    public void process(APDU apdu){ 
     byte buf[] = apdu.getBuffer(); 
     if (buf[1]==(byte)0xA4) {  
      if((buf[0]&0xff)!=0x00)       // Class Check (Question) 
       ISOException.throwIt((short)0xfff5); 

      if(selectingApplet()) 
       { } 
      else 
       ISOException.throwIt((short)0xffff);  // 6881 
     } 
     return ; 
    } 
} 

< APDU命令>

[Card-1C] <== 00 A4 04 00 07 A0000000031234 
[Card-1R] ==> 9000 
[Card-2C] <== 00 A4 00 00 02 F801 
[Card-2R] ==> FFFF        // Expected 
[Card-3C] <== 01 A4 00 00 02 F801 
[Card-3R] ==> 6881        // (Question) Expect the SW 'FFF5' 
[Card-4C] <== 08 A4 00 00 02 F801 
[Card-4R] ==> FFF5        // Expected 

由命令3和4所示,卡必須輸出SW'FFF5',因爲源代碼中有'Class Check'行。但是,它在CLA = 01〜07輸出6881(3R)(也許由JCRE)。

我知道,一旦applet被選中,JCRE就會將所有後續的APDU命令轉發給選定的applet。因此,我認爲第三個響應(3R)也是像4R那樣的'FFF5'。我不明白,在我的代碼中找不到我的錯誤。

我希望你寶貴的意見。提前致謝。

回答

5

在CLA字節中,邏輯通道用低位表示。您正在選擇一個邏輯通道,平臺然後嘗試發送到正確的小程序。但是,除了基本的通道(ID = 0),它不會找到任何開放通道。所以平臺將處理錯誤而不是Applet。發生這種情況之前 Applet收到APDU; Applet將不會被通知。

請注意,這也可能發生在INS: MANAGE CHANNEL。我可能不需要解釋由AID選擇的SELECT最初也是由運行時環境處理的。

關於邏輯通道以及它們如何使用可能被使用的更多信息可以在ISO/IEC 7816-4中找到。

+0

其實,我想我的小程序處理所有的命令和錯誤代碼,一旦它選擇。那麼,你有沒有辦法讓我的小程序輸出FFF5? – user2642459

+3

@ user2642459在將APDU發送到您的小程序之前,由平臺*解釋CLA字節的低位。這就是爲什麼你的applet只能使用正確的邏輯通道(CLA字節的其餘部分都是你的)。 – vojta

+1

@vojta感謝您的好評 – user2642459

0

其實當我面對他們的類字節的這個問題,我在我的代碼集...因爲我班上字節的我的執行被中斷,給我什麼,我不指望......

您需要在將其發送到卡之前解碼類字節的含義。 ISO 7816 -3,-4,將有助於在這裏你的類字節的確切解碼...

希望它可以幫助...

+0

(上面同樣的問題)其實,我希望我的小程序處理所有命令和錯誤代碼,一旦它被選中。那麼,你有沒有辦法讓我的小程序輸出FFF5? – user2642459

+0

當向java卡發送命令時,首先由JCRE處理,然後將命令傳遞給Process方法。在您的情況下JCRE返回此錯誤,當JCRE找到適合將其移至Process Method的命令時,您將得到您的設置SW1SW2。 – Arjun

+0

6881:功能不支持 - 邏輯通道不支持/打開,您也可以在這裏查看一些內容 - https://community.oracle.com/thread/3576438,它與您遇到的同樣的錯誤有關。 – Arjun