2012年12月23日

Wi-FiもOOBがある

Wi-Fi Static Handoverの続きだ。

NFC Forumには、今のところBluetoothの例しかない。
しかし、これをまねすればWi-Fiでもやれるんじゃなかろうか、というのが前回の結論だったと思う。
Wi-FiのOut-of-Band設定はWPSを使う、という考え方になるだろう。

 

WPSの設定方式?には、PIN方式とCredential方式があるようだ。
PIN方式は、E(Enrollee?)とR(Registrar?)があるようだ。
「ようだ」ばっかりだが、いい資料を見つけられていないので仕方ない。

今回参考にしたのは、Androidのソースに入っていたwpa_supplicant8だ。
いつの間にか8になったのね・・・。


wpa_supplicant8のソースを見ると、NDEFが出てくる。
実装としては、デバイスとしてUSBやNFCを選択できるようになっているみたいだ。
ただ、Androidでそれが有効になっているかどうかはわからない。

めんどうだったが、このソースからOOBデータ(と呼ぶのか?)を割り出した。
実際に動かしたわけではないので、間違ってたらすまない。

見た感じでは、NFC ForumのBluetooth Handover例とは異なり、HsレコードがなくてCarrier Configuration Recordが1つだけのNDEFメッセージになっているみたいだ。
これをまねすべきかどうかは、何とも言えんな。
wpa_supplicant8がNFC対応しているといっても、どうやらPN531みたいだし、NfcServiceがわざわざやってくれそうな気がしないので、Bluetoothのまねをした方がいいだろうな。

2012年12月22日

[nfc]MIFARE ClassicのAccess Conditions資料

この年末に何をやってるんだか・・・。
ご飯も食べず(酒を飲みながら)、MIFARE ClassicのAccess Conditions資料を作った。


これを読んでから、hiro99ma siteのAccessCondition設定ファイルを読むと、理解しやすくなるんじゃなかろうか。
鍵Aとか鍵Bのアクセスとか、実際にやってみた結果なんかも載せるといいのだろうが、年末だから許しておくれ。
作りながら「私は何をやってるんだろう・・・」と自問せざるを得ず、実証実験までは至らなかったのだ。

セキュリティを保ちつつ安価に実現したい場合、まだFeliCa LiteよりもMIFARE Classic 1Kの方が安い。
単価もそうだし、メモリサイズも大きい。
NFC Forum準拠ではないけれども、それなりに魅力が大きいのだ。
準拠ではない、といっても、おそらくNFC-Aの部分は準拠していると思う。
していないのは、Tagの部分、メモリ構造の部分だ。
48byteごとにメモリが分断されるのは、ちょっと説明しづらかったのかな。

NFC Forum準拠というのは魅力的ではあるが、NFC Forumがすべてというわけではない。
ビジネスとして最適なところを選ぶのが技術者としての役目だろう。
MIFARE Classicもまだ現役といってよいだろうと思うので、それに取って代わるコスト面と機能面を併せ持つNFCカードが現れないとな。

MIFARE Ultralight Cのセキュリティ機能は一般には公開されていないようだ

FeliCa Liteの片側認証は、調べた。
MIFARE ClassicのAccess Conditionも、調べた。

ならばMIFARE Ultralight Cも調べないといかんよな、と資料を探したが、これはだめだった。
MIFAREのページには鍵アイコンがついていて、認証を求められるようだったのだ。

 

そうか、そうなんだ・・・。
もしかすると、NFC Forumみたいにちょっと登録すればいいのかもしれないが、認証請求のファイルが「GlobalNDA」というファイル名だったので、そうじゃないだろう。
残念だが、しばらく置いておくとしよう。

[nfc]Type 3 Tagのコマンド

なんとなく、Type 3 Tagのコマンド資料(Excelファイル)を作った。
動作確認はしてないので、間違っていたら教えてくだされ。

どこで使うかというと・・・AndroidでNFC-Fにアクセスしたいときかな。
FeliCa Standardもアクセスできるとは思うが、作った資料はそこまで考えていない。
2バイトブロックリストの例しか書いていないので、3バイトブロックリストじゃないとアクセスできないんだったらダメですな。

 

普段は、NFCリーダライタのRC-S620/Sしか使わないので、PollingするときはInListPassiveTargetコマンドを使っている。
このコマンドだと通信速度を212k/424kbpsが指定できるからいいんだけど、Androidとかはどうやってるんだろうね。

2012年12月16日

[nfc]BluetoothのStatic Handover

Static Handoverに正解はないんだろう、と思っていたら、NFC ForumのBTSSP(pdf)に例が載っていた。
BluetoothだからNegotiated Handoverしかないんだろうと思い込んでいて、読もうとしていなかった。
気付いてよかった。。


