はじめに
現在、12/12日の23時5分ですが、何としてもアドカレ12日目に間に合わせるんだ!!!という決意のもと、とんでもなく端折った記事を公開します。
後日必ず追記しますのでお許しください。
本題の導入
弊学ではFelicaタイプの学生証が導入されており、タッチして校舎内に入ったり出席管理を行う仕組みになっています。
この学生証タッチの仕組みをWebアプリに組み込めば私の所属する部で部員管理が楽にできるな~と思い立ったのが始まりです。
しかし、開発にあたって調べてみると、Felicaは国内の色々な所で使われているにもかかわらず、ネット上の情報が意外と少ないという壁がありました。特に、今回取り上げるRC-S300とWebUSBの組み合わせの記事はほぼありません。なので今回取り上げます。
やりたいこと
カードリーダーをPCに繋ぎ、学生証をWebアプリから読み取りたい。
すなわち、学生証から学籍番号を読み取りたい。
技術的にはどうする?
Pasori RC-S300というSONY製のカードリーダーとPCを繋ぎます。繋いだら、ブラウザからWebUSB APIを使用してPasoriと通信し、JavaScroptでカード情報の読み取りを行えるようにします。
カードについて
「ピッ」とタッチするタイプの非接触ICカードには当然規格があります。これがNFCと呼ばれるものです。また、NFCの中にもタイプがあり、NFC Type-A・Type-B・Type-Fなどがあります。
日本国内ではSuicaに代表されるようにFelica規格が普及しています。「Felica」は別名で、Type表記で書くのであればNFC Type-Fとなります。
まずカードを読み取る際には、まず最初にカードに対してポーリングという作業をしてあげる必要があります。ここで、カードの固有のID(という建前)であるIDmを入手します。
その後、カードの中のデータ、本記事でいえば認証不要な領域を読み取りたい場合、そのコマンド中には入手したIDmを追加する必要があります。「○○さんに話しかけてるんですよ~」と名前を呼ぶイメージです。
では、カードのどこに学籍番号のような情報が収められているのでしょうか?
それは認証不要の領域になります。
Felicaカードは色々なことに使えるように設計されており、例えば交通系ICカードなどの決済に関する機能は認証が必要な領域で保護されていますし、その仕様も一般には公開されていません(サイバネ規格などと呼ばれる)。
ただ、一般にも使いやすいように認証なしで書き込み・読み込みできる領域も用意されています。
Felicaカードを使った学生証や社員証などは、この認証不要な領域に必要な情報を書き込んでおいて、「ピッ」でその情報を読み込むというわけです。
この認証不要な領域を読み取るコマンドを、「Read Without Encryptionコマンド」といいます。
では、Read Without Encryptionをするのには何の情報が必要でしょうか?
それは、先ほど述べたIDmとアドレスです。
さっきから「領域」と書いていますが、この「領域」の住所にあたるのがアドレスです。
特定の領域を読み取るにはやはり場所を指定してあげる必要があるのです。
ではアドレスはどうやって入手するのか?
それは事前に知っている必要があります。
felicalibなど、Felicaカードをダンプするツールがあるので、これを使用して探します。
本題(というか結論)
以下のコマンドをRC-S300に送ってください。
XXの部分は読み取りたいカードのIDmに置き換えてください。
またダンプの結果、弊学の場合、学籍番号が抑えられているアドレスが0x1A8Bだったので、これをリトルエンディアンで8B 1Aというようにしてコマンド中に記載しています。
6B 25 00 00 00 00 05 00 00 00 FF 50 00 01 00 00 1B 5F 46 04 A0 86 01 00 95 82 00 10 10 06 XX XX XX XX XX XX XX XX 01 8B 1A 01 80 00 00 00 00
本当はコマンドを組み立てるにあたってリクエストの長さなどを調べてコマンドに付加するといった工程が必要ですが、これはまた後日書きたいと思います。。。
帰ってきたレスポンスがこちらです。
83 2D 00 00 00 00 05 02 00 00 C0 03 00 90 00 92 01 00 96 02 00 00 97 1D 1D 07 XX XX XX XX XX XX XX XX 00 00 01 [ここにブロックデータ] 90 00
ブロックデータ中に学籍番号がhexで収められています。
参考にした記事
本題に入る前に、以下の記事をめちゃくちゃ参考にしました。
以下の記事は概要を把握するのに非常に役立ちます。
https://qiita.com/MarioninC/items/97b82e8eeb3f626a5875
https://qiita.com/MarioninC/items/b5c59e78f3e23c06b83f
こちらの記事は連載になっています。プロトコルの詳細な解説やプログラム面で非常に参考になります。
https://sakura-system.com/?p=2892