目的
この記事はFeliCaで何かしたい、けどなにがなんだか分からない!という方を対象に作られた入門記事(のつもり)です。
多分に独自研究が含まれていますが実際ほとんど独自に研究したものなので仕方がないです。
内容は随時更新します。
更新履歴
2022/07/26 公開
2022/08/09 気が向いたので更新
2023/01/07 明けましておめでとうござい更新
NFC
NFCとは
「Near Field Communication」の略で近距離無線通信規格の一つです。
NFCとFeliCaの関係は重要ですが複雑ですので解説を他記事に委ねます
NFCの種類
NFC-A,B,F,Vの4種類です。
Aは海外で主流なMifareとほぼ同一で、情報も多く安価で開発しやすいです。 ゲームセンターのカード等に使われています。
Bは日本では運転免許証やマイナンバーカード等の公的身分証等に使われています。 お堅い印象でエミュレートもできず手を出してはいけない気がします。
一度ちょっかいをかけたことがあります。
という訳でマイナンバーカードをロックするAndroidアプリを作りました
— OLIET研究所 月鉈所長 (@OLIET_lab) 2022年10月14日
代償:区役所行きhttps://t.co/PffrV6Yyjv https://t.co/b3fRC5hP8m
GitHub - OLIET2357/mynalock: マイナンバーカードをロックするAndroidアプリです
Fは日本で主流のFeliCa規格で、交通系ICカードや身分証等に使われています。
Vは回転寿司の皿にかざすと読めます。
FeliCa
FeliCa Lite-SとStandardの違い
FeliCaカードには現在Lite-SとStandardの二種類あります。
FeliCa Standardがその名の通り標準で、リーダがカードを認証する片側認証に加え、カードもリーダを認証する相互認証にも対応しています。なおこの手順は非公開です。
FeliCa Lite-Sはその廉価版で、生産停止したFeliCa Liteの完全上位互換です。手順が以下の「FeliCa Lite-Sユーザーズマニュアル」に公開されている片側認証にのみ対応しています。
ソニー株式会社 | FeliCa | 法人のお客様 | 技術情報
HCE-Fとその制限
Androidスマートフォンはバージョン7からハードウェアが対応していればFeliCaカードのように振る舞えるHCE-F(Host Card Emulation Type F)機能を搭載しています。
しかし基本的に既存のカードを偽造できないようになっています。機種によってはRoot化で解除できます。
アンドロイドアプリ 任意のFeliCaカードエミュレータ(要ROOT?) - OLIETの自由帳
ライセンス
ブランクのFeliCaカードを購入しても好き勝手システムコードを発行出来るわけでも暗号領域を読み書きできるわけでもなく、IDm・非暗号領域での認証や良くてLite-Sでの片側認証に終始してしまします。
なぜなら発行や暗号通信をするには正当な導入事由を持った法人にしか卸さないであろう高額(噂)なリーダやSDKのライセンスが必要だからです。
ソニー株式会社 | FeliCa | 法人のお客様 | 製品情報 | ソフトウェア開発環境
リーダライタ
それらを使うための公式のSDK以外にも多数のドライバが有志によって開発されています。
ほぼ全てのリーダはPC/SCという標準規格に対応しているため、共通のプログラムで最低限のこと(IDmを読むくらい)はできるはずですがあまり試したことはありません。
RC-S380 はいいぞ
RC-S380は読める書ける成れるの三拍子揃ったリーダライタエミュレータです。
既に生産終了しましたが中古で大量に出回っているため入手に困ることは無いでしょう。
nfcpyによりWindows,Mac,Linuxで読み書きエミュレートできます。
現状FeliCaカードをフルにエミュレートできるUSBリーダはこれだけです。
RC-S390 はサ終したけど一応読める
RC-S390の専用アプリは公開停止されましたが、復刻に成功しました。コマンドがRC-S380と一緒で良かったです。
しかしRC-S380と違って現状FeliCaの読み取りしかできません。
これがハードウェア上の制限なのかソフトウェア・ファームウェア上の制限なのかは不明です。
RC-S320 は安いけど読み書きだけ
RC-S320 は秋葉原の端の方で百円、真ん中の方で二百円、平均五百円で売っています。読み書きだけならこれでできます。WindowsとLinuxで動きます。
大量に購入して色々なカードを置き、出先でお手持ちのスマホにリレーするという使い方を構想しています。
RC-S620 (未所持)
RC-S620 は組み込みでUART通信のFeliCaリーダです。ある意味OSを選びませんが手間です。
少なくともFeliCaのポーリング応答をエミュレートできます。
ACR122U(FeliCaには不向き)
ACR122Uはチップセットにpn532を搭載し、PC/SCエスケープコマンドで直接通信ができます。
pn532のデータシートにはFeliCaのエミュレーションとの記述があるため、安価なACR122UでFeliCaのエミュレートができると期待しています。
FeliCa Card emulation
https://www.nxp.com/docs/en/nxp/data-sheets/PN532_C1.pdf
エミュレート
学生証・社員証エミュレートしたい(場合によってはできる)
身分証のエミュレートはIDmしか見ていない(バ先実話)とか、非暗号通信していた(大学実話)とかなら可能です。この世界は脆弱。
学生証のエミュレートについては今年四月に機密解除されます。
Suicaエミュレートしたい(無理)
しっかりと相互認証して暗号通信してるのでSuicaのエミュレートは不可能です。 なお、いとも簡単に使えるおサイフケータイは専用のハードウェアを搭載しています。
コピーではなくパソコンにRC-S380を二台繋いで片方のリーダの上にカードを置いておき、FelicaRelay(公開停止中)でリレーすることは可能です。
これをスマホ二台やパソコンとスマホといった組み合わせで無線でリレーできれば便利なのですが難易度が高く挫折中です。
セキュリティ
非公開
セキュリティ関連のコマンドはほとんど非公開で、これは安全性のためとはいえケルクホフスの原理に反しています。
手順を公開して大量の暗号研究者に叩いて貰うのが現代の常識です。
インシデントがない
今のところFeliCaは長く守られ続けていて、Suicaが偽造されたなどといったニュースは寡聞にして聞きません。
そもそも、FeliCaは単なるインターフェースであって、高速化のために内部に情報を保持しているとは言え結局はサーバ管理のため一時的に残高等を偽造できたとしてもすぐに検出されるはずです。
それよりも前述した暗号化のなされていない身分証等のほうがよっぽど問題です。
FeliCaの安全性は確かだが平文通信じゃあね…
情報の少なさ
非暗号の基本的なコマンドは公開していますがセキュリティ関係のコマンドは「隠すことによるセキュリティ」に頼っていることを否めません。
暗号通信や中核のセキュアエレメントなどについてできるかぎり調査してみます。あなたは独りではありません。