はじめに
スマートカードには接触型と非接触型の2種類があります。
最近スマートカードに関する開発を担当し、NFCの規格や仕様を調べる機会がありました。
この記事では非接触型のスマートカードとどうやって通信するのかを紹介します。
NFC
非接触型のカードはNFC ( Near Field radio Communication )という近距離無線の通信規格が用いられます。
NFCフォーラムには国際標準規格ISO/IEC 14443 Type-A, Type-Bや、ISO/IEC 18092にもとづくType-Fなどの規格があり、クレジットカード、マイナンバーカード、免許証、交通系ICなどの様々なカードに用いられています。
ATR
ATRとはAnswer To Resetの略で、カードが端末によってリセットされた際に一連のデータを応答として送信します。ATRの情報からカードとの通信プロトコルを決定します。Type-Aのカードから得たATRを下記に示します。
ATR: 3B 80 80 01 01
1バイト目はTSと呼ばれるキャラクタで、後続キャラクタの符号を決定します。
3Bの場合はLSBから順にデータが送信され、3Fの場合はMSBからデータが送信されます。
ほとんどのカードは3Bが推奨されるそうです。
2バイト目はT0と呼ばれ、このキャラクタの値によってATRの残りのキャラクタが決定されます。上位4ビットによってTA1、TB1、TC1、またはTD1の有無が決まり、5ビット目からTA1、TB1、TC1、TD1の順に対応しています。
今回、上位4ビットは"1000"であるのでTD1のみ存在します。
また、下位4ビットによってヒストリカルバイトの数を決定します。ヒストリカルバイトとは、カードの総合的な情報で、カードの種類によって送信される情報が違います。Type-AのカードではATS(Answer To Select)、Type-BのカードではATQB(Answer To reQuest for PICC B)となります。今回は"0"であるので、ヒストリカルバイトが存在しません。
3バイト目はTD1となります(T0によって決定)。上位4ビットによってT0と同様に、TA2、TB2、TC2、TD2の有無を決定します。今回は"1000"であるのでTD2のみ存在します。
また、下位4ビットは通信プロトコルを決定し、"0"であればT=0、"1"であればT=1となります。T=0はキャラクタベース、T=1はブロックベースとなるそうです。今回はT=0となります。
4バイト目はTD2となります。TDx(xは0以上の整数)はすべて同様の仕様であるので、この場合、以降のキャラクタは存在せず、T=1となります。
5バイト目はTCKと呼ばれるチェックキャラクタで、最初のキャラクタ(TS)からTCKまでの排他的論理和が"0"となるような値をとります。
ATRについての詳細は下記のサイトにあります。
密着型ICカードの実装規約
APDU
スマートカードとデータ通信する際に、APDUコマンドというものがよく使われます。
APDUとはApplication Protocol Data Unitの略で、スマートカードと通信するための規格です。
カードリーダなどのデバイスからカードに送信するAPDUをCommand-APDU、カードからデバイスに返信されるAPDUをRespons-APDUといいます。下記のサイトで詳しく解説されています。
APDU (Application Protocol Data Unit) プロトコル
通信デバイス
NFCとやり取りするには通信デバイスが必要です。PC/SC Win32APIに対応したカードリーダを使うと、APIを使ってカードとやり取りすることができます。
APDUでデータのやり取り
実際にデータのやり取りをしてみます。再度Type-Aのカードを使いました。
R-APDUの末尾が"9000"でコマンド成功となります。
C-APDU: 80CA00E000
R-APDU: e012c00401018010c00402018010c004030180109000
C-APDUのパラメータをE0とすることで、選択中アプリのKey Informationを取得できます。
R-APDUの内容はGlobalPlatform Card Specification 2.2.0.7の11.3.3.1に書いています。
レスポンスはTLV構造となっていて、1バイト目はテンプレートE0を返し、タグはC0となっています。データ部の"01 01 80 10"はそれぞれ、ID: 01、Version: 01、KeyType: DES(80)、LEN:16となります。
全部で3つあるので、まとめると
ID: 01、Version: 01、KeyType: DES(80)、LEN:16
ID: 02、Version: 01、KeyType: DES(80)、LEN:16
ID: 03、Version: 01、KeyType: DES(80)、LEN:16
となります。なぜ3つ並んでいるのかはよく分かりません。3つでトリプルDESということでしょうか("81"がTripleDESなので違う気がする)。
まとめ
無事にスマートカードと通信することができました。スマートカードは暗号方式にトリプルDESを採用していることが多いようですが、FelicaはAESも採用しているらしいです。他にもカードによって、製造元の情報なども確認することができます。