2015-07-13 61 views
0

我想知道當您爲智能卡供電時,是否有辦法自動更改歷史字節,以便在接觸或非接觸時具有不同的響應。智能卡具有不同的歷史字節,具體取決於接口

在Javacard中,您可以使用setATRHistBytes,並根據訪問接口調用它。但是這些變化會反映在卡的下次開機時。我想中間設置它們。

TA

+0

爲什麼你要做到這一點的意見嗎?如果我正確地收到了您的問題,您希望將卡插入閱讀器插槽及其天線,並且基於您用於發送和接收APDU命令的接口,您希望接收不同的ATR(歷史字節)。我對嗎?如果是這樣,你想不止一次改變它,或者你只是想改變它一次? – Abraham

+0

@Abraham我只是希望能夠根據界面獲得不同的ATR。目前我並不介意改變它一次或多次,但我希望我的卡擁有2個ATR。 – jlanza

回答

2

實際上非接觸式接口沒有名爲ATR的屬​​性。因爲ATR僅用於聯繫人界面。非接觸式接口上的對應部分被命名爲ATS。

正如您在您的問題中所說的,您可以使用setATRHistBytes全球平臺 API更改ATR。下面是該方法的描述:

setATRHistBytes根據ISO/IEC 7816-4和根據ISO/IEC 14443-3類型A接觸卡

public static boolean setATRHistBytes(byte[] baBuffer, short sOffset, bytebLength)

對於接觸卡,這個方法設置歷史字節。在隨後的上電或復位時,字節序列將可見。

注:

•打開定位在全球平臺註冊表中當前applet上下文的條目,並驗證應用程序具有當前卡I/O接口卡重置權限;

•OPEN負責同步ATR格式字符T0中的歷史字節長度。

參數:

baBuffer - 包含歷史字節的源字節數組。必須是全局數組。

sOffset - 源字節數組內的歷史字節的偏移量。

bLength - 歷史字節數。

返回:

真,如果歷史字節集,false,如果應用程序沒有所需的權限。

正如您在注意看節,你的小應用程序必須已經卡復位特權。沒有這個特權,你不能改變歷史字節。在GlobalPlatformPro工具使用下面的命令與卡安裝您的小程序重置特權:

CommandLine> gp.exe -install <PathToYourApplet\apple.cap> --default 

我已經寫了一個程序來改變我的Java卡的ATR。你可以嘗試一下。(無論如何,我不確定)

package testATR; 

import org.globalplatform.GPSystem; 

import javacard.framework.APDU; 
import javacard.framework.Applet; 
import javacard.framework.ISO7816; 
import javacard.framework.ISOException; 

public class HistoricalBytesChanger extends Applet { 
    public static byte[] state = { (byte) 0, (byte) 0 }; 
    public static byte[] HistByteArray = { (byte) 0x01, (byte) 0x02, 
      (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, 
      (byte) 0x08, (byte) 0x09, (byte) 0x0a }; 

    public static void install(byte[] bArray, short bOffset, byte bLength) { 
     new HistoricalBytesChanger().register(bArray, (short) (bOffset + 1), bArray[bOffset]); 
    } 

    public void process(APDU apdu) { 
     if (selectingApplet()) { 
      return; 
     } 

     byte[] buf = apdu.getBuffer(); 
     switch (buf[ISO7816.OFFSET_INS]) { 
     case (byte) 0x00: 
      GPSystem.setATRHistBytes(HistByteArray, (short) 0, (byte) 10); 
      HistByteArray[0] = (byte) (HistByteArray[0] + 1); 
      break; 

     default: 
      ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); 
     } 
    } 

} 

我不知道你是否可以改變ATS或不。無論如何,如果你想擁有不同的ATR和ATS(通常它們在默認情況下是不同的),你只需要改變ATR。

看看這個Q&A

相關問題