具有不同历史字节的智能卡取决于接口

时间:2015-07-13 13:50:07

标签: smartcard javacard contactless-smartcard

我想知道是否有一种方法可以在为智能卡供电时自动更改历史字节,以便在接触或非接触时获得不同的响应。

在Javacard中,您可以使用setATRHistBytes,并根据访问界面调用它。但这些变化将反映在卡的下一次加电上。我想在中间设置它们。

TA

1 个答案:

答案 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和评论