Hex NFC 開発記:究極の NFC ツールアプリ

Hex NFC は 4 か月かけてゼロから開発したプロ仕様の NFC ツールです。この記事では、どのように開発し、何が必要だったのかを振り返ります。

Matthew Scott15 分で読めます
An NFC chip with a passport on the left and a PASMO transit card on the right.

メモ

Hex NFC は数日以内にリリースされます。詳しくは apps.hex.pro/hex-nfc をご覧ください

4 か月ほど前、メルボルンへの週末旅行の最中に、Hex Pro 初のアプリのアイデアが、酔っ払いの運転するトラックのように私に突っ込んできました。この例えが的確なのは、プロジェクト開始から 2 か月の時点で感じたのが、まさにそういう感覚だったからです。

NFC:嘆かわしい現状

その数日前、私は地元のジムで、小型冷蔵庫(ホームセンターの Bunnings で 1000 豪ドルで買ってから 3 日後に、寝室に置くにはあまりにうるさいと気づき、親切にも寄付したものです)用の決済手段を用意する手伝いをしていました。エナジードリンクを売って小銭を稼ごうとしていた若い商売人は、PayID で自分宛てに送金してもらうつもりでいました。自尊心のあるソフトウェアエンジニアとして、そんなずさんなやり方を見過ごすわけにはいきません。そこで、NFC 決済の仕組みを無償で実装すると申し出ました。

当時、実は NFC タグを扱ったことは一度もなかったのですが、下調べをしてから AliExpress に飛び、NTAG213 の 10 枚パックを注文しました。そして Stripe を使って、簡単な決済ポータルを手早く組み上げました。新しい NFC タグにポータルの URL を書き込もうとしたとき、興味深いことに出くわしました。iOS の App Store で最大の NFC アプリは、レビューが 14,000 件、いや何十万、下手をすれば何百万ものインストール数を誇っていました。当然、インストールして試してみました。何が分かったか? そのアプリはひどい代物品質の低いものでした。これが頂点だとは信じられませんでした。本当にこれより良いものは作れないのでしょうか? 正直なところ、開発元をけなすつもりはありません。今振り返れば、彼らがアプリの開発で直面したに違いない困難も理解できます。しかし、これが Hex NFC のきっかけになったことは間違いありません。

NFC 入門

初めての方のために、NFC とは実際のところ何でしょうか。Near Field Communication(近距離無線通信)の略で、「デバイスをタグに近づけて読み取る」ということを指す「高度に技術的な」用語です。

NFC チップは実は小さなコンピューターで、論理演算を行いデータを保存できる、本物のシリコン製マイクロチップです。ほとんどは前者には単純すぎますが、暗号化を行ったり、乱数に対して数学的な演算(チャレンジレスポンス)を行ったりできるものもあります。NFC チップの最もすごいところは、自前の電源を持たないことです。代わりに、リーダー側のデバイス(この場合は iPhone)が電磁界を発生させ、それが NFC チップに電力を供給します。まさに天才的な技術ですが、さらに続きがあります。チップは応答として磁気的なリズムを振動させ、リーダーがそれを検出して読み取り可能なビットに変換するのです。

ここで厄介なのは、NFC チップにはさまざまなモデルとメーカーがあり、それぞれ独自のプロトコルとアーキテクチャを持っていて、データシートがどれも特に明快というわけではないことです。

NFC を扱う難しさ

メルボルンからサンシャインコーストに戻って最初にしたのは、さまざまな NFC チップの仮想エミュレーターを作り始めることでした。当時、手元にある NFC タグは多くありませんでした。出発点の在庫は、ジムの遠征で残った NTAG213 が 5 枚と、謎めいた公共交通カードが 2 枚(日本の PASMO とメルボルンの Myki)でした。iPhone で読み取ることはできましたが、はっきりした手がかりは何も得られませんでした。

ネット上の NFC チップの資料が十分にしっかりしていれば、あらゆる種類の物理的な NFC チップを実際に持たなくても済むだろうと考えていました。ロジックをエミュレーターで走らせれば、それで動くと分かる、と。当時の私は何と世間知らずだったことか。

NTAG213 は実のところ、かなり順調に進みました。消費者向け NFC チップとして最も普及している種類で、資料も充実しています。世界中で使われ、オープンな標準に強く準拠した、実戦で鍛えられたデバイスです。

