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

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

SIMツールキット用サンプルアプレットは動きます

Java Cardアプレットのロードやインストールに使うPythonスクリプトが実行可能になりましたので、その仕組みについても少しずつ確認したりしなかったりします。

cheerio-the-bear.hatenablog.com

APDUコマンドを出力してみました

スクリプトは正常に終了するようになりましたが、カードとの間でどんなコマンドのやり取りが行われているかも見ておきたかったので、APDUコマンドの送受信についてもログに出すことにしました。ロードとインストールのときは、こんな感じ。

$ python shadysim.py --pcsc -l ./HelloSTK.cap -i ./HelloSTK.cap --enable-sim-toolkit --module-aid d07002ca44900101 --instance-aid d07002CA44900101 --nonvolatile-memory-required 0100 --volatile-memory-for-install 0100 --max-menu-entry-text 15 --max-menu-entries 05 --kic 9A665E9CDA096DAE9C04894785EB0B18 --kid 1A8DD88431450CAF8D3719F6380F0A18

C-APDU : a0a40000023f00
R-APDU + SW : 9f22
C-APDU : a0c0000022
R-APDU + SW : 00007fff3f0001000000000015b104050600838a838a0083008300000000000000009000
C-APDU : a0a40000022fe2
R-APDU + SW : 9f0f
C-APDU : a0c000000f
R-APDU + SW : 0000000a2fe2040005ff55010200009000
C-APDU : a0b000000a
R-APDU + SW : 988812010000202801f69000
ICCID: 8988211000000282106f

C-APDU : A010000011FFFF000000000000000000000000000000
R-APDU + SW : 9000

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

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

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

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

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

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

ICCID (3F00/2FE2)をSELECT (A4)してREAD BINARY(B0)し、次にTERMINAL PROFILE(10)。後はENVELOPE(C2)のSMS-PP DOWNLOADとGET RESPONSE(C0)を繰り返すだけの単純なやり取りでした。SMS-PP DOWNLOADの中身が肝なので、また別の機会にちゃんと見ることにします。

Androidスマートフォンで動作確認

小さなサンプルコードですので、こんな簡素なメインメニューになってます。大多数の日本人は、このメニュー画面を直接見ることなく生涯を終えるはずです。

f:id:cheerio-the-bear:20181101224412p:plain

その唯一のメニュー項目を選択すると、カードから期待通りにDISPLAY TEXTコマンドを受け取っていました。

f:id:cheerio-the-bear:20181101224417p:plain

あのサンプルコードの様子だと、どんなコマンドでも送信できるわけではないのかもしれません。API仕様を確認しましょう。