2015-07-13 62 views
0

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

在Javacard中,您可以使用setATRHistBytes,并根据访问接口调用它。但是这些变化会反映在卡的下次开机时。我想中间设置它们。

TA

+0

为什么你要做到这一点的意见吗?如果我正确地收到了您的问题,您希望将卡插入阅读器插槽及其天线,并且基于您用于发送和接收APDU命令的接口,您希望接收不同的ATR(历史字节)。我对吗?如果是这样,你想不止一次改变它,或者你只是想改变它一次? – Abraham

+0

@Abraham我只是希望能够根据界面获得不同的ATR。目前我并不介意改变它一次或多次,但我希望我的卡拥有2个ATR。 – jlanza

回答

2

实际上非接触式接口没有名为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

相关问题