8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WindowsでOpenSCを使う(2.カードのIDm確認編)

Last updated at Posted at 2019-05-23

はじめに

WindowsでOpenSCを使う(1.準備編)の続きです。

使用するツール

ICカードが認識されるか確認しよう

使用するコマンドはopensc-tool.exe -aです。
このコマンドを使用することにより、ATRを取得することができます。
ATR(Answer To Reset)とは、カードが電気的に活性化した際にカードから送られる初期応答情報です。ATRを取得することで、ICカードが認識されていると判断できます。

①コマンドプロンプトを立ち上げる
cdでopensc-tool.exeのあるパスに移動する
2-1.png
opensc-tool.exe -aを実行する。
2-2.png
↑青色部分が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コマンドを送信すると、画像のような応答が返ってきます。
2-3.png

緑色部分がカードの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ブロックデータ読み出し編①)

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?