2016年2月29日

[nfc]カードを置いた時間を記録するWindowsアプリ

ここのところ、土日も仕事してしまっている。
平日よりは早めに切り上げているし、少し外出くらいはしているが、どのくらい何をしているのかわからなくなってきた。

そういう話をしていると「うちは作業時間を記録しているよ!」という方が。
なるほど、外勤だとやっていたけど、家の中でもそういうのをやらないと、本当に働いてるのかわからないですな。

というわけで、PC/SCのことを調べていたこともあり、Windows向けに超簡易勤怠管理・・・という名の、単にNFCカードを置いた時間をテキストファイルに出力するアプリを作った。

GoogleDrive/公開用/WorkTime.zip

zipファイルだけど、見えるかな?
うちは、RC-S380/Sと、Windows7 64bitおよびWindows10 32bitで動かしてみた。
起動すると、見つけたNFC R/Wが出てくるので「Watch」というボタンを押すと監視開始(開始すると、ボタン名がカードIDになる)。

image

あとは、R/Wの上にNFCカードを置くと、たぶんNFCIDを取ってきて、取れたらその時間をテキストボックスに出している。
ついでに、同じフォルダにファイル出力もしている(追記するだけ)。
カードが一度抜かれると「NoCard」で記録、違うIDになったらまた記録。
監視は2秒周期。

やっているのは、これだけだ。
私はNFCカードに付箋で「メイン作業」「事務作業」「休み」みたいなのを貼って、そのときに置くようにしている。
IDでわかりにくければ、あとで一括置換すればいいのだ。

なので、勤怠管理ではないですな。
単なる時間記録だけど、まあ、このくらいでいいや。

あ、マイナンバーカードみたいなType-Bだと、置くたびにIDが変わるから今ひとつかも。
カードが1枚しかなくて、「置いた」「置いてない」みたいな使い方もできるから、ご自由にどうぞ。

2016年2月27日

[ble][android]BDSのAndroidアプリ (3) - 最終回のような中断

飽きた・・・。

いつかAndroidアプリもやるかも、と思って調べていた分をアップしていたのだが、アプリは専門の人に任せるのがよいと考え始めたのだ。
テストで使う分には、nRF Master Controlアプリで十分すぎる。

次回はPeripheralControlActivityと言ってしまった手前、どういう関数があるかくらいは載せておこう。

image

onRead, onWrite, onNotifyがあるから、この辺をうまいこと変更すればいいのかも。


Androidアプリのコード生成プラグインはNordicとは関係ないから、ATTテーブルだけわかるBLEのPeripheral機器があれば、Androidアプリを作ることができるはず。

まあ、ちょっと、生成されるソースが汚いので、もうちょっとどうにかしてからリリースすればよかったんじゃないのか、とは思う。
自前できれいにしたけど、またすぐリリースされたりして意味が無くなるのだろうなぁ。

2016年2月24日

[ble][android]BDSのAndroidアプリ (2)

前回は、AndroidManifest.xmlを見た。
次は、MainActivity.java。

 

ctagsが抽出してくれたメソッドは、これら。

image

一番下のgetView()は、リストにスキャンして見つかったデバイス名を設定している。
ListViewのことを調べたときにやった気がしなくもない。。が、覚えてない。
このときにはListAdapter<>をextendsしていたが、ここではListAdapterのインスタンスを作ってsetAdapter()している。

ListAdapterってなんじゃ、と思ったら、BaseAdapterをextendsしたクラスだった。
さっき「getView()は」と書いたが、メソッド名一覧のListAdapter~getViewまではListAdapterクラスのメソッドだった。

Bluetooth機器制御に使いそうな名前のBluetoothDeviceクラスのインスタンスは、ListAdapterが持っている。
それに設定をするのは、BLEのスキャン結果コールバックであるScanCallback#onScanResult()のようだ。
結果がBluetoothDeviceのインスタンスで渡されるので、それをそのまま設定しているようだ。

 

私が作るんだったら「ListAdapterは名前と、オブジェクトと紐付けるインデックスみたいなのだけ持っておけばいい」って作ってしまいそうだ。
でも、スキャン結果として渡されるBluetoothDeviceも、ListAdapterで持つBluetoothDeviceも、結局ポインタでしかないので、本体はここにないのだ。
だったら、まあいいか、と思ってしまう。

