windows 10 mobileでnfc~suica・edy対応編~(公開用)
TRANSCRIPT
Windows 10 Mobile で NFC~ Suica ・ Edy 対応編~
@第 13 回まどべんよっかいち2015/10/10青木 宣明 (@kumar0001)
今日の内容Windows 10 Mobile での NFC タグ、特に Felica の読み取りについて• Windows.Devices.SmartCards.SmartCar
dReader クラス• NFC Smart Card Reader PC/SC Library• Felica の読み取り方法
Edy での注意点と対応策
Windows Phone 8.1 の場合の補足
Windows 10 Mobile と非接触 IC カード
NFC とは?NFCIP-2
ISO/IEC 21481
NFCIP-1ISO/IEC 18092
Type F (Felica)
Type A (MIFARE)
ISO/IEC 14443Type B
ISO/IEC 15693
Suica,Edy taspo
住基カード免許証 RFID タグ
いずれも 13.56MHz
Windows Phone と非接触 IC カードWindows Phone 8 まで• Proximity API で NFC タグの読み書きが
可能NDEF と呼ばれるフォーマットだけサポート
している• Publish/Subscribe でタグデータにアク
セスするAP 起動URI (Web, GeoTag, Telphone, Mail, …)
デモ
Windows Phone と非接触 IC カードWindows Phone 8.1 以降• 条件付きながら NDEF 形式でない IC カー
ドの読み書きが可能になっているWhat's New in Windows Phone 8.1
を読んで (その5) http://app.strawhat.net/posts/2014/04/12/Whats
-New-in-Windows-Phone-81-part5/• 条件
PN547 を搭載した端末現状では同チップのドライバーしか対応していない
対応する端末
Lumia 730 Lumia 830 Lumia 640 Lumia 640XL
SmartCardReader クラスWindows.Devices.SmartCards 名前空間• IC カードリーダ、 IC カードを扱うクラス
が属している• この名前空間を使って IC カードと通信す
る
SmartCardReader IC カードリーダのクラス。カード追加・離脱の検知イベント
SmartCard IC カードのクラス。IC カードとの接続、ステータス取得
SmartCardConnection IC カードとの通信のクラス。データの転送、通信路のクローズ
SmartCardReader での通信手順SmartCardReader で IC カードリーダを取得して、カード検知のイベントハンドラを設定
カードを検知したら SmartCard.ConnectAsync で IC カードに接続して、 SmartCardConnection を取得
SmartCardConnection.TrasnmitAsync で IC カードに APDU でコマンドを送信する
SmartCardConnection.Dispose で通信を閉じる
APDU
Application Protocol Data Unit• IC カードに送信するコマンドのデータ
コマンドクラス , コマンド指示コード , P1, P2, データ長 , データ , 出力長
PC/SC Workgroup Specifications 2.01.14 “Part 3. Requirements for PC-Connected Interface Devices” から引用
NFC Smart Card Reader PC/SC Library
Windows Phone 8.1 で NFC タグとraw 通信するライブラリ• https
://nfcsmartcardreader.codeplex.com/• NFC タグごとに APDU を組み立てて送信
するクラス群を提供Windows 10 UWP アプリのサンプルにも収録されている
https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/Nfc
PC/SC
PC/SC とは?• 各社の IC カードリーダ、 IC カードを相互利
用するための API• Microsoft を中心としたワークグループで定
義http://www.pcscworkgroup.com/
PC/SC Library では、 APDU を使わないIC カード (Felica など ) においても PC/SC に沿って APDU でコマンドを送信• ドライバが適切なネイティブのコマンドに
変換する
PC/SC での処理の流れ接続
• SCardEstablishContext – リソースマネージャに接続• SCardListReaders – カードリーダの取得• SCardConnect – カードとの接続
通信• SCardStatus - カードの状態を取得• SCardTransmit – カードとの通信
切断• SCardDisconnect – カードとの切断• SCardReleaseContext – リソースマネージャの解放
PC/SC Library での通信手順SmartCardReader で IC カードリーダを取得して、カード検知のイベントハンドラを設定
カードを検知したら SmartCard.ConnectAsync で IC カードに接続して、 SmartCardConnection を取得
ICカードの AccessHandlerを作成して、 ReadAsync / WriteAsync でデータを読み書き
SmartCardConnection.Dispose で通信路を閉じる
Felica のファイルシステム
Felica カードユーザーズマニュアルから引用 http://www.sony.co.jp/Products/felica/business/tech-support/
Felica には複数のシステムが共存できて、それぞれ独立している。ファイルシステムのアクセス単位はブロック (16 バイト ) で、サービスごとに 0 から始まるブロック番号で指定される。
Felica コマンド一覧Polling カードを検出する
・システムコードを指定Read Without Encryption 認証が不要なサービスからブロックデータを取得する
・カードの IDm 、サービスコード、ブロック番号を指定Request Service サービスの存在確認Request Response カードの存在確認Write Without Encryption 認証が不要なサービスへブロックデータを書き込むRequest System Code カードに登録されているシステムコードを取得する
情報の入手に別途契約が必要なコマンドもあるため、他は省略する。
サービスコード・ブロックコード情報
どこで入手可能?
多くが非公開有志が解析した情報が Web で入手可
Felica のアクセスに必要な情報・サービスコード・ブロック番号・バイトデータのデータ構造
PC/SC での Felica の読み取りFelica.AccessHandler の ReadAsync• Felica.AccessHandler
SmartCardConnection を指定して生成• 引数
サービスカウント数サービスコードリストブロックカウントブロックリスト
• 戻り値バイト配列
指定したサービスコードのブロックリストから読み込んだデータ
Suica のフォーマット
引用元http://iccard.jennychan.at-ninja.jp/format/suica.xml
Suica のフォーマット
引用元http://iccard.jennychan.at-ninja.jp/format/suica.xml
Suica の ReadAsync 結果デモ
Edy のフォーマット
引用元http://iccard.jennychan.at-ninja.jp/format/edy.html
Edy のフォーマット
引用元http://iccard.jennychan.at-ninja.jp/format/edy.html
EDY の ReadAsync 結果デモ
nanaco のフォーマット
引用元http://iccard.jennychan.at-ninja.jp/format/nanaco.html
nanaco の ReadAsync 結果共通領域
それ以外の領域
Edy の読み込み失敗共通領域 FE00 を使う Edy の読み込みが
失敗する• それ以外のシステムの読み込みは OK
原因の推測• PC/SC Library で Felica を読むとき、システ
ムコードを指定するタイミングがないため、ワイルドカードの FFFF でポーリングしていると考えられる。このため、常に 1 番目のシステムにアクセスして
いるのではないか?• 共通領域は 2 番目に配置されるとの情報があ
り、このため共通領域が読めないのでは?
Edy を読むには…?PC/SC Library の ReadAsync ではな
く、 Felica のコマンドを直接発行する1. システムコードを指定した Polling を行い、
カードを検出して IDm を取得2. 取得した IDm で Read Without Encryption を
実行して、ブロックデータを取得
Polling + システムコード⇒ IDm 取得
Read Without Encryption + IDm + サービスコード・ブロック番号 ⇒ ブロックデータ取得
Felica のコマンド送信
PC/SC の Transparent Exchange コマンドがあります
でも、どうやって Felica にコマンドを送信するの?
PC/SC ライブラリではFelica.AccessHandle クラスの TransparentExchangeAsync メソッド
Transparent Exchange で Polling
private async Task<byte[]> FelicaPolling(Felica.AccessHandler felicaAccess, UInt16 systemCode){ byte systemCodeUpper = (byte)(systemCode >> 8); byte systemCodeLower = (byte)(systemCode & 0x00ff);
byte[] commandData = new byte[] { 0x00, 0x00, systemCodeUpper, systemCodeLower, 0x01, 0x0f }; commandData[0] = (byte)commandData.Length;
var result = await felicaAccess.TransparentExchangeAsync(commandData); return result;}
Transparent Exchange で Read Without Encryption
Read Without Encryption も同様にコマンドを作成して送信
EDY の Read Without Encryption 結果デモ
PC/SC Library を使わない方法Windows.Devices.SmartCards 名前空間だけを利用する方法も• SmartCardConnction の
TransmitAsync メソッド• PC/SC の仕様書通り Transparent
Exchange の APDU を作成して送信する
Transparent Exchange
Transparent Exchange
Windows Phone 8.1 と非接触 IC カード
Windows Phone 8.1 では?Transparent Exchange が利用不可ReadAsync は利用可能• Suica は読み取り可、 Edy は不可
まとめ
まとめ非接触 IC カードの読み書き• PN547 搭載端末では SmartCardReader クラスで実現可• Transparent Exchange で Felica コマンドを発行することで Suica ・ Edy にアクセスできる
PC/SC ライブラリ• PC/SC ライブラリの Read Binary は Suica は読み込み可、 Edy は読み込み不可
課題日本国内での NFC 対応端末• MADOSMA は NFC 非搭載• 今後の端末で Transparent Exchange に対応した端末が出てくるかどうか…
Felica アクセスのライブラリの整備• PC/SC ライブラリに依存しない方向で作成を検討中
参考資料Felica• http://www.sony.co.jp/Products/felica/
business/tech-support/
PC/SC• http://www.pcscworkgroup.com/
IC カードフォーマット• http://
iccard.jennychan.at-ninja.jp/format/index.htmlシステムコードのバイト順序が他サイトと異
なるので注意 (0xfe00 ⇔ 0x00fe)
今回扱わなかった発表テーマホストカードエミュレーション• カードとして振舞う
エミュレータでの NFC の扱い• エミュレータで開発可能