我想知道是否有一种方法可以在您为智能卡供电时自动更改历史字节,以便在接触或非接触时产生不同的响应。
在Javacard中,您可以使用setATRHistBytes
,也可以根据访问接口调用它。但这些变化将反映在卡牌的下一次能量提升上。我想把它们设置在中间
TA
实际上非接触式接口没有名为ATR的属性。因为ATR只适用于接触面。非接触式接口对应的名称为ATS。
正如您在问题中所说,您可以使用Global Platform api的setATRHistBytes
来更改ATR。下面是这个方法的描述:
setATRHistBytes
public static boolean setATRHistBytes(byte[] baBuffer, short sOffset, bytebLength)
对于符合ISO/IEC 7816-4标准的接触式卡和符合ISO/IEC 14443-3标准的A型非接触式卡,该方法设置历史字节。字节序列将在随后的上电或复位时可见。
指出:
•OPEN在全球平台注册表中定位当前applet上下文的条目,并验证应用程序对当前卡I/O接口具有卡重置特权;
•OPEN负责同步ATR格式字符T0的历史字节长度。
参数:
babbuffer -包含历史字节的源字节数组。必须是全局数组
sofset -源字节数组中历史字节的偏移量。
length -历史字节数。
的回报:
如果历史字节设置为true,如果应用程序没有所需的权限则为false。
如注释部分所示,applet必须具有Card Reset权限。如果没有这个特权,您就不能更改历史字节。在GlobalPlatformPro工具中使用以下命令安装具有Card Reset特权的applet:
CommandLine> gp.exe -install <PathToYourAppletapple.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。
看一下这个问答和注释