我想知道當您爲智能卡供電時,是否有辦法自動更改歷史字節,以便在接觸或非接觸時具有不同的響應。智能卡具有不同的歷史字節,具體取決於接口
在Javacard中,您可以使用setATRHistBytes
,並根據訪問接口調用它。但是這些變化會反映在卡的下次開機時。我想中間設置它們。
TA
我想知道當您爲智能卡供電時,是否有辦法自動更改歷史字節,以便在接觸或非接觸時具有不同的響應。智能卡具有不同的歷史字節,具體取決於接口
在Javacard中,您可以使用setATRHistBytes
,並根據訪問接口調用它。但是這些變化會反映在卡的下次開機時。我想中間設置它們。
TA
實際上非接觸式接口沒有名爲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和
爲什麼你要做到這一點的意見嗎?如果我正確地收到了您的問題,您希望將卡插入閱讀器插槽及其天線,並且基於您用於發送和接收APDU命令的接口,您希望接收不同的ATR(歷史字節)。我對嗎?如果是這樣,你想不止一次改變它,或者你只是想改變它一次? – Abraham
@Abraham我只是希望能夠根據界面獲得不同的ATR。目前我並不介意改變它一次或多次,但我希望我的卡擁有2個ATR。 – jlanza