我编写了以下程序,将智能卡 ATR 中的历史字节更改为,例如0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
. 我GPSystem.setATRHistBytes()
用来设置历史字节。
请注意,这0x00 0x00 ... 0x00
不是我用于历史字节的实际值,但我对其进行了审查。实际值是一个 15 字节的数组,等于另一张现有卡的历史字节数。
package org.globalplatform;
import javacard.framework.*;
import org.globalplatform.GPSystem;
public class TestPrj extends Applet {
public static final byte[] HIST_B= {(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
public static byte counter = (byte) 0x00;
public static void install(byte[] bArray, short bOffset, byte bLength) {
new TestPrj();
}
protected TestPrj() {
register();
}
public void process(APDU apdu) {
if (selectingApplet()) {
if (counter == 0x03) {
counter = (byte) (counter + 1);
boolean changed = GPSystem.setATRHistBytes(HIST_B, (short) 0, (byte) HIST_B.length);
if (changed) {
ISOException.throwIt((short) 0x9000);
} else {
ISOException.throwIt((short) 0x6400);
}
} else {
counter = (byte) (counter + 1);
}
}
ISOException.throwIt((short) counter);
}
}
在将上述程序转换为它的 CAP 文件并安装具有Default Selected
权限的小程序(需要使用GPSystem.setATRHistBytes()
)后,我仍然无法更改历史字节。
根据我收到的 APDU 响应,该setATRHistBytes()
方法似乎总是返回false
指示历史字节未更新。
Connect successful.
Download Cap begin...
Download Cap successful.
Install Applet begin...
Install Applet successful.
Send: 00 A4 04 00 06 01 02 03 04 05 01
Recv: 00 01
Time used: 22.000 ms
Send: 00 A4 04 00 06 01 02 03 04 05 01
Recv: 00 02
Time used: 23.000 ms
Send: 00 A4 04 00 06 01 02 03 04 05 01
Recv: 00 03
Time used: 24.000 ms
Send: 00 A4 04 00 06 01 02 03 04 05 01
Recv: 64 00
Time used: 15.000 ms
Send: 00 A4 04 00 06 01 02 03 04 05 01
Recv: 00 05
Time used: 15.000 ms
请注意,这01 02 03 04 05 01
是我的小程序 AID。
我的卡是 JCOP v2.4.2 R3,我尝试针对 GP 2.2.1 v1.6 和 GP 2.2 v1.4 API 进行编译。