でも、自分で管理してないメモリがあると、なんかもぞもぞしますな。

 

さて、スキャンした結果がリストにずらずら出てくる。
それを1つタップしたときの動作は、onCreate()に定義してある。
タップした位置のBluetoothDeviceをListAdapterから取得して、デバイス名とアドレスを引数にしてPeripheralControlActivityをstartActivity()する。

 

Androidに慣れている人だったら、さらっと見ておしまいなんだろうね。

[ble][android]BDSのAndroidアプリ (1)

まさかの続きだ。
BDSで自動生成したAndroidアプリがどうなっているか見ていく。
あまり見たいわけでもないのだが、記事にでもしないと見ようとしないので。


前回と同じく、com.blogpost.hiro99ma.bdsclient01を例にする。
ソースファイルは、こうなっている。

image

自動生成したときもMainActivity.javaという名前だったから、Android Studioで生成するときもMainActivityにしておいた方が楽だろう。

AndroidManifest.xmlを見ると、こういう感じ。

  • Activity
    • MainActivity
    • PeripheralControlActivity
  • Service
    • BleAdapterService
  • uses-permission
    • BLUETOOTH
    • BLUETOOTH_ADMIN
  • uses-permission-sdk-m
    • ACCESS_COARSE_LOCATION

“sdk-m”?
検索すると、Android-MのPreview版の時がそうだったらしいが、今はsdk-23だとか。
ビルドはできているし、うちのNexus5/7で動いているから、sdk-mでもいけるのか。
(コマンドラインでビルドするとlintエラーになったので、app/build.gradleで回避。)

 

Advertisingしている一覧を出すのがMainActivityで、Characteristicへの操作画面がPeripheralControlActivityであろう。

 

というところで、今日はおしまい。

2016年2月23日

[nfc]個人番号カード来たる (昔の私)

何が「昔の私」かというと、昔書いたPaSoRiを動かすライブラリを使って個人番号カードをポーリングしたのだ。

https://github.com/hirokuma/libhknfcrw_c

2013年10月だから、2年半といってもよいかな。
ソースを整理していたら、出てきたのだ。
Cygwinで動くから、LinuxでもMacでも動くだろう。

動かしてみると、カードのあるなしだけじゃなくてレスポンスも解析していて驚いた。
やるな、私!

 

AFI : 00
CRC_B(AID) : 0041
Number of application : e0
Bit_Rate_Capability : b3
FSCI : 8
Protocol_Type : 1
FWI : a
ADC : 0
FO  : 1
[ATTRIB_RES]01

 

だいたいhiro99ma blog: [nfc]個人番号カード来たる (1)と同じ情報が取れているようだ。
InListPassiveTargetするとATRが返ってくるということかな。
だから、PC/SCといえども、R/Wにそういう命令を出しているのではなく、命令を解釈してR/Wがわかる言葉に置き換えているんじゃなかろうか。
実は取説に書かれていない「PC/SCモード」みたいなのがある、なんてことはないと思うのだ、たぶん。

2016年2月20日

[ble]Chrome 48のPhysical Web対応はどうなった?

以前、こういう記事を書いた。
hiro99ma blog: [ble]Chrome 48 for Android

Chrome48ではPhysical Webに対応するから、Eddystoneのビーコンを出したら受けとってくれるようになるのかな?と思っていた。

が、48が出た後、そういう記事が出た形跡がない。
私の読み間違えだったのだろうか。。。

 

さっき「chrome eddystone」で検索すると、こういう記事が出てきた。

Chromium Blog: The Physical Web expands to Chrome for Android

2016年2月10日の記事で、version 49になってる。
いまNexus5のChromeを見たが、48.0.2564.95だった。

まだ、待ちのようだ。

2016年2月15日

[ble][android]Bluetooth Developer StudioでAndroidアプリ(Client)を作る

Open Live Writerが更新されてtagが入力しやすくなったので、記念にBLE記事を書いておこう。

 

今まで、Bluetooth Developer Studioの記事をいくつか書いたが、どれもnRF51822でPeripheralになるときの話だった。

しかし、Peripheralだけでは世の中が成り立たず、Centralが相手として存在してこそBLEの世界が成立するのだ。
だから、私もCentral側をBlueZで作ったりしたことがあった。

