クマは森で用を足しますか?

アウトプットは重要です。

OMAPI/ACテスト用アプレットはこれで完成(のつもり)

自作のJava Cardアプレットをインストール可能な珍しいSIMカードOSMOCOMコミュニティーsysmoUSIM-SJS1 4FFを使ってAndroid Secure Element CTS仕様のアプレットを作る件、今回の変更でひとまず完成ということで良いのではないかと思います。テスト仕様に沿ったアクセスルールがセキュアエレメント上にないと、アクセスコントロール系のテストケースはパスしないはずですが、それは今回のアプレットとは別のお話になります。

今回の変更はMakefile

Android Secure Element CTSのOpen Mobile API系テストケース(OmapiTest.java)のために作ったJava Cardアプレットは、アクセスコントロール系テストケースにも流用されるそうです。今回の変更で更新するのはJavaのソースファイルではなく、Makefileのみ。これまでAID 31 (末尾31の意)とAID 32のみインストールしていましたが、AID 40からAID 4Fまでインスタンス数が一気に16個増えることになります。

Access Control test cases

...
You should use the applet that is used for OMAPI tests as the same commands need to be supported to pass the Access Control tests.

Create an instance of the applet under these AIDs:

  • 0xA000000476416E64726F696443545340
  • 0xA000000476416E64726F696443545341
  • 0xA000000476416E64726F696443545342
  • 0xA000000476416E64726F696443545343
  • 0xA000000476416E64726F696443545344
  • 0xA000000476416E64726F696443545345
  • 0xA000000476416E64726F696443545346
  • 0xA000000476416E64726F696443545347
  • 0xA000000476416E64726F696443545348
  • 0xA000000476416E64726F696443545349
  • 0xA000000476416E64726F69644354534A
  • 0xA000000476416E64726F69644354534B
  • 0xA000000476416E64726F69644354534C
  • 0xA000000476416E64726F69644354534D
  • 0xA000000476416E64726F69644354534E
  • 0xA000000476416E64726F69644354534F

単純にこんな風に増やそうとしたら、駄目でした。ビルドして生成されたパッケージはロードできますし、AID 40やAID 42等のインストールについても問題ないのですが、何故かAID 41だけインストール時にカードからエラーが返る。

...
        -exportpath $(JAVACARD_EXPORT_DIR)                \
        -applet $(APPLET_AID_31) $(APPLET_NAME)           \
        -applet $(APPLET_AID_32) $(APPLET_NAME)           \
+       -applet $(APPLET_AID_40) $(APPLET_NAME)           \
+       -applet $(APPLET_AID_41) $(APPLET_NAME)           \
+       -applet $(APPLET_AID_42) $(APPLET_NAME)           \
+       -applet $(APPLET_AID_43) $(APPLET_NAME)           \
...

パッケージのAIDを下記のように更新したら、AID 41もインストールできるようになりました。パッケージ、モジュール、インスタンスのAIDについてはまたあらためて時間をとって理解を深めておくべきですが、今回のところは追及せずに先を急ぎます。そもそもこんな不細工な方法でMakefileを書かなくても大丈夫だと理解しているのですが、動いている間は気にしません。

-   PACKAGE_AID         = 0xA0:0x00:0x00:0x04:0x76:0x00
+   PACKAGE_AID         = 0xA0:0x00:0x00:0x04:0x76:0x41:0x6E:0x64:0x72:0x6F:0x69:0x64:0x43:0x54:0x53

ということで、今回作成したコミットはこちら。

github.com

2018/12/14 追記 : テスト仕様的には問題ないのですが、単純なキャストミスやCase 2コマンドのハンドリングエラーが残念過ぎたので、更に下記のコード変更を追加しています。

github.com

コマンドのおさらい

パッケージのAIDも変わりましたし、ここでロードやインストールの際に利用するコマンドについておさらいします。

削除

$ python shadysim.py --pcsc -d A000000476416E64726F6964435453 --kic 9A665E9CDA096DAE9C04894785EB0B18 --kid 1A8DD88431450CAF8D3719F6380F0A18

ロード

$ python shadysim.py --pcsc -l ./cardlet.cap --kic 9A665E9CDA096DAE9C04894785EB0B18 --kid 1A8DD88431450CAF8D3719F6380F0A18

インストール (AID 31の例)

$ python shadysim.py --pcsc -i ./cardlet.cap --module-aid A000000476416E64726F696443545331 --instance-aid A000000476416E64726F696443545331 --nonvolatile-memory-required 0100 --volatile-memory-for-install 0300 --kic 9A665E9CDA096DAE9C04894785EB0B18 --kid 1A8DD88431450CAF8D3719F6380F0A18

アプレットのリスト出力

こちらは、コマンドの実行結果も載せておきます。ご覧頂けますように、アプレットインスタンスがAID 31、AID 32、AID 40からAID 4Fと18個になっています。

$ python shadysim.py --pcsc --list --kic 9A665E9CDA096DAE9C04894785EB0B18 --kid 1A8DD88431450CAF8D3719F6380F0A18
...
AID: a000000476416e64726f6964435453, State: 01, Privs: 00
        Instance AID: a000000476416e64726f696443545331
        Instance AID: a000000476416e64726f696443545332
        Instance AID: a000000476416e64726f696443545340
        Instance AID: a000000476416e64726f696443545341
        Instance AID: a000000476416e64726f696443545342
        Instance AID: a000000476416e64726f696443545343
        Instance AID: a000000476416e64726f696443545344
        Instance AID: a000000476416e64726f696443545345
        Instance AID: a000000476416e64726f696443545346
        Instance AID: a000000476416e64726f696443545347
        Instance AID: a000000476416e64726f696443545348
        Instance AID: a000000476416e64726f696443545349
        Instance AID: a000000476416e64726f69644354534a
        Instance AID: a000000476416e64726f69644354534b
        Instance AID: a000000476416e64726f69644354534c
        Instance AID: a000000476416e64726f69644354534d
        Instance AID: a000000476416e64726f69644354534e
        Instance AID: a000000476416e64726f69644354534f

Python テストコードも更新

前述の通り、Open Mobile APIのテストに用いるものと同じアプレットインスタンスをAID 40からAID 4Fでも、という要求仕様でした。そのため、これまでに書いたテストコードが必要とされている全てのインスタンスAIDで実行されるように改変しています。

    def execute_all(self):

        selectable_aids = [
            'A000000476416E64726F696443545331',
            'A000000476416E64726F696443545332',
            'A000000476416E64726F696443545340',
            'A000000476416E64726F696443545341',
            'A000000476416E64726F696443545342',
            'A000000476416E64726F696443545343',
            'A000000476416E64726F696443545344',
            'A000000476416E64726F696443545345',
            'A000000476416E64726F696443545346',
            'A000000476416E64726F696443545347',
            'A000000476416E64726F696443545348',
            'A000000476416E64726F696443545349',
            'A000000476416E64726F69644354534A',
            'A000000476416E64726F69644354534B',
            'A000000476416E64726F69644354534C',
            'A000000476416E64726F69644354534D',
            'A000000476416E64726F69644354534E',
            'A000000476416E64726F69644354534F',
        ]

        for aid in selectable_aids:
            self.testTransmitApdu(aid)
            self.testLongSelectResponse(aid)
            self.testSegmentedResponseTransmit(aid)
            self.testStatusWordTransmit(aid)
            self.testP2Value(aid)

コミットはこちら。

github.com

次回は、期待されているアクセスルールを作ることになると思います。あまり凝ったものにせず、ARA-Mアプレットで最低限のものをと考えています。早く片付けて、何か違うことを始めたくなっている今日この頃です。