CTAP2 お勉強メモ#1 - 環境構築(Build)

#はじめに
これはメモであります。
以前[Webauthnについて勉強](https://qiita.com/gebo/items/33c48de1027f53f2712a)したので、今回はCTAPについて軽く勉強します。

**WebAuthn(ウェブオースン)ではなく、CTAP(シータップ)であります。**

#CTAPとは
Client to Authenticator Protocol.
FIDOの外部認証デバイスとPlatform（クライアントプログラム）との通信プロトコルです。
Webauthn+CTAP2=FIDO2.0ってかんじです。

[Client to Authenticator Protocol (CTAP)](https://fidoalliance.org/specs/fido-v2.0-ps-20190130/fido-client-to-authenticator-protocol-v2.0-ps-20190130.html)で詳しく書かれていますが、チョット読むには重いです。
BluetoothとかNFCとかありますが、今回はUSBのところだけ。
CTAPはWeb情報があまりないです・・・

<img width="750" alt="キャプチャ5.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/252291/8a68297d-4fe2-88b9-775f-2adabed2d70d.png">

#Yubico セキュリティキー
お勉強に際してこれを使います。
本家 → https://www.yubico.com/products/yubikey-hardware/
日本代理店 → https://yubikey.yubion.com/yubikey_lineup.html
Amazon → http://amzn.asia/d/5m88BSX
<img width="367" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/252291/4725b5c4-05df-ba4b-30e5-81458dd634f0.png">

今回はこの青いやつを使います。
この青いYubikeyは「Yubicoセキュリティキー」というらしく Yubikeyという名前ではないようです。おそらく機能が少ない簡易版なのでYubikeyの仲間に入れてもらえないのでしょう。
ここではこれをYubikeyと記載します。
CTAPの検証するにはこれで十分。

#参考
- [Client to Authenticator Protocol (CTAP)](https://fidoalliance.org/specs/fido-v2.0-ps-20190130/fido-client-to-authenticator-protocol-v2.0-ps-20190130.html)
- [Yubico/libfido2](https://github.com/Yubico/libfido2)
- [いまさらながら FIDO U2F CTAP1 を実装してみた](https://www.yubion.com/trend/596/)
- [青いYubiKeyをFIDO2.0で光らせたい](https://qiita.com/gebo/items/33c48de1027f53f2712a)

#環境
こんな環境でお勉強しています。

- OS=Windows10 1803
- 開発環境=Visual Studio Pro 2017(15.8.5)
	- Microsoft Visual C++ 2017
- git version 2.19.1.windows.1

#サンプルソースをデバック実行する
[英語の仕様書](https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-client-to-authenticator-protocol-v2.0-id-20180227.html)を読んでも何が何だかサッパリわかりませんね。
サンプルプログラムを実行して確認すればまだわかりそうな気がします。
なので、Gitにある[Yubico/libfido2](https://github.com/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)）で。

<img width="1113" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/252291/c1f34333-0057-70e9-49ba-cacac193cebe.png">

```bat:info.exeを実行
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**というツールがあって、これで一発で分かることがわかりました:scream:
⇒**追記：manifest.exeだったら一発だった**を参照ください。

<details><summary>Yubikeyのパスの調べ方(こういうやりかたはやめましょう)</summary><div>

この手順はネットで適当に検索して出てきた手順を試した結果なので一体なにが何なのか、**細かいことを考えるのはやめています。**

####1.デバイスマネージャでYubikeyのデバイスを調べる
- Yubikeyを挿すとデバイスマネージャで**ヒューマンインターフェースデバイスの『USB入力デバイス』で認識される**。
- デバイスインスタンスIDを見てYubikeyのデバイスを特定する。Yubibeyを抜き挿しして特定する。

<img width="346" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/252291/cf7caf19-b4e6-2041-76e7-cd97f7092f24.png">
<img width="352" alt="キャプチャ4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/252291/69c2692e-e87c-15fa-366c-266761887d6f.png">

####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}`

</div></details>

####追記：manifest.exeだったら一発だった:scream:
単にmanifest.exeを実行すれば一発でYubikeyのパスが取れました。

```bat:manifest.exeを実行
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でデバック実行すればすべて理解できる？

```bat:info.exeを実行
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のことは全然わかっていないが、とりあえずここまで。

[CTAP2 お勉強メモ#2](https://qiita.com/gebo/items/e0bd197d607312dcf4fb)