我想知道当您为智能卡供电时,是否有办法自动更改历史字节,以便在接触或非接触时具有不同的响应。智能卡具有不同的历史字节,具体取决于接口
在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