2014/09/11

[nfc]FeliCa Lite-S実装への悩み

Androidで、FeliCa Lite-S向けのライブラリ実装をしている。
いろいろ、悩み有り・・・。

まず1つだが、なんでTagTechnology#close()がIOExceptionするのか。

Also causes all blocked I/O operations on other thread to be canceled and return with IOException

ってのはわかるんだけど、じゃあどこでclose()したらよいの?となる。
設計として、複数スレッドで同時にNFCを読み書きするようなことはしない方がよい(したらいかん)ってことなんだろうけど、じゃあ無視してアプリが死んでしまえばいい!
と思ったら、これはChecked exceptionなので、throwsして上に投げるか自分で処理するしかない。
じゃあRuntimeExceptionに変換してやればいいんだけど、なんかそれは変だと思った。

この辺の考え方は、Linuxのclose()の戻り値がvoidなのとあわせてくれるとうれしかったな。
そしたら、finallyに入れればよかったんだけど。。。
実は、まだ普通に書く方法あり?

try {
  nfcf.connect();
  nfcf.xxx();
}
catch(IOException e){
}
try {
  nfcf.close();
}
catch(IOException e){
}


上記のはまだどうでもよくて、内容として困ってるのがカードごとの対応。
FeliCa Liteとか、FeliCa Lite-Sとか、MIFARE Ultralight Cとか、MIFARE Classicとか。

何を困ってるかというと、認証関係だ。
FeliCa Lite-Sでは、以下が可能だ。

  • MAC付き書込が必要なブロック
  • 認証付き書込が必要なブロック
  • 認証付き読込が必要なブロック

特に3番目。
これは、Read without Encryptionでエラーが発生することを意味するッ!
具体例がないとわかりづらいので、実際にセキュリティを施してみた。
わかってると思うけど、セキュリティ関係は不可逆なのよ~。

  • MAC付き書込が必要なブロック:11~13
  • 認証付き書込が必要なブロック:10~12
  • 認証付き読込が必要なブロック:9~11
  • image

    1ブロックずつずらしたが、読込に認証が必要なのは9~11ブロックなので、そこがまるまる読めなくなっているのがわかる。

    NFC-FやType 3 Tagの範囲内で読込のセキュリティすらかけられる、というのがFeliCa Lite-Sの魅力なのだ。
    同じことは、MIFARE Classicにも言えるが、ちょっとそのしくみは難しいと思う(だからセキュリティか。。)。

    なので、セキュリティをかけたカードは、結構エラーを返してくる。
    IOExceptionだ。
    以前の方針にあわせて、どうしようもないところ以外は吸収して戻り値で返すようにしてたんだけど、使っている側からすると「失敗」の理由がわからない。

    Exceptionの理由を文字列で返すと、ライブラリとしては気持ちが楽なんだけど、アプリとしては「えっ、今そんな告白されても」みたいな気持ちになるだろう。
    やっぱり、エラー番号をそのまま返すか、getLastError()方式にするしかないのか。
    今までの私は、後者をよく使っている(後付けが楽だから)。


    以前調べて、ブログとかにも書いてはいるのだが、MIFARE ClassicはNFC Forumの範疇から外れたアクセス方法になるため、Android端末にNXPのチップが搭載されているときしか使えない(のだと思う)。実際、Nexus7(2012)はPN65だから使えるけど、Nexus7(2013)はBroadcom(型番わからん)だから使えない。

    って書いて、「そういえばClassicってAndroid標準にあるやん!」と気がついた。
    セキュリティ有りのカードについては、これを目安にするとよいのかな。


    ともあれ、FeliCa Lite/Lite-S、MIFARE Classicのセキュリティ機能は「普通に」NFCアクセスするときに使うものではない。
    一度その設定をすると、カードはだいたい元に戻せないので、そのセキュリティを施したまま生きていくことになる(Classicは戻せるのかな)。

    MIFARE Classicが魅力的なのは、容量が大きいのにセキュリティ機能が標準で存在しているところだろう。
    おそらく日本国内でも、セキュリティ付きのカードとしてかなり数多く提供されてるんじゃなかろうか。
    NFC-Aではあるので、MifareClassicクラスを使わなければ読めるのかも。

    のんびりではあるが、来週中には「FeliCa Lite-Sはこんな感じですよー」のアプリを作りたいものだ。

    0 件のコメント:

    コメントを投稿

    コメントありがとうございます。
    スパムかもしれない、と私が思ったら、
    申し訳ないですが勝手に削除することもあります。