diverta / onecard-fido

MIT License
0 stars 0 forks source link

[障害] macOSにペアリング情報が残存時、BLEペアリング処理が応答タイムアウト #697

Closed makmorit closed 1 year ago

makmorit commented 1 year ago

概要

macOSにペアリング情報が残存時、BLEペアリング処理が60秒後にタイムアウトする障害が確認されています。

2022-12-23 13:42:09.496 [info] ペアリングを開始します。
2022-12-23 13:42:09.497 [debug] BLE Sent INIT frame: data size=1 length=1
83 00 01 4c 
2022-12-23 13:42:09.502 [info] FIDO認証器のスキャンを開始します。
2022-12-23 13:42:10.284 [info] FIDO認証器のスキャンを停止しました。
2022-12-23 13:43:10.303 [debug] BLE connection has terminated successfully.
2022-12-23 13:43:10.304 [error] FIDO認証器の接続処理がタイムアウトしました。
2022-12-23 13:43:10.309 [error] ペアリングが失敗しました。

nRF52840側では、下記のエラーが際限なく繰り返される挙動となり、結果として管理ツール側でBLE応答タイムアウト(10秒)が検知できません。 (1分後に、管理ツール側がタイムアウトにより接続処理を停止させるため、下記のエラーも停止します)

<info> ble_service_common: BLE: Connected.
:
<info> peer_manager_handler: Connection security failed: role: Peripheral, conn_handle: 0x1, procedure: Encryption, error: 4102
<warning> peer_manager_handler: Disconnecting conn_handle 1.
<info> ble_service_peripheral: BLE: Fast advertising.
<info> ble_service_common: BLE: Disconnected, reason 22.

procedure: Encryption, error: 4102はペアリング情報不整合によるエラーの様子

makmorit commented 1 year ago

発生原因と対策

原因

管理ツール側の「ペアリング情報削除」機能を単独で実行した場合に発生します。 この場合、macOSにはペアリング情報(LTK)が残存していますが、対応するLTKが、MDBT50Q Dongle(nRF52840)側にないため、接続障害が発生します。

このとき、BLEリクエストが飛ぶ前に、macOSにより自動的に行われるペアリングリトライ処理により、前述のエラーが繰り返される挙動になるようです。

対策

前述のprocedure: Encryption, error: 4102はnRF52840アプリケーションで捕捉できます。 したがって、本件対策としては、このエラーを捕捉し、アドバタイズを停止するなどでペアリングリトライ処理に応じないような機能を、nRF52840アプリケーションに追加する必要がありそうです。

考慮点としては、残存しているmacOSのペアリング情報を消すなどのユーザー操作により、ペアリング実行の再試行が可能となるような仕組みを作る必要があります。 すなわち、障害で停止されたアドバタイズが、MDBT50Q Dongle上のボタンを1回押すなどの操作により復帰(再開)できるようにするなどの機能が考えられます。

makmorit commented 1 year ago

問題が解消したのでクローズいたします。