はじめに
WindowsでOpenSCを使う(1.準備編)の続きです。
使用するツール
- コマンドプロンプト
- opensc-tool.exe(WindowsでOpenSCを使う(1.準備編)参照)
- カードリーダー:PaSoRi RC-S380
- ICカード=Felica
ICカードが認識されるか確認しよう
使用するコマンドはopensc-tool.exe -a
です。
このコマンドを使用することにより、ATRを取得することができます。
ATR(Answer To Reset)とは、カードが電気的に活性化した際にカードから送られる初期応答情報です。ATRを取得することで、ICカードが認識されていると判断できます。
①コマンドプロンプトを立ち上げる
②cd
でopensc-tool.exeのあるパスに移動する
③opensc-tool.exe -a
を実行する。
↑青色部分がATR値です。
カードが認識されない場合は青色部分にFailed to connect to card: Card not present
と表示されます。その上のUsing reader with a card: Sony FeliCa Port/PaSoRi 3.0 0
は接続しているカードリーダーの情報です。
カードのIDmを取得しよう
いよいよカードのIDmを取得します。
ここで使用するコマンドはopensc-tool.exe -s
です。
opensc-tool.exe -s
を使用して、APDUコマンドをカードに送信します。ここでいきなり登場したAPDUコマンドについては後述します。
ICカードを認識した時と同じ要領でopensc-tool -s FF:CA:00:00:00
コマンドを送信すると、画像のような応答が返ってきます。
緑色部分がカードのIDm(UID)です。今回はFelicaを使用して、8byteのIDmが取得されました。
ピンク部分はカードのIDm(UID)を文字列に直したものです。無視して大丈夫です。
Received (SW1=0x90, SW2=0x00)
はカードから返ってきたレスポンスで、正常終了を意味します。
ADPUコマンドとは
APDU(Application Protocol Data Unit)という、カードに対する命令とそれに付随するデータです。
コマンドを受信したカードは応答としてレスポンスを返し、アプリケーションはレスポンスを確認して、コマンドが成功したかどうかを判断します。
カードに送るコマンドがカード毎に異なる設計になっている場合、 アプリケーションはカードの数だけコマンドを理解する必要が生じ、 互換性の維持が難しくなります。 こうした問題を解消し、カードの設計に共通の規約を設ける意味で、 ISO 7816という国際規約が制定されています。 この規約は、カードの性質を15のパートに区分けして規定し、 その中のISO 7816-4/8/9がカードに送るべきコマンドの構造を規定しています。 したがって、このコマンドを理解しておくことで、 ISO 7816準拠の各カードを共通のコードで取り扱うことができるようになります。
EternalWindows
スマートカード / コマンドとレスポンスより引用)
今回使用したコマンドは引用元のISO 7816準拠の各カードを共通のコードを使用しています。
ISO 7816におけるコマンドの基本のフォーマットはこれ。
ヘッダー | |||
---|---|---|---|
CLA | INS | P1 | P2 |
そして今回使用したコマンドのフォーマットはこれ。
ヘッダー | ボディ | |||
---|---|---|---|---|
CLA | INS | P1 | P2 | Le |
ヘッダー部の4項目がコマンドに必須で、ボディ部のデータはオプションです。
今回はオプションのLeがついている形ですね。ほかにもパターンがありますが割愛します。
簡単に項目と意味を説明すると下記の表のようになります。
項目名 | サイズ | 説明 |
---|---|---|
CLA | 1byte | クラスバイトのこと。 |
INS | 1byte | コマンドが行うべき命令の値 |
P1 | 1byte | コマンドのパラメータ。値はINSに依存。 |
P2 | 1byte | コマンドのパラメータ。値はINSに依存。 |
Le | 1byte or 3byte | レスポンスの最高サイズ |
今回使用したコマンドの解説
FF:CA:00:00:00
GetDataコマンド = IDm(UID)問い合わせ
byte No | 項目名 | 指定値 | 説明 |
---|---|---|---|
0 | CLA | FF | 命令クラス FF固定 |
1 | INS | CA | GET DATAコマンド |
2 | P1 | 00 | 今回パラメータ不要なので00固定 |
3 | P2 | 00 | 今回パラメータ不要なので00固定 |
4 | Le | 00 | データサイズ。何のデータサイズだろう。よくわからないときは00でいいと思う。 |
これでICカードのIDmが読み取れます。FelicaもTypeA、TypeBもいけるみたいです。
後から確認してみたら、LeはなくてもIDm取得できました...
よく考えたら00だから何も指定してないのと同義ですよね。
ちなみにopensc-tool -s FF:CA:00:00:00
の:
を略して
opensc-tool -s FFCA000000
と送信してもOKです!
今後調べていきたいこと
- コマンドの調べ方
- CLAに
FF
を設定すれば命令を意味することになる...ほかのCLAはどこに書いてあるの? - GetDataはOpenSCだと
CA
だけど、参考サイト様では0xca
だったので同じ意味だと最初わかっていなかったり...あんまり根本的に理解できてないので - OpenSC使わないでアプリでカード認識していくやり方など
参考
WindowsでOpenSCを使ってカードのIDmを確認する方法
EternalWindows
スマートカード / コマンドとレスポンス
関連ページ
WindowsでOpenSCを使う(1.準備編)
WindowsでOpenSCを使う(3.MIFARE Classicブロックデータ読み出し編①)