如何更改applet的权限和卡片历史字节?

时间:2015-04-05 13:11:13

标签: javacard globalplatform

我已经认为更改历史字节仅限于预个性化步骤。但是,我今天在GlobalPlatform API中找到了一个名为 setATRHistBytes 的方法。

这是它的描述(GlobalPlatform 2.2第172页):

  

setATRHistBytes

     

public static boolean setATRHistBytes(byte[] baBuffer, short sOffset, bytebLength)

     

对于符合ISO / IEC 7816-4的接触式卡和符合ISO / IEC 14443-3的A型非接触式卡,此方法设置历史字节。在随后的上电或复位时,字节序列将可见。

     

注意:

     

•OPEN在GlobalPlatform注册表中找到当前applet上下文的条目,并验证Application是否具有当前卡I / O接口的Card Reset权限;

     

•OPEN负责同步ATR格式字符T0中的历史字节长度。

     

参数:

     

baBuffer - 包含历史字节的源字节数组。必须是全局数组。

     

sOffset - 源字节数组中历史字节的偏移量。

     

bLength - 历史字节数。

     

退货:

     

如果设置了历史字节,则为true;如果应用程序没有所需的权限,则为false

现在我要更改卡片的历史字节。所以我编写了以下程序并将其成功转换为 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);
        }
    }

}

正如您在上面看到的那样,它是在接收到0102030405060708090A的任何APDU命令时将INS=0X00分配给历史字节的方式。

问题是我不知道如何为此applet设置卡重置权限。我知道我必须在安装步骤中指定权限,但我不知道如何!通常我使用 GlobalPlatformPro 工具上传我的applet。在它支持的参数中,我看不到任何相关参数:

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>

请注意,我正常安装了applet,但是在接收到该命令时返回0x9000 ,它无法更改历史字节,我需要设置卡将权限重置为我的applet:

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-如何更改/设置applet的权限?

2-为什么卡片在0x9000收到时会返回0x00 0x00 x00 0x00? (我希望它返回一个异常,因为在setATRHistBytes的描述中提到,在applet特权不是卡重置的情况下,此方法返回false

2 个答案:

答案 0 :(得分:3)

以前将重置权限称为默认选定权限。这意味着您只需使用卡的--default开关 - 如果您这样做,它将在INSTALL for INSTALL特权字节中翻转相同的位。

有时,在传送ATR字节的变化之前,卡需要冷复位(即从场或终端移除卡)。这也可能是读者问题 - 并非所有读者在重新连接时都执行重置,或者他们可能会缓存ATR字节。

答案 1 :(得分:0)

要将卡重置权限设置为applet,您需要在Install中设置第一个权限字节的bit3,并对applet进行可选择的命令。如果仅安装小程序且不能使用相同的INSTALL命令进行选择,则无法设置卡重置权限

实际上,如果该卡符合GP201 / GP211标准,那么我们将卡重置权限称为默认选择权限。

如果在GP201 / GP211合规性卡中设置了“默认选择”权限,则它为小程序提供两种功能:

  1. 小程序可以修改历史字节
  2. 冷重置后,小程序将在基本逻辑通道上默认选择小程序。
  3. 如果在GP22或以上版本的合规卡中设置了卡重置权限,则它会向小程序提供以下功能:

    1. 小程序可以修改历史字节
    2. 如果applet通过将隐式可选参数设置为tat applet而未被授予其他应用程序,则该applet可以是基本逻辑通道上的隐式可选择性。