とはいえ、やはりBLEはスマホとお話しすることが多い。
だから、スマホのアプリを作った方が何かと便利がよい。
私はおしゃれなアプリを作ることもないので、とりあえず読み書きしてくれるだけでよい。

 

となると、Bluetooth Developer StudioでAndroidアプリを作る、というのが自然な流れだ。


Android Client Plugin 1.0 (2016/02/15)

これをダウンロードして、解凍して、Bluetooth Developer Studioのpluginsフォルダに放り込む。
うちのWindows7 64bitだと「C:\Program Files (x86)\Bluetooth SIG\Bluetooth Developer Studio\Plugins」だった。

名前の通り、これはClient側のプラグインだ。
今まで作ったのが、nRF51822がServerになるものだったのでちょうどよいのだが、AndroidをServerにする場合には、今回の記事は役に立たないだろう。
すまぬ。

 

注意点は1つ。
NAMESPACEだ。
nRF51822のときには使っていなかったけど、Androidアプリの場合にはこれがアプリのnamespaceと一致するようになっていた。
例えば、BDS側で「com.blogpost.hiro99ma.bdsclient01」という設定にしておくと、Android側でも「com.blogpost.hiro99ma.bdsclient01.MainActivity」のような配置になる。

あとからBDSのNAMESPACEを変更する方法がわからなかったので、私は直接BDSのプロジェクトファイルをテキストエディタで開いて、<namespace>のところだけ書き換えた。
とりあえず、そういうのでもよさそうだ。

そして、BDSで「TOOLS > GENERATE CODE」を選ぶ。
ダイアログが出るが、このときは「Server」になっているので、コンボボックスで「Client」を選ぶ。

image

そうすると、こんな感じでAndroid Client Pluginが出てくるので、選択して生成。


次は、Androidアプリの生成をする。

ここで必要なのは、プロジェクト設定ファイルだけのようだ。
なので、Android Studio(私はv1.5.1を使っている)を起動し、「Start a new Android Studio project」で新規生成し、Company Domainを「bdsclient01.hiro99ma.blogpost.com」として、あとはデフォルトで進めた。

  • Phone and Tablet : API23 : Android 6.0 (Marshmallow)
  • Blank Activity

なお、うちのAndroidはNexus5だ。

 

これで生成すると、画面などが開くが、Projectを閉じる。
開いておいてもいいのかもしれないけど、よくわからんので閉じた。

そして、BDSで生成したファイルに戻る。
この中に「copy_to_android_studio.bat」というファイルがある。
これをコマンドプロンプトで実行すればよいのだが、引数が必要。
その引数は、Android Studioで生成したプロジェクトのルートフォルダだ。
バッチファイルの中を見ると、コメントがあるから何となくわかると思う。

そして実行すると、ファイルがAndroid Studioのプロジェクトにコピーされる。
これで終わり。
あとは、またAndroid Studioに戻って、先ほどのプロジェクトを開く。
そうすると、layoutがどうのと警告が出るが、気にせずMakeしてやると、エラーも出ずにビルドでき、スマホに転送すると動いた。

image

 

「SCAN」を押すと、スキャンする。
対象のものだけ出てくるかは不明だが、そこまでフィルタリングはしないのではないか。

image

 

見つかったデバイス名をタップすると、こういう画面になった。
うむ、これは確かにBDSで作った内容だ。

image

 

CONNECTすれば、読み書きはこれでできそうだ。

まだ、CONNECTからDISCONNECTに戻す方法はわかってないのだけど、ベースがないよりもあった方がよいのだ。
おしゃれじゃない私は、これにボタンとかべたべた貼り付けて、動けばよかろうなのだ。

2016年2月11日

[nfc]個人番号カード来たる (5) 最終回

まだ、メールのデジタル署名用に使えないか調べている。

お、何かあるではないか!

image

えい!

image

・・・
世の中、そんなもんだ。

名前の通り「公的個人認証サービス」だから、公的なもの以外では使えないと考えた方がよいのか。
よいのだろうな。

