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

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

google-cardlet.capはロードできるのか

SIMツールキット用のアプレットのロードおよびインストールができることはわかりましたが、その他のJava Cardアプレットでも同様の操作が行えることを確認してゆこうと思います。あまりまとまった時間を確保してやってはいないので、さて何日かかることやらです。

cheerio-the-bear.hatenablog.com

google-cardlet.capは試してみたくなります

OMAPI (Global Platform Open Mobile API)がAndroid 9 Pieからプラットフォーム標準API (android.se.omapi)に追加されました。同機能を評価するためのCTS (Secure Element CTS)も追加され、そのテストを実施するために必要なセキュアエレメント(SE)の仕様も規定されています。google-cardletという名前のcapファイルが公開されていますので、まずはこのビルド済みオブジェクトをそのままロードできるのかどうかが気になります。

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

C-APDU : a0c200005ed15c820283818B56400881556677887ff6001129120000044502700000401506011515000000ca2e7291f238f40dafcdb3c8464ac91e6f189d5412d8c066177a1f92f4fff7104fdc896e309c76e7eb5f4ab67c5c1dcbe1c1ced9605f8ecd
R-APDU + SW : 9f14
C-APDU : a0c0000014
R-APDU + SW : 027100000f0a00000000000000000000029000009000
C-APDU : a0c20000b0d181ad820283818B81a6400881556677887ff6001129120000049502700000901506011515000000858ae020caeaf224c68d5f2aef69f2806e1507e42a28496cf4c0cd1039e850b02853d5ed2b082efeeb4903bdb6c46463ad0cfb6534dd2c626ba74f648ea497d28e18fad6e3d8dd9d3f92d24b3fd2b1c338679d96dce8a02286e8df2c844cf229665c1209f2b26e0454457f78ae5d974dd6586f32d0952bfb1e9949760fef9b54c181a73b4c3d6c3f
R-APDU + SW : 9f13
C-APDU : a0c0000013
R-APDU + SW : 027100000e0a000000000000000000000164389000
Traceback (most recent call last):
  File "shadysim.py", line 451, in <module>
    ac.load_app(args.load_app)
  File "shadysim.py", line 351, in load_app
    self.load_aid_raw(aid, data, len(data) // 2)
  File "shadysim.py", line 274, in load_aid_raw
    self.send_wrapped_apdu_checksw(apdu + '00c0000000')
  File "shadysim.py", line 236, in send_wrapped_apdu_checksw
    raise RuntimeError("SW match failed! Expected %s and got %s." % (sw.lower(), response[1]))
RuntimeError: SW match failed! Expected 9000 and got 6438.

ということで試してみましたが、駄目でした。ふたつ目のENVELOPE (SMS-PP DOWNLOAD)の時点でSW 6438が返ってきています。SW 6438の説明は、Global Platform Card Specificationにもなく。OSMOCOMにあるカードOSのプロジェクト(osmo-cos)を調べればわかるかもしれませんが、「google-cardlet.capをそのまま使う」ことが必達目標なわけでもないので、ロード失敗の原因追及は後回し。アプレットのサイズの問題とかだったら困ります。

小さなJava Cardアプレットを書いてみる

とりあえず、アプレットの体裁だけギリギリ保った小さなコードを書いてみました。これでもロードに失敗するようなら、面倒なことになりそうです。

github.com

ロードしてみるとSW 9000で終了し、どうやら最後まで走り抜けたように見えます。

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

C-APDU : a0c200005ed15c820283818B56400881556677887ff6001129120000044502700000401506011515000000e183470953febe8339e253248458e3fa942e483e05b2186286c70b382ed9c35a32344d982f6f36ebfde9a85a734aaf59a2aa9af601822eeb
R-APDU + SW : 9f14
C-APDU : a0c0000014
R-APDU + SW : 027100000f0a00000000000000000000029000009000
C-APDU : a0c20000b0d181ad820283818B81a6400881556677887ff6001129120000049502700000901506011515000000d049100e5ef82f081629d1dcb0032e9c724a25aac5f87b30304b5b0cc688b857312c3a00b1dab98d07a5050407d7a1594d20ea3e08dc070d0b39f420377fe453860e6416fb8fa51671093c347fe181c9c9d980b9d0ed9f8238036fd4573019b1fdae03851a9d338bb1b469d4ce5680695b07814e98886b0b8564e13d3f5f11a5d66bd7e5d1f91723
R-APDU + SW : 9f14
C-APDU : a0c0000014
R-APDU + SW : 027100000f0a00000000000000000000029000009000
C-APDU : a0c20000b0d181ad820283818B81a6400881556677887ff60011291200000495027000009015060115150000009cc2587965d437cb579e05ea679431f6db1df1cc3eccf538b62e87491232e00db0e62fce0a006a8a36c024e8d75e02e199592adfbeb4a0a89b03577d35f887af9a8601b18d8866be90ff0174573a1034bc031c353a62a15bce2923b577c88b2a50411b92a9a93e1d29d701adfb55a386f69d981a31cf8c3342abccec257b18162e3c7cbb999d5618
R-APDU + SW : 9f14
C-APDU : a0c0000014
R-APDU + SW : 027100000f0a00000000000000000000029000009000
C-APDU : a0c20000b0d181ad820283818B81a6400881556677887ff60011291200000495027000009015060115150000009ee2eaf0f5b0481d37a47de5c246b7b5bb504cbf010d0e42f3b9a54d43143a3fcdf6a4cdb194980fcb31ec5d56dba41663245caca2309394b05c816bd1c64b179311cac91493e8d99df5d1081f80c7aededdd32ef96f185ec550f9a7e39e08128b7819027e0b4b6aba886d6e29c6cb2e9e5d3846a761665a3885e0598c57d6416a5ee8760f960671
R-APDU + SW : 9f14
C-APDU : a0c0000014
R-APDU + SW : 027100000f0a00000000000000000000029000009000
C-APDU : a0c200007ed17c820283818B76400881556677887ff600112912000004650270000060150601151500000055648df79dca828180519ab5b7aa0ebdcf7200189f840ba0174b96b094ad38a095d4989a51a67a21d3d751ff1fccfa3b1638e042806cbcf0c79c290f4db4fdfd73a443c2b75ee6248bf0a75e4dd53ee65783d432403a6f49
R-APDU + SW : 9f14
C-APDU : a0c0000014
R-APDU + SW : 027100000f0a00000000000000000000029000009000

前回試したshadysim.pyの--list-appletsオプションを使って、GET STATUSコマンド(F2)のレスポンスも確認してみましょう。

cheerio-the-bear.hatenablog.com

Makefileに書いたパッケージAIDやモジュールAIDが、期待通りに末尾に追加されています。

$ python shadysim.py --pcsc --list-applets --kic 9A665E9CDA096DAE9C04894785EB0B18 --kid 1A8DD88431450CAF8D3719F6380F0A18
...

C-APDU : a0c2000046d144820283818B3e400881556677887ff6001129120000042d027000002815060115150000001bb804aa02e7b97bcbf090d7a5670d88f0cf47344826694cf1c99d6b5bbfdbeb
R-APDU + SW : 9f35
C-APDU : a0c0000035
R-APDU + SW : 02710000300a000000000000000000000263100da0000000090001ffffffff890001000210a0000000090001ffffffff89000000009000
C-APDU : a0c2000046d144820283818B3e400881556677887ff6001129120000042d0270000028150601151500000037a4d45e5a44929ed737065b0ce5f3c62e2ae379528083b96bea4c96ca00aeb6
R-APDU + SW : 9f23
C-APDU : a0c0000023
R-APDU + SW : 027100001e0a000000000000000000000263100fa0000000090001ffffffff89b000109000
C-APDU : a0c2000046d144820283818B3e400881556677887ff6001129120000042d0270000028150601151500000037a4d45e5a44929ed737065b0ce5f3c62e2ae379528083b96bea4c96ca00aeb6
R-APDU + SW : 9f35
C-APDU : a0c0000035
R-APDU + SW : 02710000300a000000000000000000000263100da0000000871002ff49ffff890001000110a0000000871002ff49ffff89040b00009000
C-APDU : a0c2000046d144820283818B3e400881556677887ff6001129120000042d0270000028150601151500000037a4d45e5a44929ed737065b0ce5f3c62e2ae379528083b96bea4c96ca00aeb6
R-APDU + SW : 9f32
C-APDU : a0c0000032
R-APDU + SW : 027100002d0a000000000000000000000263100aff434e5258104004020301000110ff434e525810400402030000000000009000
C-APDU : a0c2000046d144820283818B3e400881556677887ff6001129120000042d0270000028150601151500000037a4d45e5a44929ed737065b0ce5f3c62e2ae379528083b96bea4c96ca00aeb6
R-APDU + SW : 9f27
C-APDU : a0c0000027
R-APDU + SW : 02710000220a0000000000000000000002631007d07002ca44900101000108d07002ca449001019000
C-APDU : a0c2000046d144820283818B3e400881556677887ff6001129120000042d0270000028150601151500000037a4d45e5a44929ed737065b0ce5f3c62e2ae379528083b96bea4c96ca00aeb6
R-APDU + SW : 9f3c
C-APDU : a0c000003c
R-APDU + SW : 02710000370a000000000000000000000290000c6f6d617069636172646c65740100020b6f6d6170694a53523137370c6f6d61706943616368696e679000
AID: a0000000090001ffffffff8900, State: 01, Privs: 00
        Instance AID: a0000000090001ffffffff8900000000
        Instance AID: a0000000090001ffffffff89b00010
AID: a0000000871002ff49ffff8900, State: 01, Privs: 00
        Instance AID: a0000000871002ff49ffff89040b0000
AID: ff434e52581040040203, State: 01, Privs: 00
        Instance AID: ff434e52581040040203000000000000
AID: d07002ca449001, State: 01, Privs: 00
        Instance AID: d07002ca44900101
AID: 6f6d617069636172646c6574, State: 01, Privs: 00
        Instance AID: 6f6d6170694a5352313737
        Instance AID: 6f6d61706943616368696e67

削除も大丈夫。

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

C-APDU : a0c200004ed14c820283818B46400881556677887ff6001129120000043502700000301506011515000000184ee6f3a90d2c0bb4a76c746bca424d49ce1d224e0e5cfc0f03b77bdb4f423c57ea2bde7b75efdd
R-APDU + SW : 9f14
C-APDU : a0c0000014
R-APDU + SW : 027100000f0a00000000000000000000029000009000

次はロードしたパッケージに含まれているモジュールのインストールを実行してみて、SELECTコマンド(A4)の送受信ができることを確認することにします。はい、何日かかるんでしょうこれ。