例の 2 枚の謎めいた交通カードに取りかかると、思っていたほど単純にはいかないと気づきました。PASMO カードはソニー製で、日本中の公共交通機関で使われている FeliCa スマートカードであり、同種のほぼすべてのチップを上回る能力を持っていることが分かりました。Myki は読み取り専用の MIFARE DESFire EV3 で、NTAG213 と同じメーカーである NXP 製でした。

目標は、他を圧倒するような究極の NFC ツールを作ることでした。求められる能力の範囲が広がり、実際に出回っているチップの数と種類について知るにつれ、実機でのテストは避けられないと分かりました。そこで、できる限りカバー範囲を広げるため、さまざまなチップを注文しました。全リストはこちらでご覧いただけます。

こうして、エミュレーター開発が本格的に始まりました。チップごとに専用のエミュレーターを用意し、エミュレーターが実際のチップにできる限り忠実になるよう、あらゆる操作と機能を実物のシリコン上で綿密にテストしました。容易なことではなく、きわめて時間のかかる作業でしたが、100% その価値はありました。何百時間も費やして、高い信頼性と、実物のシリコンの各モデルに対してユニットテストを行える体制を手に入れました。

ライセンス、データの出所、サードパーティパッケージ

このプロジェクトの大きなハードルの一つは、(Apple を除いて)外部のライブラリや依存関係に一切頼らずにこのパッケージを開発したいと考えたことでした。Hex Pro の根底にあるのは、プライバシー、信頼、誠実さです。子どもの頃に叩き込まれた倫理観であり、手っ取り早いことをするより、正しくやることのほうが大きな成功につながると本気で思っています。職業人としてのキャリアを通じて、私は常に顧客の信頼を保つために全力を尽くしてきましたし、役割の中で暗黙のうちに与えられた信頼は、常により効率的で生産的な仕事上の関係につながってきました。ですから、将来のお客様にも同じ敬意を払うことを優先しています。

そのため、サードパーティのパッケージを完全に避けました。その結果、最終的にははるかにクリーンで、完全にネイティブに開発されたアプリになりました。私の知らないところで何かを紛れ込ませる者は誰もいません。とはいえ、次のコードは自前で実装する必要がありました。

  • PACE の多倍長整数演算と楕円曲線(Brainpool 曲線)。

  • チップドライバーと NDEF の処理。

  • 乗車履歴リーダー(FeliCa チップ向け)

  • 日本の公共交通機関の駅名ライブラリ

PACE、パスポートの問題

Hex NFC のユニークな機能の一つが、ePassport(IC 旅券)のデータを読み取れることです。iOS デバイスの、とりわけ興味深く、あまり活用されていない機能です。その存在を初めて知ったのは、1 年前に政府運営の ID アプリで認証したときでした。身分証をかざすだけで本人確認ができるという可能性に、すっかり魅了されたと言ってよいでしょう。可能だと知ったからには、どうしても手に入れなければなりませんでした。

唯一の懸念は、政府機関のアプリに限定されているかもしれないことでした。心配は無用でした。ePassport のチップは資料が充実していて、驚くほど扱いやすいことが分かったのです……Apple が PACE 系の暗号アルゴリズムをネイティブにサポートしていれば、そうだったはずでした。そんな幸運はなく、「サードパーティパッケージなし」という制約のもとでは、Brainpool の実装を自前で開発するしかありませんでした。きわめて時間のかかる作業でしたが、100% その価値はありました。出来上がったパスポート読み取り機能は実に興味深く、オーストラリアのパスポートと、都合のよいことにネパールのパスポートの両方で試す機会に恵まれました。ぜひご自身で試してみてほしい機能です。パスポートのチップのアクセス可能な領域にどんな情報が保存されているか、きっと驚かれるでしょう(アメリカ人の場合は別で、ほとんど何も入っていません)。

日本の公共交通機関の駅名

もう一つ大きかったのが、日本の交通系カードです。可能だと分かってはいたものの、NFC リーダーで見たことは一度もなかった機能です。これらのカードは実に興味深いものです。あらゆる種類の情報を保持できます。カードの残高を管理し、公共交通機関にいつどこで乗り降りしたかの履歴を保持し、コンビニや自動販売機でお金を使ったときの記録まで残します。

大きな課題は、駅 ID を実際の駅名に対応付けるという点で、日本政府がさほど協力的ではないことです。もし私が卑劣な人間なら、ライセンスで保護されたネット上の愛好家のコレクションからデータを盗むこともできたでしょう。しかしここではきちんとやるのが流儀なので、独自のデータベースをゼロから作ることにしました。まず自分の PASMO に記録された駅名を突き止め、次に近所で聞いて回って Suica を手に入れました。どちらも、私と隣人がどこを移動したかの情報を提供してくれました。そこからデータベースの作業を始めました。残念ながら、二人とも観光客だったため、集まった分は少なめでした。ここでは「ネットワークリクエストなし」のルールに妥協し、駅名の情報を提供したい方のために「自分で送信する」機能を組み込みました。時間をかけて、(それ自体は正当なことですが)他者による利用をライセンスで制限している愛好家たちと張り合えるような、正当なオープンソースの対応表を築いていけることを願っています。

