Windows 10 mobileでnfc~suica・edy対応編~(公開用)

  • View
    4.744

  • Download
    1

  • Category

    Software

Preview:

Citation preview

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 の 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 の扱い• エミュレータで開発可能