4.2章にタグのデータが載っている。
これを参考に、昨日メモした内容の答え合わせをすればいいだろう。

 

まず、Carrier Data Ref.がポインタとして指すのは、NDEFのIDでよさそうだ。
1文字推奨らしく、ここでは「0」という文字を使っている。

Aux Data Ref.は、なさそうだ。
つまり、Carrier Data Ref.で指しているNDEFレコード(Carrier Configuration Record)に全部のデータが載るようだ。
まあ、これはBluetoothの例なのでそれに従わなくてもいいかもしれないが、そうした方がタグのメモリ節約にはなるな。

 

BluetoothのCarrier Configuration Recordは、MIME「application/vnd.bluetooth.ep.oob」を指定している。
ってことは、TNFは0x02(Media-type RFC2046)になるのかな。

ペイロードには、OOBデータを載せる。
OOBというのは・・・Out-of-Bandの略らしい。
バンドの外?

どうも、ペアリング方式の1つであるSSP(Secure Simple Pairing)の方式の1つ、らしい。
日本語が既によくわからんな。。。
ペアリングについての説明というか、Bluetoothの背景についてはこちらが読んでわかりやすかった。
つまり、Bluetooth以外の方法でペアリングをするから、Out-of-Band、ということなのだな。
そして「ペアリング方式はPIN方式かSSP方式」で「SSP方式の中に4手段ある中の1つがOOB」ということのようだ。


BluetoothがOOBなら、Wi-Fiにも同じようなものがあるんじゃなかろうか。
そう思って検索すると、「vnd.wfa.wsc」というMIMEが出てきた。

見方がわからないと、検索できない(しても見過ごす)ことって、あるよな。

2012年12月15日

[android]WiFiの設定(WEP)

うちには、無線LANがある。
Nexus7やノートPCで使っているのだが、一度接続をしてしまうと、しばらくやることはない。
そうすると、忘れてしまうのだな。

せっかくNFCをやっているのだから、使っていないNFCシールに設定データを書いて、無線LANの親機に貼って、Static Handoverできるようにしておこう、と思った。
タグの有効利用だ。

 

・・・という名目で、NFC ForumのHandover資料を読もう。
何か目的がないと、資料を読むのってつまらんのよねぇ。


が、その前に、Nexus7というか、AndroidでWiFiの設定をする、ということがアプリからできるのだろうか?
NFCのON/OFFすら制御できないんだから、なんか厳しそうな気がする。。。

 

しかし、できた。
stack overflowに説明を書いてくれている人がいて、これの通りにやると動いた。
いやあ、いい人だ。

 

ひとまず、今回はWEPでの接続を試した。
https://github.com/hirokuma/StaticHandoverTest
名前は「StaticHandover」だが、まだNFCのことは何もやっていない。

手を抜くなら、NFC Forumの手順に従わなくても(読んでないけど)、タグにSSIDとキーを書き込んでおけば、あとは読み込んで設定するだけで済む。
NFC Forumの手順があったとしても、きっとNDEFのフォーマットがどうとかこうとかいうくらいしかないと思う。

が、接続設定の情報をセキュリティなしで書き込む、というのはちょっと怖い。
さすがになにがしかの暗号化を掛けたいところだ。
とはいうものの、NFC Forumはセキュリティに関しては言及しない(少なくとも、今のところ)。
ConnectionHandover資料にもセキュリティの項目はあるのだが、決めごとは特にない。

 

まあ、実装してから考えますかね。

2012年12月12日

[android]FelicaLiteクラスを作っていた

FeliCa Liteの1次認証寸前までやるための試作アプリを作っていた。
「作っていた」というのは、さっきまで作っていた、というわけではなく、記憶にないが作っていたようだ、という方だ。

 

https://github.com/hirokuma/NfcTest4/tree/master/src/com/blogpost/hiro99ma/nfc

 

コメントにも「片側認証らしきもの」などと書いているので、いささか怪しい。
他のシステムと試したことがないので、標準アルゴリズムに従っているかどうかははっきりしないが、間違ってないんじゃないの、という感じだけ持っている。

 

ご参考まで。

2012年12月9日

今年最後の福岡NFC勉強会にいってきました

今年最後の福岡NFC勉強会に行ってきた。
道に迷った件は、前回の記事を参考に。
覚えていた地図は正しかったのだが、住所自体が間違っていた(というよりも、調べてなかった)、ということだ。

