2020年6月22日月曜日

NTAG424 DNA で遊ぶ その1

リリースされてちょっと時間経ってるんですが、NTAG424 DNAというすごい高機能なタグがあります。これまで見て見ぬふり扱ってなかったんですが、触ってみるとえれー大変だったので備忘録もかねて書きたいと思います。

まずこのタグで何ができるのかなんですが、一番大きな機能は Secure Dynamic Messageing(SDM) という機能で、暗号化された電文でタグと通信できる機能です。さらにその機能をNDEFで利用することができて、これまではNDEFにURLを書くとそれがそのままスマホで読み取りできたんですがここにSDMが適用されると Secure Unique NFC (SUN) message となり、URLの一部が暗号化された状態になります。

これまでのNTAGにはUIDミラー(※参照 NTAG210のUIDミラーを試してみる)とカウンターミラーという機能があって、NDEFのURLに自身のUIDとカウンター(タップされた回数)を埋め込むことができました。

例)
書き込まれたURL
https://www.hayato.info/tag?uid=00000000000000&ctr=000000
スマホで読み取ったときのURL
https://www.hayato.info/tag?uid=04C767F2066180&ctr=000010

これが、SDMを使うと UID+カウンタ の値が暗号化されたものが埋め込まれるようになります。そうするとその値がそのままサーバに飛んでいきますので、サーバ側で復号するとタップしたタグのUIDとカウンタ値が取得できます。カウンタ値も取得できるというのがミソで、例えば最後に飛んできたカウンタの値と同じかもしくは低い値であればそれはおそらくタップして取得されたURLではなく、ブックマークやあるいはURLを誰かに送付してそれをそのまま使ってアクセスしてきているのだということが推測できるわけです。

NTAG424 DNA の仕様書はこちらで公開されています。

これがまたこれまでのタグにくらべてボリューミーで読んでいくだけで疲れ楽しめます。さらにAN12196の資料にはエンコードする手順のサンプルが詳細に記載されていますが、これがまた手順が多いのと暗号化を使うので検証しながらやってくので時間かかるのとあとチョイチョイ(たまにがっつり)記載に間違いがあるのでそうすると自分の手順が違うのか仕様書が違うのかこれをまた検証しながらとかやってたのでえらい時間かかり長時間楽しめました。

まず NTAG424 はこれまでのようにメモリのある部分に設定を書き込むのではなく、ISOのどこかで規定されている MF/DF/EF というファイル構造を持っています。最下層のEFを3つ持っていて、それぞれ CC/NDEF/Proprietary という領域になっていて、NDEF領域にNDEFを書き込みます。さらに5つのキーを持てるようになっており、このキーを使って暗号化を行います。

また通信モードというのが3種類(Plain/MAC/Full)あって、Plainだと平文で通信、Fullだと完全に暗号化された通信という感じで、書き込む情報の重要度によって使い分けるようになっています。

今回は Plain モードでできる NDEF の基本URL(埋め込みする前のURL)を書き込むところまでをやります。

AN12196の6章に詳細手順がありますが、これの3番と8番に相当します。ちなみに6番に面倒な認証の手順がありますが、Plainモードで書き込みを行うだけならこの手順は不要です。

はじめに Select File で DF を選択します。DF名は D2760000850101h になっていますのでこれを指定します。

CLA 00
INS A4
P1 04(Select by DF name)
P2 0C(No Response Data)
Lc 07
Data D2760000850101
Le 00

あとはNDEFを書き込みます。

CLA 00
INS D6
P1 84
P2 00
Lc DataのLength
Data ここにNDEFのデータ
Le 00

仕様書の 6.8.1 では P1=00 になっていますがこれは誤りで、NDEFの領域を示すための値(EFを示す値)を設定する必要あります(それが無いとまだDFまでしか選択してないのでどこに書いていいかわからない)。NDEFのEFは E104h なんですが、ここに設定する値は Short ISO FileID というやつで最後の5ビット(04)になります。先頭1ビット目を1にすることでFileIDを指定することになりますので、84を設定します。

上記2つの APDU を投げることでNDEFの書き込みまでは完了します。
あとは SDM を利用するように設定することで完成しますが、まぁ、そこがまた長い話になるので次回に回します。たぶん。


0 件のコメント:

コメントを投稿