我想知道是否有一种方法可以在为智能卡供电时自动更改历史字节,以便在接触或非接触时获得不同的响应。
在Javacard中,您可以使用setATRHistBytes
,并根据访问界面调用它。但这些变化将反映在卡的下一次加电上。我想在中间设置它们。
TA
答案 0 :(得分:2)
实际上,非接触式界面没有名为ATR的属性。因为ATR仅用于联系接口。非接触式接口上的对应部件名为ATS。
正如您在问题中所述,您可以使用全球平台 API的setATRHistBytes
更改ATR。以下是此方法的说明:
setATRHistBytes
public static boolean setATRHistBytes(byte[] baBuffer, short sOffset, bytebLength)
对于符合ISO / IEC 7816-4的接触式卡和符合ISO / IEC 14443-3的A型非接触式卡,此方法设置历史字节。在随后的上电或复位时,字节序列将可见。
注意:
•OPEN在GlobalPlatform注册表中找到当前applet上下文的条目,并验证Application是否具有当前卡I / O接口的Card Reset权限;
•OPEN负责同步ATR格式字符T0中的历史字节长度。
参数:
baBuffer - 包含历史字节的源字节数组。必须是全局数组。
sOffset - 源字节数组中历史字节的偏移量。
bLength - 历史字节数。
退货:
如果设置了历史字节,则为true;如果应用程序没有所需的权限,则为false。
正如您在 Notes 部分中看到的那样,您的applet必须具有卡重置权限。如果没有此权限,则无法更改历史字节。使用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和评论