1

履歴バイトの変更は、パーソナライズ前のステップに限定されているとすでに考えていました。しかし、今日、GlobalPlatform API で setATRHistBytesという名前のメソッドを見つけました。

これはその説明です(GlobalPlatform 2.2 Page 172):

setATRHistBytes

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

ISO/IEC 7816-4 に準拠したコンタクト カードおよび ISO/IEC 14443-3 に準拠したタイプ A 非接触カードの場合、このメソッドは履歴バイトを設定します。バイトのシーケンスは、その後の電源投入またはリセット時に表示されます。

ノート:

• OPEN は、GlobalPlatform レジストリ内の現在のアプレット コンテキストのエントリを見つけ、アプリケーションが現在のカード I/O インターフェイスに対するカード リセット権限を持っていることを確認します。

• 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);
        }
    }

}

上記のように、APDU コマンドを受信したとき0102030405060708090AHistorical BytesINS=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ですか? (アプレットの権限がCard ResetsetATRHistBytesでない場合にこのメソッドが返されることが説明に記載されているため、例外が返されることを期待しています)false

4

2 に答える 2

4

リセット権限は、以前はデフォルトで選択された権限と呼ばれていました。これは、カードのスイッチを使用できることを意味します。これ--defaultを行う場合、INSTALL 特権バイトの INSTALL で反転したのと同じビットです。

ATR バイトの変更が伝達される前に、カードがコールド リセット (つまり、フィールドまたはターミナルからカードを取り外す) を予期することがあります。これはリーダーの問題である可能性もあります。すべてのリーダーが再接続時にリセットを実行するわけではなく、ATR バイトをキャッシュする場合もあります。

于 2015-04-06T10:53:15.930 に答える
0

カードリセット権限をアプレットに設定するには、アプレットのInstallコマンドとmake selectableコマンドで最初の権限バイトのbit3を設定する必要があります。アプレットがインストールされているだけで、同じ INSTALL コマンドで選択可能にされていない場合、カード リセット権限は設定できません。

実際、カードが GP201/GP211 に準拠している場合、カード リセット権限をデフォルト選択権限と呼びます。

Default Selected 権限が GP201/GP211 準拠カードに設定されている場合、次の 2 つの機能がアプレットに提供されます。

  1. アプレットは履歴バイトを変更できます
  2. アプレットは、コールド リセット後に基本論理チャネルでデフォルトで選択されたアプレットになります。

GP22 以上のバージョンのコンプライアンス カードでカード リセット権限が設定されている場合、次の機能がアプレットに提供されます。

  1. アプレットは履歴バイトを変更できます
  2. アプレットは、暗黙の選択可能パラメーターを tat アプレットに設定することによって別のアプリケーションに与えられていない場合、基本論理チャネルで暗黙の選択可能にすることができます。
于 2015-06-17T11:09:41.997 に答える