【WBF】プライベートプールの設定

# プライベートプールとは？
Windows Biometric Framework(以下WBF)では、生体認証デバイスを使用する際に、"その生体認証デバイスをどのように使用するか"に関する設定の集まりである"プール"というものを設定する必要があります。この"プール"には"システムプール"と"プライベートプール"の2種類があります。"システムプール"はWindows Helloが使用しています。サードパーティがWBFを使用したアプリケーションを開発する場合は、"システムプール"、"プライベートプール"を用途に合わせて使用します。
![システムプールとプライベートプール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/a8c744d5-bf1e-d8e3-bbac-49108ec28d36.png)
サードパーティがシステムプールを使用する場合は、Windows Helloと設定や生体認証データを共有する事になるため、自アプリで生体情報の登録を実装しなくても、Windows Helloに登録済みの生体情報で認証ができるなどの利点があります。逆にデータを共有したくない場合は、プライベートプールを作成する事になります。プライベートプールはいくつでも作成する事ができるので、各アプリケーションごとにそのアプリ用のプライベートプールを用意できます。また同じアプリケーション内でも用途に合わせて複数のプライベートプールを使用する事もできます。

# 構成情報の保存先
構成情報は"プールの構成情報"と"データベースの構成情報"の2つに分かれて、レジストリに保存されています。"プールの構成情報"は各生体認証デバイスごとに、"データベースの構成情報"はデバイスとは切り離して定義されます。"プールの構成情報"と"データベースの構成情報"は1対1で結び付くものではないため、異なるデバイス(異なるプール)が同じデータベースを参照していれば、そのデバイス間で生体認証データが共有される事になります。
![プールとデータベース.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/e7f6858b-d0fb-f0c9-0e8c-d526ace583b6.png)
例えば、上記のような例ではデバイスAとデバイスBのシステムプールは同じデータベースを参照しているので、デバイスを切り替えても、システムプールを使うアプリケーションでは切り替え前のデバイスで登録した情報をそのまま使用する事が可能となります。

## データベースの構成情報
データベースの構成情報は下記のレジストリにあります。
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WbioSrvc\Databases`

下記の例では、5つのデータベースが設定されている事が分かります。
![レジストリ_データベース.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/68b96480-4266-e52e-f3d7-3789945afc8f.png)

データベースは下記の情報から構成されます。

|  名前              |  説明  |
| ----               | ---- |
|  Attributes        |  データベースの特性に関する情報。詳細は下記URL参照。<br>https://docs.microsoft.com/en-us/windows/win32/secbiomet/winbio-storage-schema  |
|  AutoCreate        |  ?  |
|  AutoName          |  ?  |
|  BiometricType     |  データベースに保存された生体認証データの種類。詳細は下記URL参照。<br>https://docs.microsoft.com/en-us/windows/win32/secbiomet/winbio-biometric-type-constants  |
|  ConnectionString  |  データベースを識別するためにデータベースサーバーに送信できる文字列値。  |
|  FilePath          |  データベースがコンピュータディスク上にある場合のパスとファイル名。  |
|  Format            |  データベース内のテンプレートの形式を識別するGUID。  |
|  InitialSize       |  ?  |

"?"部分については、名前から何となく用途は想像できるものの、公式に情報が見つからなかったので特に説明は記載しません。

## プールの構成情報
各生体認証デバイスのプールの構成情報は下記のレジストリにあります。
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\(デバイスインスタンスパス)\
Device Parameters\WinBio\Configurations`

デバイスインスタンスパスは、デバイスマネージャーで使用したい生体認証デバイスのプロパティを開き、[詳細]タブにて確認できます。
![デバイスインスタンスパスの確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/c46a49cb-812a-70fe-6a32-be15c8056690.png)

下記の例では、1つのプールが設定されている事が分かります。
![レジストリ_プール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/35cca0e7-91d0-cfdf-ed90-3aa5f9320f2f.png)

プールは下記の情報から構成されます。

|  名前                  |  説明  |
| ----                   | ---- |
|  SystemSensor          |  この値が”1”の場合はシステムプール、<br>それ以外はプライベートプール。  |
|  SensorMode            |  センサーモード。詳細は下記URL参照。<br>https://docs.microsoft.com/en-us/windows/win32/secbiomet/winbio-sensor-mode-constants |
|  DatabaseId            |  プールが使用するデータベースのGUID。  |
|  SensorAdapterBinary   |  プールが使用するセンサーアダプターのファイル名。  |
|  EngineAdapterBinary   |  プールが使用するエンジンアダプターのファイル名。  |
|  StorageAdapterBinary  |  プールが使用するストレージアダプターのファイル名。  |

# プライベートプールの設定
それでは実際に新しいプライベートプールを設定していきます。ここでは各種設定はシステムプールと同じ、データベースだけ異なるものを参照するプライベートプールを設定します。

(1) 使用したい生体認証デバイスのシステムプールが使用しているデータベースを確認します。
下記の例では、GUIDが”7B5D3242-420A-4287-BCFE-495C28DD9F21”のデータベースを使用しています。
![システムプールの確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/d150cd1f-eecb-4963-cf04-45ece4510797.png)

(2) 新しいデータベース用のGUIDを用意します。
GUIDが作成できるツールなら何でも構いませんが、私は[Visual Studio 2019]の[ツール]→[GUIDの作成]から作成しました。

(3) データベースを定義しているレジストリ下に(2)で用意したGUIDのキーを作成し、下記を設定します。

|  名前              |  説明  |
| ----               | ---- |
|  Attributes        |  (1)で確認したデータベースの”Attributes”と同じ値。  |
|  AutoCreate        |  “1”固定。  |
|  AutoName          |  “1”固定。  |
|  BiometricType     |  (1)で確認したデータベースの”BiometricType”と同じ値。  |
|  ConnectionString  |  空文字。  |
|  FilePath          |  空文字。  |
|  Format            |  (1)で確認したデータベースの”Format”と同じ値。  |
|  InitialSize       |  “32”固定。  |

![データベースの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/50816a38-921a-6530-bcc2-b166b6f3651b.png)

(4) プールを定義しているレジストリ下に(2)で用意したGUIDのキーを作成し、下記を設定します。

|  名前                  |  説明  |
| ----                   | ---- |
|  SystemSensor          |  “0”固定。  |
|  SensorMode            |  システムプールの”SensorMode”と同じ値。 |
|  DatabaseId            |  (3)で定義したデータベースのGUID。”{}”は不要。  |
|  SensorAdapterBinary   |  システムプールの”SensorAdapterBinary”と同じ値。  |
|  EngineAdapterBinary   |  システムプールの”EngineAdapterBinary”と同じ値。  |
|  StorageAdapterBinary  |  システムプールの”StorageAdapterBinary”と同じ値。  |

![プールの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/7806e475-9de1-38ad-e65b-9478b9edf5de.png)

以上で、プライベートプールの設定は完了です。

プライベートプールを使用したコードの実装については下記を参考にしてください。
https://docs.microsoft.com/en-us/windows/win32/secbiomet/private-pool-identity