チップの種類と対応状況

Hex NFC は、Apple が読み取りを許可しているすべてのチップに対応しようと大きな努力を払っています。すべての種類のチップを実物のシリコンで手に入れることはできませんでしたが、足りないチップのアーキテクチャをデータシートや類似モデルから外挿できる程度のカバー範囲は確保しました。たとえば、NTAG215 は結局入手できませんでしたが、NTAG213 や NTAG216 と十分に似たアーキテクチャなので、完全にカバーできるはずのエミュレーターを構築できました。

シリコン上で完全にテストしたチップは次のとおりです。

  • NTAG 210µ
  • NTAG213
  • NTAG216
  • NTAG424 DNA
  • Ultralight EV1 128b
  • Ultralight C
  • ICODE SLIX
  • ICODE SLIX2
  • DESFire EV3
  • FeliCa(Suica と PASMO)

MIFARE Classic も動作することは分かっていますが、Apple が読み取らせてくれないだけです。

ご想像のとおり、読み取り、書き込み、暗号化、恒久的なロック、パスワード試行回数の制限、データブロックの消去/ダンプなど、膨大な量のベンチテストが必要でした。データシートが見落としていて、エミュレーターの更新が必要になった細かな点がどれほど多かったか、驚かれるでしょう。今の時点では、Hex NFC のエミュレーターは、実物のシリコンの対応付けとしてネット上で最良のものだと、かなり確信しています。

NDEF レコードの対応

これらそれぞれに加えて、思いつく限りのあらゆる有用な種類のレコードを組み込みました。次のようなものです。

テキスト、URL リンク、Android/iOS のアプリリンク、Wi-Fi 認証情報、連絡先、メール、電話、SMS、FaceTime、地図、Bluetooth ハンドオーバー、暗号資産アドレス、ショートカット、テンプレート化されたデータと生のバイト列、さらに 22 のプラットフォームにわたるソーシャルプロフィールと、7 つの検索エンジンでの検索。

さらなる対応についての提案やご要望があれば、[email protected] までお寄せください。

出来上がった傑作

最終的に出来上がったのは、iOS で最も高機能で、最もよく設計された NFC アプリだと確信しています。タグの一括書き込み、優れた情報とデータの表示、データのテンプレート/プリセットの保存、そしてパワーユーザー向けの高度なコマンドコンソールなど、プロ仕様のツールを備えています。堅牢で、タップの失敗にもうまく対処し、工場出荷状態のチップのフォーマットや、場合によっては壊れたチップの修復にも使えます。

透明性と、なぜ無料なのか

では、そんなに良いものなら、なぜ売らないのか。何百時間もかけて取り組んだもので、過去には時給 100 豪ドル前後で仕事を請けてきました。それを計算に入れれば、理論上は 3 万豪ドル以上を投じたことになります。費用を回収すべきではないのでしょうか。しかも、BSL 1.1(Business Source License)のもとで提供されていることにお気づきかもしれません。これはソース公開のライセンスで、数年後には自動的にオープンソースに移行します。

私にはもっと大きな計画があります。Hex Pro は今スタートアップで、確立した評判もユーザー基盤もありません。私の望みは、Hex NFC が大きく広まって人気のツールになり、最大手の NFC アプリに本気で張り合える存在になることです。自分のアプリに第三者の広告を貼ることは決してしません。主義として、やらないのです。しかし他のプロジェクトをリリースしたときには、ホーム画面の下部に相互プロモーションのバナーを置きたいと考えています。押し付けがましくはなく、ただ Hex NFC の品質を評価し、他の高品質なアプリにも関心のある人々の目に、私の他の仕事を届けるのに十分な程度のものです。

ですから私の主な目的は、世界に切実に必要とされていたソフトウェアを提供することに加えて、Hex Pro の評判を築き、お金を稼げるアプリへと相互にプロモーションすることです。


ユーザーの皆さんがこの取り組みを支えてくださることを願っていますし、Hex NFC を楽しんで使っている人々を見るのを楽しみにしています。

ご検討のほど、Hex NFC をご紹介します。