メールって、なんか不安ではないか。
読まれてないんじゃないかとか、出し間違えたんじゃないかとか。
かといって、いきなりSkypeとかSlackとかでやるのも、まだそんな仲じゃないし・・・みたいな間柄ってあると思う。
知り合い以上、顧客未満、みたいな状態だ。

いかんいかん、話が逸れた。
とりあえず、個人番号カードをメールの電子署名に使うのはあきらめよう。


となると、あとは個人番号カードの使い道がない。
e-Taxで今年は確定申告するつもりだから、封筒を郵送する120円が毎年お得になるくらいか。
5年間有効だから、600円くらい得するのかな?
200円で更新だから、それ以後は400円お得になるくらいだ。

 

それで納得いくだろうか?
いや、もうちょっと使いたいというのが人の性だろう。

とりあえず私としては数少ないType-Bなので、基本的な使い方の勉強くらいはできるだろう。
あ、セキュリティを破ったりとか、そういうのは好みじゃないので、何ができるか調べるだけですわ。
まあ、本業の方が忙しいから、そんな暇ないかもしれんけど。

[nfc]個人番号カード来たる (4)

三菱東京UFJ銀行(名前が長い・・・)のメールは、デジタル署名されている。
Thunderbirdだと、ヘッダに封がされた手紙アイコンが出てくる。

image

これをクリックすると、

image

「署名証明書を表示」を押すと、

image

などなど、いろいろ情報が出てくる。
これだと、VeriSignだかSymantecだかが認証局になるのだろうか?

昨日の話からすると、この「署名証明書」は、公開鍵の証明書みたいなものなのだろう。
電子メールだから、ちょっとやり方は違うのかもしれないが、個人番号カードを使って自分のメールに署名できないものだろうか?
そういう方向も今後は調べてみよう。


メールをテキストエディタで見ると、こういうパーティションがあった。

Content-Description: S/MIME Cryptographic Signature

添付ファイル扱いになっていないから、これが証明書の部分なのだろう。
S/MIMEがキーワードか。

S/MIMEとは | SSL・電子証明書ならGMOグローバルサイン
これの「S/MIMEによる電子署名の流れ」の④にある「Aさんが送り主と確認」というのが証明書の役割なのだろう。

でも・・・国の証明書がそういうのに使えるようなしくみを持っていなさそうな気がしてきた。
あるなら、住基カードのときに誰かがやってそうだし。


ちょっと気になって、オフライン状態でさっきのメールの署名証明書を確認したが、特にエラーは出なかった。
つまり、認証局のサーバに問い合わせているわけではないのだ。

Thunderbirdのオプションに「証明書を表示」があるので見てみると、「個人証明書」のタブに東京三菱UFJ銀行のメールがあり、表示させると先ほどの証明書と同じものが見えた。
OSとかメーラとかが、安全な証明書についてはあらかじめダウンロードしてためているということか。

信頼できるかどうかを設定できるので「信頼しない」にしてみると、メールのアイコンがこうなった。

image

おお、信頼してない感じがする!
こうなるのねー。

じゃあ、信頼性を元に戻そうとしたら・・・あ、あれ、証明書がいなくなった。。。
削除していたらインポートすればよいのだろうけど、信頼しなくしているからインポートしても蹴られるのよねぇ。

2016年2月10日

[nfc]個人番号カード来たる (3)

「マイナンバーカード」に改名します 総務省、普及狙い:朝日新聞デジタル

そうっすか・・・。
途中で変えるのって、混乱するのよねぇ。
もう「こじばん」とかでいいやん、と思ってしまう。


さて、個人番号カードの使いどころがよくわかっていないが、コンビニで住民票を取れるとか、そういうのがあるようだ。
住民票なんて引っ越しとか役所関係のことじゃない限り取らないのだが、そういうのが取れると言うことはこのカードに何か情報が入っているのだろう。

こういうのを見るのは、総務省のPDFになるんだけど、これがまた数が多くてめんどくさい。
しかも、どれも同じようなページがあって、訳がわからなくなる。

この図は、「公的個人認証サービス利用のための民間事業者向けガイドライン1.1版」から持ってきた。

image image

前の記事で取得したのは、JPKI AP(公的個人認証AP)だ。
ここには、電子証明書が入っているとのこと。

電子証明書というとHTTPSとかを思い出すのだが、ああいう公開鍵とか秘密鍵とか、そういう話だろうか?