博多図工室、というところで開催された。
遅れていったので説明は聞き逃しているが、設備が色々あって面白かった。
それぞれの設備が目新しくて面白かったのだが、それ以上に、参加している人達の興味津々ぶりが面白かった。
今回は博多図工室がオープンしたばかりということもあって、参加者も初めて見た人が多かった。
まあ、私が勉強会に顔を出さないというだけかもしれんがね。
そのおかげもあって、いつものLTよりも盛り上がったのはよかった。
(私のところはそうでもなかったが・・・しっかり聞いていたのだと思おう。)
今回のネタは、FeliCa Liteの片側認証。
けっこう長いこと調べているわりには、説明をしていなかったのだ。
有料のものでなくてもここまでできますよ、ということで。


NfcF#transceive()では、先頭にデータ長が必要、という話があった。
あれは、プロトコル仕様からするとああせざるを得ない。
それが嫌なので、Mifare系はクラスがあるのだ。
同じようにFelicaクラスを作ればいいのだが、それは以前書いたようにめんどくさい。
けっこう上の方をimplementsしないといかんからだ。
片側認証のあたりと一緒に作ったような気がするけど、復旧中のPCにソースがあるので、作ったかどうかすらわからん。
Android + PaSoRi RC-S370向けのコードは、ここにあるはず。

Windows8の方が話としては面白かったかもしれないが、あんまりプラットフォームに依存した話は私向きではなさそうだ。
まあ、来年参加できて余裕があれば、そういう資料を作るかな。

2012年12月8日

[win8]NFPで非NDEFカードに書き込むことはできなさそうだ

Windows8 + RC-S380で、カードにデータを書き込もうと思う。

NDEFフォーマットしたいのだが、まずは書き込みのテスト。
PublishBinaryMessage()が一番近そうだ。

参考:http://yukilab3.blog.fc2.com/blog-entry-11.html

 

FeliCa LiteのNDEFカードにやってみると、書き込めていた。
よし、とNDEFじゃないFeliCa Liteにやってみると・・・書き込めていない。

“WindowsUri”だからか?と思って、バイナリを書き込めそうな”Windows”にすると、これは例外が発生した。

ってことは、NFPでは非NDEFカードに書き込むことはできないのか。


となると、NFCカードを買ってきてWindows8で使えるようにしようとすると、

  1. デスクトップ側でNDEF Writerを使って、とにかくNDEF化してしまう。
  2. それ以降は、NFPでアクセス。

ということになるのか。
ストアアプリのみで完結させることはできないのかね。。。

 

パソコン店で「ハードディスク(Windowsフォーマット済み)」みたいなのがあるけど、「NFCカード(NDEFフォーマット済み)」みたいなのが出てくるんだろうかね。

[win8]NDEFは、NFP > PC/SC、のようだ

Windows + RC-S380で、PC/SCを使ってみた。

といっても、PC/SC自体が初めてなので、SDK for NFC Starter Kit2.0に入っていたサンプルソースと、こちらのサイトを参考に勉強している。

EternalWindows – セキュリティ/スマートカード

サンプルソースは、Visual Studio 2012 Express for Desktop(長い・・・)でビルドできた。
が、実行中にAPIエラーが出る。。
RC-S380を見つけることはできるのだが、カード情報を読み取ることができない。

かざしているカードは、手元にあったFeliCa Lite。NDEFだ。
まさか・・・と、NDEFじゃないカードをかざすと読み取ることができた。

SONYさんのNDEF Writerもそうだし、FeliCaランチャーもそうだが、デスクトップ側だったとしてもNDEFについてはNFPが最優先になる、という動作は変わらないようだ。
それをやめるには、NFPを無効にするしかないそうだ。


今わかっている範囲では、Windows8 + RC-S380でのNFC開発はこんな選択になると思っている。

  • NDEF・・・NFPのみ
  • 非NDEF・・・PC/SC、SDK for NFCなど

NDEF以外のカードをNFP APIでアクセスできるかどうかがまだわかっていないが、検出イベントが上がってこないので使えないのではないかと思っている。

NDEFフォーマットさせるアプリを作りたいのであれば、PC/SCなどでやることになるのだろうが、ストアアプリからPC/SCは使えるんだろうか?


やってみたが、だめだ。
何がだめかというと、includeするwinscard.hを全部読んでくれていなくて、必要な構造体定義なんかがされないのだ。
ヘッダファイル(C:\Program Files\Windows Kits\8.0\Include\um\winscard.h)を見ると、

#pragma region Desktop Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

というのが最初に入っていて、最後まで囲まれていた。
MSDNブログに、こんな説明があるので、デスクトップアプリでしか使えないということか。。。

 

NFPで非NDEFカードに読み書きできるか、というところを調べるしかないですな。