如何更改小程序的权限和卡片历史字节数?
How to change applet's privilege and the card Historical Bytes?
我已经认为更改历史字节仅限于 Pre-Personalization 步骤。但是,我今天在 GlobalPlatform API 中发现了一个名为 setATRHistBytes 的方法。
这是它的描述(GlobalPlatform 2.2 第 172 页):
setATRHistBytes
public static boolean setATRHistBytes(byte[] baBuffer, short sOffset, bytebLength)
For contact cards according to ISO/IEC 7816-4 and Type A contactless cards according to ISO/IEC 14443-3, this method sets the historical bytes. The sequence of bytes will be visible on a subsequent power-up or reset.
Notes:
• The OPEN locates the entry of the current applet context in the GlobalPlatform Registry and verifies that the Application has the Card Reset privilege for the current card I/O interface;
• The OPEN is responsible for synchronizing the length of historical bytes in Format Character T0 of the ATR.
Parameters:
baBuffer - the source byte array containing the historical bytes. Must be a global array.
sOffset - offset of the historical bytes within the source byte array.
bLength - the number of historical bytes.
Returns:
true if historical bytes set, false if the Application does not have the required privilege
现在我想更改我的卡的历史字节数。所以我编写了下面的程序并将其成功转换为 cap 文件:
... /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);
}
}
}
正如您在上面看到的那样,它的编写方式是在接收到带有 INS=0X00
.[=22 的任何 APDU 命令时将 0102030405060708090A
分配给 历史字节 =]
问题是我不知道如何为这个小程序设置卡片重置权限。我知道我必须在安装步骤中指定权限,但我不知道如何操作!通常我使用 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>
请注意,我正常安装了该小程序,但是当 它 return 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-如何change/set我的小程序权限?
2- 为什么 return 0x9000
收到 0x00 0x00 x00 0x00
卡? (我希望它 return 是一个例外,因为在 setATRHistBytes
的描述中提到这个方法 returns false
在小程序特权不是 [=40= 的情况下]卡片重置)
重置权限之前被称为默认选择的权限。这意味着您可以只为您的卡使用 --default
开关 - 如果您这样做,它会在 INSTALL 中为 INSTALL 权限字节翻转相同的位。
有时,在传达 ATR 字节的变化之前,卡片需要冷重置(即从现场或终端中取出卡片)。这也可能是一个 reader 问题 - 并非所有 reader 都在重新连接时执行重置,或者它们可能缓存 ATR 字节。
要为小程序设置卡重置权限,您需要在安装中设置第一个权限字节的第 3 位,并制作小程序的可选命令。如果小程序只是被安装而不是用相同的安装命令选择卡重置权限无法设置
实际上,如果卡 GP201/GP211 合规,那么我们将卡重置权限称为默认选择权限。
如果在 GP201/GP211 合规卡中设置了默认选择权限,那么它会为小程序提供两个功能:
- 小程序可以修改历史字节
- 冷重启后小程序将默认为基础逻辑通道上选中的小程序
如果在GP22或更高版本的合规卡中设置了卡片重置权限,则它会为小程序提供以下功能:
- 小程序可以修改历史字节
- 如果通过将隐式可选参数设置为 tat applet 未授予另一个应用程序,则该 applet 可以在基本逻辑信道上具有隐式可选性。
我已经认为更改历史字节仅限于 Pre-Personalization 步骤。但是,我今天在 GlobalPlatform API 中发现了一个名为 setATRHistBytes 的方法。
这是它的描述(GlobalPlatform 2.2 第 172 页):
setATRHistBytes
public static boolean setATRHistBytes(byte[] baBuffer, short sOffset, bytebLength)
For contact cards according to ISO/IEC 7816-4 and Type A contactless cards according to ISO/IEC 14443-3, this method sets the historical bytes. The sequence of bytes will be visible on a subsequent power-up or reset.
Notes:
• The OPEN locates the entry of the current applet context in the GlobalPlatform Registry and verifies that the Application has the Card Reset privilege for the current card I/O interface;
• The OPEN is responsible for synchronizing the length of historical bytes in Format Character T0 of the ATR.
Parameters:
baBuffer - the source byte array containing the historical bytes. Must be a global array.
sOffset - offset of the historical bytes within the source byte array.
bLength - the number of historical bytes.
Returns:
true if historical bytes set, false if the Application does not have the required privilege
现在我想更改我的卡的历史字节数。所以我编写了下面的程序并将其成功转换为 cap 文件:
... /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);
}
}
}
正如您在上面看到的那样,它的编写方式是在接收到带有 INS=0X00
.[=22 的任何 APDU 命令时将 0102030405060708090A
分配给 历史字节 =]
问题是我不知道如何为这个小程序设置卡片重置权限。我知道我必须在安装步骤中指定权限,但我不知道如何操作!通常我使用 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>
请注意,我正常安装了该小程序,但是当 它 return 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-如何change/set我的小程序权限?
2- 为什么 return 0x9000
收到 0x00 0x00 x00 0x00
卡? (我希望它 return 是一个例外,因为在 setATRHistBytes
的描述中提到这个方法 returns false
在小程序特权不是 [=40= 的情况下]卡片重置)
重置权限之前被称为默认选择的权限。这意味着您可以只为您的卡使用 --default
开关 - 如果您这样做,它会在 INSTALL 中为 INSTALL 权限字节翻转相同的位。
有时,在传达 ATR 字节的变化之前,卡片需要冷重置(即从现场或终端中取出卡片)。这也可能是一个 reader 问题 - 并非所有 reader 都在重新连接时执行重置,或者它们可能缓存 ATR 字节。
要为小程序设置卡重置权限,您需要在安装中设置第一个权限字节的第 3 位,并制作小程序的可选命令。如果小程序只是被安装而不是用相同的安装命令选择卡重置权限无法设置
实际上,如果卡 GP201/GP211 合规,那么我们将卡重置权限称为默认选择权限。
如果在 GP201/GP211 合规卡中设置了默认选择权限,那么它会为小程序提供两个功能:
- 小程序可以修改历史字节
- 冷重启后小程序将默认为基础逻辑通道上选中的小程序
如果在GP22或更高版本的合规卡中设置了卡片重置权限,则它会为小程序提供以下功能:
- 小程序可以修改历史字节
- 如果通过将隐式可选参数设置为 tat applet 未授予另一个应用程序,则该 applet 可以在基本逻辑信道上具有隐式可选性。