#はじめに
これはメモであります。
以前Webauthnについて勉強したので、今回はCTAPについて軽く勉強します。
WebAuthn(ウェブオースン)ではなく、CTAP(シータップ)であります。
#CTAPとは
Client to Authenticator Protocol.
FIDOの外部認証デバイスとPlatform(クライアントプログラム)との通信プロトコルです。
Webauthn+CTAP2=FIDO2.0ってかんじです。
Client to Authenticator Protocol (CTAP)で詳しく書かれていますが、チョット読むには重いです。
BluetoothとかNFCとかありますが、今回はUSBのところだけ。
CTAPはWeb情報があまりないです・・・
#Yubico セキュリティキー
お勉強に際してこれを使います。
本家 → https://www.yubico.com/products/yubikey-hardware/
日本代理店 → https://yubikey.yubion.com/yubikey_lineup.html
Amazon → http://amzn.asia/d/5m88BSX
今回はこの青いやつを使います。
この青いYubikeyは「Yubicoセキュリティキー」というらしく Yubikeyという名前ではないようです。おそらく機能が少ない簡易版なのでYubikeyの仲間に入れてもらえないのでしょう。
ここではこれをYubikeyと記載します。
CTAPの検証するにはこれで十分。
#参考
- Client to Authenticator Protocol (CTAP)
- Yubico/libfido2
- いまさらながら FIDO U2F CTAP1 を実装してみた
- 青いYubiKeyをFIDO2.0で光らせたい
#環境
こんな環境でお勉強しています。
- OS=Windows10 1803
- 開発環境=Visual Studio Pro 2017(15.8.5)
- Microsoft Visual C++ 2017
- git version 2.19.1.windows.1
#サンプルソースをデバック実行する
英語の仕様書を読んでも何が何だかサッパリわかりませんね。
サンプルプログラムを実行して確認すればまだわかりそうな気がします。
なので、GitにあるYubico/libfido2のinfo.exeをデバック実行できるようにします。
- Windowsでビルドするには
libfido2\windows\build.bat
を実行すればよい。 - batの中でgit cloneしているのでGitを入れときましょう。
- build.batのMSBuild.exe,cmake.exeのパスを確認。
set "PATH=%PATH%;C:\Program Files~
のところを自分の環境に合わせて修正する。- 自分の環境では
- MSBuild.exe =
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin
- cmake.exe =
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin
- に変更しました。
- libfido2のパスが
C:\projects\libfido2
であることが前提となっているので自分の環境に合わせて修正する。 - 無事ビルドが終わると
\libfido2\build\libfido2.sln
ができるのでこれでVisual Studioで開く。 - Visual Studioからinfoをデバック実行しようとすると、
crypto-43.dll
,hidapi.dll
がない、と怒られるので以下のファイルをlibfido2\build\examples\Debugに持ってくる。- C:\hidapi-Win64\windows\x64\Debug\hidapi.dll
- C:\libressl-2.7.4-Win64\bin\crypto-43.dll
2019/1/23:追記
ここで出来上がるcrypto-43.dll
はデバックモードで、デバック用のVCRUNTIME140D.DLL
などとリンクされます。
リリース用のdllが欲しい場合はC:\libressl-2.7.4\build\LibreSSL.sln
をVisual Studioで立ち上げて個別にRelease構成でビルドしましょう。
とりあえず、デバック実行できるようになるが、usage: info <device>
とエラーになり引数で<device> を指定しろ、と言っているようだ。何を指定すればいいかは次([Yubikeyのパスの調べ方]wi(https://qiita.com/gebo/items/d2ffbd4fcf7d75e21b63#yubikey%E3%81%AE%E3%83%91%E3%82%B9%E3%81%AE%E8%AA%BF%E3%81%B9%E6%96%B9))で。
C:\project\libfido2\build\examples\Debug>info.exe
usage: info <device>
- ※build.batを実行すると、Cドライブ直下に以下のフォルダを作りっぱなしにするので、気に入らない場合 消しましょう。
- hidapi-Win64
- libcbor
- libcbor-0.5.0-Win64
- libfido2-Win64
- libressl-2.7.4
- libressl-2.7.4-Win64
#HID通信の基本
- YubikeyとプログラムはHIDプロトコルで通信する(専用のドライバなし)。
- HIDプロトコルで通信するためhidapi.dllを使っている。
- このAPIは**HID_Open(),HID_Read(),HID_Write()**という単純なもの。
- HID_Open()の引数でYubikeyのパスを指定するが、これがinfo.exe のコマンドライン引数の<Device>で指定したもの。
###Yubikeyのパスの調べ方
追記:よく見たらmanifest.exeというツールがあって、これで一発で分かることがわかりました
⇒追記:manifest.exeだったら一発だったを参照ください。
Yubikeyのパスの調べ方(こういうやりかたはやめましょう)
この手順はネットで適当に検索して出てきた手順を試した結果なので一体なにが何なのか、細かいことを考えるのはやめています。
####1.デバイスマネージャでYubikeyのデバイスを調べる
- Yubikeyを挿すとデバイスマネージャでヒューマンインターフェースデバイスの『USB入力デバイス』で認識される。
- デバイスインスタンスIDを見てYubikeyのデバイスを特定する。Yubibeyを抜き挿しして特定する。
####2.レジストリで検索
- YubikeyデバイスインスタンスパスのVID_9999&PID_9999(上図ではVID_1050&PID_0120)でレジストリを検索する。
- HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClassesあたりを検索してみる。
- キーを検索する。(値ではない)
- **##?#HID#VID_**から始まるキーを検索する。
- 見つかったキーの**?の両側の#だけ¥に変える。これがYubikeyのデバイスパスとなる**。
- 例
- みつかったレジストリキー=
##?#HID#VID_1050&PID_0120#6&1b5e4874&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
- Yubikeyのデバイスパス(¥は小文字)=
¥¥?¥HID#VID_1050&PID_0120#6&1b5e4874&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
- みつかったレジストリキー=
####追記:manifest.exeだったら一発だった
単にmanifest.exeを実行すれば一発でYubikeyのパスが取れました。
C:\project\libfido2\build\examples\Debug>exemanifest.exe
\\?\hid#vid_1050&pid_0120#6&1b5e4874&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}: vendor=0x1050, product=0x0120 (Yubico Security Key by Yubico)
####3.info.exeを実行してみる
- 引数に指定するdevice(Yubikeyのデバイスパス)は『"』で囲みましょう。
- コンソールにいろいろ情報が出ればOK。
- あとはVisual Studioでデバック実行すればすべて理解できる?
C:\project\libfido2\build\examples\Debug>info.exe "\\?\HID#VID_1050&PID_0120#6&1b5e4874&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
proto: 0x02
major: 0x05
minor: 0x00
build: 0x02
caps: 0x05 (wink, cbor, msg)
version strings: U2F_V2, FIDO_2_0
extension strings: hmac-secret
aaguid: f8a011f38c0a4d15800617111f9edc7d
options: rk, up, noplat, noclientPin
maxmsgsiz: 1200
pin protocols: 1
#お疲れさまでした?
CTAPのことは全然わかっていないが、とりあえずここまで。