自作の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
ということで、今回作成したコミットはこちら。
2018/12/14 追記 : テスト仕様的には問題ないのですが、単純なキャストミスやCase 2コマンドのハンドリングエラーが残念過ぎたので、更に下記のコード変更を追加しています。
コマンドのおさらい
パッケージの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)
コミットはこちら。
次回は、期待されているアクセスルールを作ることになると思います。あまり凝ったものにせず、ARA-Mアプレットで最低限のものをと考えています。早く片付けて、何か違うことを始めたくなっている今日この頃です。