予防線を張っておくと、私はこういうセキュリティのことに強くない。
なので、私は調べてこう思う、という記事になるので、みんな自分で調べよう。

総務省|マイナンバー制度とマイナンバーカード|公的個人認証サービスによる電子証明書(民間事業者向け)

ここの真ん中あたりに、電子証明書の使い方の例が出ている。
「署名用電子証明書」と「利用者証明用電子証明書」が別になっている。
たしかに前記事のJPKI利用者ソフトも、証明書の種類を選んで、その次に証明書選択のダイアログが出ていた。

署名用電子証明書は、「署名用」。
説明には「マイナンバーカードに格納する秘密鍵で文書を暗号化」と書いてある。
電子署名は、「この書類は私が書きました! 改ざんもされてません!」ということを示すものだ。

どうやるかというと、署名したい文書を【秘密鍵】で暗号化する(このデータが電子署名)。
【秘密鍵】で暗号化したデータは、秘密鍵で作った【公開鍵】で復号化できる。
なので、文書を作った人は、文書と電子署名をセットで相手に渡す。
相手は正しい【公開鍵】を手に入れ、電子署名を復号化して、文書と一致していれば「ああ、秘密鍵で暗号化した人が作ったのと同じ文章なんだ」と安心できる。

うん、胡散臭い。
これが成り立つには、前提条件がいろいろいるからだ。
でも、ここではそこは省略する。
出てきた話の登場人物は、【秘密鍵】と【公開鍵】。
この【秘密鍵】が個人番号カードに入っているから、電子署名ができるということになってるはず。
【公開鍵】は、【秘密鍵】を持っている人は作ることができるということになっている(逆は、できない)。
たぶん「~なことになっている」が胡散臭く感じるところなのだけど、数学とか何とかいろいろ入ってくるので、賢い人達がよってたかって考えた結果そうなっているのを信用することにしている。
だけど、公開鍵も一緒に渡してしまうと、そのセットをまるまる盗み取って、別の秘密鍵で署名して、その公開鍵を添付してすり替えてしまうと、相手は改ざんに気付かないことになる。
「正しい【公開鍵】を手に入れ」としたのは、その辺を気にしているのだ。

【公開鍵】は公開と名前が付いているだけに、別に公開してしまっても構わない運用になる。
だから、公開鍵だけネットでばらまいてもいいのだけど、そうするとどれがその人の本物の公開鍵かわからなくなってしまう。
なので、公開鍵が添付されていてもネットにあってもよいけど、その公開鍵が正しいものかどうかを誰かが確認してくれるとうれしい。
その確認してくれる人も、かなり信用できる人じゃないと、相手とぐるになってたら意味が無い。

そういう確認してくれる人を【認証局】とか【CA】とか呼んでいる。。。。
だめだ、そろそろ付け焼き刃がはがれてきた。
PKI関連技術に関するコンテンツ
ここの「認証局モデル」というやつだな。
公開鍵が正しいかどうかではなく、公開鍵の所有者を保証してもらう、という考え方のようだ。

それで、ようやくこの図の意味がわかる。

image

左端がユーザが作った文書、真ん中が電子署名、右端のアイコンが公開鍵、青いのが公開鍵の証明書、というわけだ。
文書が改ざんされていないかどうかは、電子署名を公開鍵で復号化して、文書と比較する。
その公開鍵が正しいかどうかは、公開鍵と証明書を認証局に問い合わせる。
ということだろう。

『暗号技術入門』によると、こういう証明のしくみをPKIと呼ぶようだ。
公開鍵基盤。
PKIという名前から、前記事のアプリをJPKIが出していたことを思いだした。
でも、本によると、GPKIというのが出てきた。
JPKIは「公的個人認証サービス」で、GPKIは「政府認証基盤」となっている。
ああ、もうなんだかわからないわ・・・。

こうやって、証明書とかを勉強しようとして、めんどくさくなってやめてしまうんだろう。


そういう人をなるべく気楽にさせようと考えてか、こういうものもあるらしい。
だれだ、お前は!
http://www.soumu.go.jp/kojinbango_card/kojinninshou-01.html#rogo
公的個人認証サービス広報用キャラクター「マイキーくん」の画像

マイキーくんだって。