nfcpy 0.10.0 でハマった話

13
NFC 続続続続 nfcpy 0.10.0 続続続続続続 IoTLT Vol.6 続続 続続 2015/08/19

Upload: masaki-yamamoto

Post on 20-Jan-2017

1.980 views

Category:

Engineering


3 download

TRANSCRIPT

Page 1: nfcpy 0.10.0 でハマった話

続・ NFC おじさん

nfcpy 0.10.0 でハマった話

IoTLT Vol.6

山本 允葵

2015/08/19

Page 2: nfcpy 0.10.0 でハマった話

自己紹介

• 山本 允葵 (Masaki Yamamoto)

• つまみ食いエンジニア

• デバイス好きのおっさん

• 気が付けばソニーまみれ• VAIO を Windows10 にしたいけど

失敗した! ( 瀕死 )

• Jsboard Shibuya やろうTwitter @m2wasabiGitHub https://github.com/m2wasabi

Page 3: nfcpy 0.10.0 でハマった話

前回のあらすじ簡易認証ツールを作ったよ!デバイス: Felica リーダー S380 RaspberryPi ( カメラ付 )ソース: python +nfcpy Node.js +Milkcocoa

Page 4: nfcpy 0.10.0 でハマった話

INTERMISSION前回 (IoTLT5) の懇親会にて

い○らしさん曰く、オム○ンの体温計とか    NFC でデータやりとりしてるらしい

WellnessLink

よーし hack してやるぜー!

Page 5: nfcpy 0.10.0 でハマった話

INTERMISSION

失敗しました…・ ServiceCode や通信内容が非公開・情報があまりにも少ない・ Android アプリのリバースエンジニアリング   ⇒できるけど法的にアウト

足りないもの:情報公開 or Hack のお許し or 時間

助けて中の人ー

Page 6: nfcpy 0.10.0 でハマった話

今回の内容

nfcpy のマイナーバージョンが変わりました https://launchpad.net/nfcpy

Suica の履歴を取得する辺りがゴッソリ変更されたので今までのコードが動かない場合があります。

そこで、 0.10.0 での変更点と対応方法についてご紹介します。

Page 7: nfcpy 0.10.0 でハマった話

Nfcpy 0.10.0 での変更点・よく知られている NFC タグの判別、メソッドの刷新 ⇒ Suica を読んだ場合、 tag オブジェクトが nfc.tag.tt3.Type3Tag から nfc.tag.tt3_sony.FelicaStandard に変わっている 移行のためのドキュメントなどがない

・ NFC タグのパスワード認証に対応 ・ Type4B のタグに対応 ⇒運転免許証など 参考: Launchpad

https://launchpad.net/nfcpy/+announcement/13551

参考: hiro99ma sitehttps://sites.google.com/site/hiro99ma/nfc

Page 8: nfcpy 0.10.0 でハマった話

Nfcpy 0.10.0 での変更点 ( 詳細 )旧メソッド

例: nfc.tag.tt3.Type3Tag

__init____str__pollreadwrite

新メソッド__init____str___format_is_presentauthenticatedumpdump_serviceformatpollingprotectread_from_ndef_serviceread_without_encryptionsend_cmd_recv_rspwrite_to_ndef_servicewrite_without_encryption

nfc.tag.tt3_sony.FelicaStandard 追加request_responserequest_servicerequest_system_codesearch_service_code

参考:http://nfcpy.readthedocs.org/en/latest/modules/tag.html

Page 9: nfcpy 0.10.0 でハマった話

Nfcpy 0.10.0 での変更点 ( 詳細 )str nfc.tag.tt3.Type3Tag.read(int[] blockList, int serviceCode)以前のデータ取得メソッド

bytearray nfc.tag.tt3.Type3Tag.read_without_encryption( nfc.tag.tt3.ServiceCode[] blockList , nfc.tag.tt3.BlockCode[] serviceCode )

新しいデータ取得メソッドnfc.tag.tt3.ServiceCode( number, attribute ) number : 16bit の serviceCode の上位 10bit で、 service type attribute : 16bit の serviceCode の下位 6bit で、アクセス権限

nfc.tag.tt3.BlockCode( number, access=0, service=0 ) number : データブロックの番号 (suica なら 0 ~ 19) access : 3bit の access mode service : 4bit ServiceCode リストの index

nfcpy/nfc/tag/tt3.py70 行~ に定義

Page 10: nfcpy 0.10.0 でハマった話

対応方法 ( アップしたくない人用 )

bzr branch lp:nfcpy/0.9

・インストール時に旧バージョンを指定する

以上!

Page 11: nfcpy 0.10.0 でハマった話

対応方法 (0.10.0 に移行する場合 )Before

After

data = tag.read ([i],service_code) # data は str 型 print "" . join(['%02x ' % ord(s) for s in data])

sc = nfc.tag.tt3.ServiceCode(service_code >> 6 ,service_code & 0x3f) bc = nfc.tag.tt3.BlockCode(i,service=0) data = tag.read_without_encryption([sc],[bc]) # data は bytearray 型 print "" . join(['%02x ' % s for s in data])

ポイント:・従来のサービスコードから、上位 10bit, 下位 6bit で分離して ServiceCode を生成する・読出し用のメソッドは read_without_encryption・結果は bytearray 型で返る

Page 12: nfcpy 0.10.0 でハマった話

対応方法 (0.10.0 に移行する場合 )

Before Afterimport nfc service code = 0x090fnum_blocks = 20 def connected(tag): if isinstance(tag, nfc.tag.tt3.Type3Tag): try: for i in range(num_blocks): sc = nfc.tag.tt3.ServiceCode(service_code >> 6 ,service_code & 0x1f) bc = nfc.tag.tt3.BlockCode(i,service=0) data = tag.read_without_encryption([sc],[bc]) # data は bytearray 型 print "" . join(['%02x ' % s for s in data]) except Exception as e: print "error: %s" % e else: print "error: tag isn't Type3Tag" # 接続開始clf = nfc.ContactlessFrontend('usb')clf.connect(rdwr={'on-connect': connected})

import nfc service code = 0x090fnum_blocks = 20 def connected(tag): if isinstance(tag, nfc.tag.tt3.Type3Tag): try: for i in range(num_blocks): data = tag.read ([i],service_code) # data は str 型 print "" . join(['%02x ' % ord(s) for s in data]) except Exception as e: print "error: %s" % e else: print "error: tag isn't Type3Tag" # 接続開始clf = nfc.ContactlessFrontend('usb')clf.connect(rdwr={'on-connect': connected})

Suica のデータを垂れ流すだけのコード

Page 13: nfcpy 0.10.0 でハマった話

まとめ

nfcpy が 0.10.1 にアップしました

⇒ バージョンアップで嵌った・・・⇒ 得られた対策を共有しました!

以上、ご清聴ありがとうございました

0.10.0 用のサンプルコードは GitHub にあります。https://github.com/m2wasabi/nfcpy-suica-sample