如何改变小应用程序的权限和卡片历史字节?(How to change applet's pr

2019-10-22 12:28发布

我已经想到,改变历史字节会被限制在预个性化的一步。 但是,我发现了一个在当今的全球平台的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在小程序特权的情况下不卡重置

Answer 1:

复位权限被设置为默认选择权前闻名。 这意味着你可以使用--default开关你的卡-如果你这样做,它在INSTALL为INSTALL特权翻转同位字节。

有时,一个卡需要一个冷复位在ATR改变之前(即除去从现场或终端卡)个字节被传递。 这也可以是读者的问题 - 重新连接时,并不是所有的读者进行复位,否则有可能缓存ATR字节。



Answer 2:

要设置卡重置权限您需要设置第一特权字节的第3位的安装,使小程序的可选命令的applet。 如果只安装小程序,而不是作出选择具有相同install命令卡重置权限不能设置

其实如果卡GP201 / GP211遵守那么我们参考卡重置权限作为默认选择的特权。

如果默认选择权限在GP201 / GP211合规卡设置,那么它提供了两个功能的小程序为:

  1. 小程序可以修改历史字节
  2. applet将冷复位后默认选择的基本逻辑通道的小程序。

如果卡重置权限被设置在GP22以上合规卡则提供了以下功能的小程序的版本:

  1. 小程序可以修改历史字节
  2. 小应用程序可以是在基本逻辑信道隐可选择如果它没有被通过设置隐式选择的参数到TAT小程序颁发给另一个应用。


文章来源: How to change applet's privilege and the card Historical Bytes?