我已经想到,改变历史字节会被限制在预个性化的一步。 但是,我发现了一个在当今的全球平台的API名为setATRHistBytes方法。
这是它的描述(全球平台2.2页172):
setATRHistBytes
public static boolean setATRHistBytes(byte[] baBuffer, short sOffset, bytebLength)
对于根据ISO / IEC 7816-4接触卡和根据ISO / IEC 14443-3类型A接触卡,该方法设置历史字节。 字节序列将是可见的但在随后的电或复位。
笔记:
•打开定位在全球平台注册表中当前applet上下文的条目,并验证应用程序具有当前卡I / O接口卡重置权限;
•打开负责用于同步的历史字节长度在ATR的格式字符T0。
参数:
baBuffer - 包含历史字节的源字节数组。 必须是一个全球性的阵列。
S偏移 - 偏移的源字节数组内的历史字节。
bLength - 历史字节数。
返回:
真,如果历史字节集,false,如果应用程序没有所需的权限
现在我想改变我的卡的历史字节 。 所以我写了下面的程序,并将其转化为它的成功帽文件:
... /imports
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);
}
}
}
正如你看到它上面写的分配方式0102030405060708090A
到历史字节与任何APDU命令的接收INS=0X00
。
问题是我没有任何想法如何卡重置权限设置为这个小程序。 我知道我必须在安装步骤中指定的特权,但我不知道怎么办! 通常我使用GlobalPlatformPro工具上传我的小程序。 在其支持的参数我没有看到任何相关的参数:
E:\GP> gp -h
Option Description
------ -----------
-V, --version Show information about the program
-a, --apdu Send raw APDU (hex)
--all Work with multiple readers
--applet <AID> Applet AID
--cap <File> Use a CAP file as source
--create <AID> Create new instance of an applet
-d, --debug Show PC/SC and APDU trace
--default Indicate Default Selected privilege
--delete [AID] Delete something
--deletedeps Also delete dependencies
--dump <File> Dump APDU communication to <File>
--emv Use EMV diversification
--enc <GPKeySet$GPKey> Specify ENC key
-h, --help Shows this help string
-i, --info Show information
--install [File] Install applet(s) from CAP
--instance <AID> Instance AID
--kek <GPKeySet$GPKey> Specify KEK key
--key <GPKeySet$GPKey> Specify master key
--keyid <Integer> Specify key ID
--keyver <Integer> Specify key version
-l, --list List the contents of the card
--load <File> Load a CAP file
--lock <GPKeySet> Set new key
--lock-applet <AID> Lock specified applet
--mac <GPKeySet$GPKey> Specify MAC key
--make-default <AID> Make AID the default
--mode <GlobalPlatform$APDUMode> APDU mode to use (mac/enc/clr)
--new-keyver <Integer> key version for the new key
--nofix Do not try to fix PCSC/Java/OS issues
--package <AID> Package AID
--params Installation parameters
-r, --reader Use specific reader
--reinstall Remove card content during installation
--relax Relaxed error checking
--replay <File> Replay APDU responses from <File>
-s, --secure-apdu Send raw APDU (hex) via SCP
--scp <Integer> Force the use of SCP0X
--sdaid <AID> ISD AID
--sdomain Indicate Security Domain privilege
--terminate Indicate Card Lock+Terminate privilege
--uninstall <File> Uninstall applet/package
--unlock Set default key
--unlock-applet <AID> Lock specified applet
-v, --verbose Be verbose about operations
--virgin Card has virgin keys
--visa2 Use VISA2 diversification
E:\GP>
请注意,我通常安装的小程序,但是当它返回0x9000
在接收命令 ,它不能改变历史字节,我需要将卡重置权限设置为我的小程序:
OpenSC: osc -a
Using reader with a card: ACS CCID USB Reader 0
3b:68:00:00:00:73:c8:40:12:00:90:00
OpenSC: osc -s 00A4040006010203040101 -s 00000000
Using reader with a card: ACS CCID USB Reader 0
Sending: 00 A4 04 00 06 01 02 03 04 01 01
Received (SW1=0x90, SW2=0x00)
Sending: 00 00 00 00
Received (SW1=0x90, SW2=0x00)
OpenSC: osc -a
Using reader with a card: ACS CCID USB Reader 0
3b:68:00:00:00:73:c8:40:12:00:90:00
OpenSC:
问题:
1 - 我如何更改/套我的小应用程序的特权?
2 -为什么卡退还0x9000
的接收0x00 0x00 x00 0x00
? (我希望它返回一个例外,因为它是在描述中提到setATRHistBytes
这个方法返回false
在小程序特权的情况下不卡重置 )