Android R (API Level 30) 環境でCTS Verifierのセキュリティテストを実行した際、FingerprintBoundKeysTestにてクラッシュが発生するケースがあります。エラーログを確認すると、対称鍵の生成時に InvalidAlgorithmParameterException がスローされており、その原因として「生体認証が少なくとも1つ登録されていない必要がある」というシステムチェックに失敗していることが示されています。
E AndroidRuntime: java.lang.RuntimeException: Failed to create a symmetric key
E AndroidRuntime: Caused by: java.security.InvalidAlgorithmParameterException: java.lang.IllegalStateException: At least one biometric must be enrolled to create keys requiring user authentication for every use
E AndroidRuntime: at android.security.keystore.KeymasterUtils.addUserAuthArgs(KeymasterUtils.java:174)
この現象は、ユーザー認証を要求する鍵を作成するプロセスにおいて、システムが有効な生体認証センサーを検出できない場合に発生します。具体的には、KeymasterUtils 内部の処理にて、利用可能な生体認証のSID(Secure ID)をリスト化しようとする際、対象が存在しないと IllegalStateException をスローする仕様になっています。
問題の特定のため、フレームワークの挙動をトレースすると、以下の依存関係が見えてきます。
- 鍵生成時、
KeymasterUtilsはBiometricManagerを介して認証IDのリストを取得します。 BiometricServiceおよびAuthServiceは、config_biometric_sensorsというリソース配列を読み込み、デバイスで利用可能なセンサー構成を判断します。- デフォルトのAOSP設定ではこの配列が空であるため、システムは生体認証機能が未構成とみなし、鍵生成リクエストを拒否します。
つまり、デバイス上で指紋センサーが物理的に存在していても、ソフトウェア設定が正しく行われていない場合に本エラーが発生します。
修正方法
この問題を解決するには、デバイス固有のオーバーレイ設定を使用して、生体認証センサーの構成を明示的にシステムに通知する必要があります。対象となるファイルは config.xml です。
以下のように、ベンダー固有のリソースオーバーレイ内で config_biometric_sensors 配列を定義してください。通常、指紋認証モジュールには「ID:0」、「モダリティ:2(Fingerprint)」、「強度:15(Strong)」を割り当てます。
<!-- device/[vendor]/[model]/overlay/frameworks/base/core/res/res/values/config.xml -->
<resources>
<!-- 生体認証センサーのリスト: ID:Modality:Strength -->
<!-- 例: ID0, Fingerprint (2), Strong (15) -->
<string-array name="config_biometric_sensors" translatable="false">
<item>0:2:15</item>
</string-array>
</resources>
この設定を追加してイメージをビルドし直すことで、AuthService がセンサー構成を正しく認識し、CTS Verifierのテストが正常に完了するようになります。