Amiiboの中には何か特別なものが入っている、と多くの人は思っています。どこにも売っていない、Nintendo独自のシリコンチップのようなものが。でも、そんなものはありません。フィギュアの台座に封じ込められているのはNTAG215 - 私が毎日読み書きしている、あの空のステッカー型チップです。10枚入りが数百円で買える、あれです。メモリは約540バイト、工場で焼き込まれたシリアル番号が一つ。フィギュアの中身はそれだけです。高いのはプラスチックの方。チップはほとんどおまけのようなものです。
だからこそ、ずっと引っかかっていました。私はNFCタグの読み書きを仕事にしているのに、まるごと一つのカテゴリー - 机の横の棚に並ぶ数体のフィギュア - を、自分のアプリが素通りしていたのです。NFC.coolを、スマホに入れられる中で最も高機能なNFCアプリにしたい。どんな種類のタグも取りこぼさないアプリに。
そこで腰を据えて、片側にフィギュア、もう片側にSwitchを置き、NFC.coolにきちんとしたAmiibo対応を組み込みました。その結果どうなったか、そして道中で学んだことを紹介します。まずは、これほど安いチップが、なぜ驚くほどコピーしにくいのかから。
では、魔法はどこに?
チップがこれほど平凡なら、魔法はシリコンの中にはありません。魔法はバイトの中にあります。Amiiboの正体は、Nintendoが独自の暗号で書き込み、最後に署名を添えた安価なノートのようなものです。署名があるおかげで、偽物と本物を見分けられるわけです。(チップそのものはただのNTAG215です。タグの種類をもっと詳しく知りたい方はこちらへ。)
そのバイトの中には、2つのものが収まっています。1つは公開されています。このフィギュアが誰なのか - ゼルダの伝説シリーズのリンクで、特定のAmiiboラインナップに属する、といったことを示す小さなブロックです。Switchがフィギュアの接触を認識するために読むのが、この部分です。もう1つはロックされています。ニックネーム、持ち主のMii、フィギュアを使った回数、そして現在のゲームが使ってよい小さなメモ欄に書き込んだ内容といった、実際のセーブデータです。この部分は暗号化され、署名されています。
なぜAmiiboは単純にはコピーできないのか
暗号化されたセーブデータは、一度調べれば永遠に使い回せる固定の鍵で守られているわけではありません。タグごとに専用の鍵があり、その鍵は、マスターキーのセットと、固有のシリアル番号を含むそのタグから読み出したデータとを混ぜ合わせて、その場で生成されます。さらにその全体がHMACで署名されています。署名し直さずに1バイトでも書き換えれば、本体は偽造を見抜いてフィギュアを受け付けません。
ここに落とし穴があります。シリアル番号は鍵の生成にも署名にも組み込まれているため、本物のAmiiboをダンプして、そのまま空のタグにバイト単位でコピーすることはできません。空のタグはシリアル番号が違うので、生成される鍵はすべて別物になり、署名も合わなくなって、本体に拒否されます。「全ページをそのままコピーすればいい」という一見わかりやすい方法は、毎回失敗します。
きちんとクローンするには、書き込み先のタグに合わせて鍵を生成し直し、ダンプ元ではなく、まさに手元のそのプラスチックとシリコンで有効になるようにデータを署名し直す必要があります。誰もが土台にする参照実装が、amiitoolというツールです。私はその一連の処理 - タグ形式から内部形式への変換とその逆、鍵の生成、暗号化、署名 - を、アプリの中にネイティブで組み直しました。だからNFC.coolは、パソコンを一切介さずに、手の中のスマホだけでこれをこなせます。
NFC.coolで今できること
3つあります。おそらく使う順に紹介します。
読み取り。普通のNFCタグを読むのと同じように、Amiiboをスマホの背面に近づけると、NFC.coolがその場で識別します。キャラクター、ゲームシリーズ、Amiiboシリーズ、フィギュアの種類、アートワーク、それに書き込み回数といったタグ自身が持つ情報もいくつか表示します。ここに鍵は不要です。フィギュアの識別は、もともと公開されている部分に触れるだけだからです。
**コレクション。**スキャンしたAmiiboはすべて「マイコレクション」に保存されます。手持ちのフィギュアを一覧できるシンプルなグリッドです。データは端末内に保存され - iPhoneではiCloud経由で他のApple製デバイスと同期します - アートワークもキャッシュされるので、オフラインでもコレクションはちゃんと表示されます。これだけで、あの寂しい小さな棚が、実際に眺めて楽しめるものに変わりました。
**クローン。**自分の鍵をインポートしておけば、鍵を作り直したフィギュアのコピーを、空のNTAG215に書き込めます。スキャンしたばかりのフィギュアから直接クローンすることも、端末に保存した.binダンプからクローンすることもできます。アプリは、手にしている空のタグに合わせて鍵を生成し直し、そのタグ用にデータを署名します。だからコピーは、失敗が約束されたバイト単位の偽造ではなく、それ自体として有効になります。書き込みは元に戻せません - タグは一度ロックすれば、ロックされたままです - アプリは実行前にそれをはっきり伝えます。
あえて入れていないもの
NFC.coolはAmiiboの鍵を同梱していませんし、今後も同梱しません。アプリの中に隠された鍵はなく、Amiiboのデータライブラリも埋め込まれていません。
読み取りとコレクションは、タグの公開部分にしか触れないので、そのまますぐに使えます。クローンは別です。マスターキーが必要で、それはNintendoのものであって、私のものではありません。もしご自身で入手しているなら - 結合済みのkey.bin、または2つの個別ファイルを - 一度アプリにインポートすれば、クローン機能が有効になります。入手していなければ、機能はオフのままです。機械は私が作りました。燃料はあなたが持ち込むものです。
ちゃんと動きます
思い込みのまま世に出したくなかったので、意味のある唯一の方法で試しました。
自分のフィギュアの1体をスキャンし、空のNTAG215にクローンして、そのコピーをSwitchに持っていきました。ゼルダの伝説 ティアーズ オブ ザ キングダムを起動し、右のJoy-Conにクローンをかざすと、ゲーム内アイテムがいくつかインベントリに入りました。本物と同じです。文句も、「このAmiiboは読み取れません」もなし。その瞬間、すべてが本物だと実感しました。あれだけの鍵生成の計算とバイト配置の末に、得られたのは、Nintendoの本体が本物のフィギュアとして喜んで扱う、安っぽい空のステッカーなのです。
机の横のあの棚は、もう単なる飾りではありません。一つの機能です。
試してみたい方は、AmiiboツールがNFC.coolのiPhone版とAndroid版に入っています。私がこれまで作ってきたタグの読み書き機能のすぐ隣にあります。自分の鍵を持ち込み、フィギュアにかざして、あなたのアプリがずっと静かに見過ごしてきたものを確かめてみてください。