特徴
GATT サービスのサービスと特性
ファスト ペアリング プロバイダは、以下の GATT サービスを備えるものとします。
サービス | UUID |
---|---|
ファスト ペアリング サービス | 0xFE2C |
このサービスには次の特徴があります。
カスタム特性
ファスト ペアリング サービスの特性 | 暗号化 | 権限 | UUID |
---|---|---|---|
モデル ID | × | 読み取り | FE2C1233-8366-4814-8EB0-01DE32100BEA |
キーベースのペアリング | × | 書き込みと通知 | FE2C1234-8366-4814-8EB0-01DE32100BEA |
パスキー | × | 書き込みと通知 | FE2C1235-8366-4814-8EB0-01DE32100BEA |
アカウント キー | × | 書き込み | FE2C1236-8366-4814-8EB0-01DE32100BEA |
標準的な特性
名前 | 暗号化 | 権限 | UUID |
---|---|---|---|
ファームウェアのリビジョン | × | 読み取り | 0x2A26 |
特性: モデル ID
この特性により、シーカーはデバイスが検出可能モードでアドバタイジングしている場合を除き、必要に応じてモデル ID を読み取ることができます。常に次のデータが返されます。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0 ~ 2 | uint24 |
モデル ID | 変わる、変動する(# 文脈に応じて適宜変更) |
特性: キーベースのペアリング
この特性は、キーベースのペアリング手順を制御します。この手順では、シーカーとプロバイダの両方が事前共有キーを所有していることを確認することで、特定のレベルの信頼が確立されます。鍵はそれぞれのケースで異なります。
ケース 1: 事前共有キーは、なりすまし対策の公開鍵/秘密鍵のペアと、ペアリングの試行ごとに変化するシーカー自身の公開鍵/秘密鍵のペアに基づいています。
- プロバイダはペアリングモードです。
- シーカーは、プロバイダがなりすまし対策用の秘密鍵を所有していることを確認します。
なお、ペアリングモードでは、プロバイダは通常の方法でペア設定することもできます。たとえば、ファスト ペアリングのキーベースのペア設定をサポートしていないデバイスとペア設定することもできます。
ケース 2: 事前共有キーはアカウントキーの一つです。
- 通常、プロバイダはペア設定モードではありません。(ただし、これは要件ではありません。プロバイダは、ペア設定モードの場合でもアカウントキーの使用をサポートする必要があります)。
- シーカーとプロバイダは、それぞれがアカウント キーを所有していることを確認します。
事前共有キーを使用する点を除き、両方のケースは非常に類似しているため、手順で組み合わせます。
データ形式
各形式の使用方法については、手順をご覧ください。
オクテット | データ型 | 説明 | 値 | 必須? |
---|---|---|---|---|
0~15 | uint128 |
暗号化されたリクエスト | 変わる、変動する(# 文脈に応じて適宜変更) | 必須 |
16 ~ 79 | 公開鍵 | 変わる、変動する(# 文脈に応じて適宜変更) | 任意 |
表 1.1: シーカーによって特性に書き込まれた暗号化されたリクエスト
オクテット | データ型 | 説明 | 値 | 必須? |
---|---|---|---|---|
0 | uint8 |
メッセージの種類 | 0x00 = キーベースのペア設定リクエスト |
必須 |
1 | uint8 |
フラグ
|
場合によって異なる | 必須 |
2 ~ 7 | uint48 |
次のいずれかに該当する。
|
場合によって異なる | 必須 |
8 ~ 13 | uint48 |
シーカーの BR/EDR 住所 | 場合によって異なる | フラグビット 1 または 3 が設定されている場合にのみ存在します |
n~ 15 | ランダム値(ソルト) | 場合によって異なる | 必須 |
表 1.2.1: 未加工リクエスト(タイプ 0x00) 表 1.1 の暗号化リクエストから復号されています。
オクテット | データ型 | 説明 | 値 | 必須? |
---|---|---|---|---|
0 | uint8 |
メッセージの種類 | 0x10 = 対応リクエスト |
必須 |
1 | uint8 |
フラグ
|
場合によって異なる | 必須 |
2 ~ 7 | uint48 |
次のいずれかに該当する。
|
場合によって異なる | 必須 |
8 | uint8 |
メッセージ グループ | 場合によって異なる | フラグビット 0 が設定されている場合は必須 |
9 | uint8 |
メッセージ コード | 場合によって異なる | フラグビット 0 が設定されている場合は必須 |
10 | uint8 |
フラグによって異なります。
|
場合によって異なる | フラグビット 0 または 1 が設定されている場合は必須 |
11 ~n | 追加データ | 場合によって異なる | 任意 | |
n~ 15 | ランダム値(ソルト) | 場合によって異なる | 必須 |
表 1.2.2: 未加工リクエスト(タイプ 0x10) 表 1.1 の暗号化リクエストから復号されています。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0 | uint8 |
メッセージの種類 | 0x01 = キーベースのペアリング レスポンス |
1 ~ 6 | uint48 |
プロバイダの公開(BR/EDR)住所 | 場合によって異なる |
7 ~ 15 | ランダム値(ソルト) | 場合によって異なる |
表 1.3: 未加工のレスポンス 表 1.4 に示す暗号化されたレスポンスを生成するために暗号化されます。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0 ~ 15 | uint128 |
暗号化されたレスポンス | 場合によって異なる |
表 1.4: プロバイダが通知を介してシーカーに送信する暗号化されたレスポンス
特性: パスキー
この特性は、 キーベースのペアリング手順で使用されます。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0~15 | uint128 |
暗号化されたパスキー ブロック | 場合によって異なる |
表 2.1: 暗号化されたパスキー ブロック。使用方法については、キーベースのペアリング手順をご覧ください。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0 | uint8 |
メッセージの種類 | 次のいずれか:
|
1 ~ 3 | unit32 |
6 桁のパスキー | 場合によって異なる |
4 ~ 15 | ランダム値(ソルト) | 場合によって異なる |
表 2.2: 未加工パスキー ブロック。 表 2.1 の復号バージョン
特性: アカウントキー
ペア設定後、ファスト ペアリング シーカーはアカウント キーをファスト ペアリング プロバイダに書き込みます。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0~15 | uint128 |
アカウント キー(暗号化済み) | 場合によって異なる |
ファスト ペアリング プロバイダは、書き込みリクエストを受け取ると、次の処理を行うものとします。
- 手順のステップ 4 で生成した共有シークレットを使用して、アカウント キーを復号します。
- 復号する前に、ステップ 12 のパスキー リクエストの復号に共有シークレットが使用されていることを確認します。このシークレットを使用してこのステップが成功しなかった場合、この書き込みを無視して終了します。
- この時点では、共有シークレット(手順の K)はこのペアリングに再度使用されません。手順を再起動せずにこの鍵で暗号化されたリクエストは拒否されます。
- 復号された値が
0x04
で始まることを確認します。含まれていない場合は、この書き込みを無視して終了します。 - 永続化されたアカウントキーのリストに、新しい値用のスペースがあるかどうかを確認します。
- そうでない場合は、最も長い間使われていない値をリストから削除します。
- 新しい値をリストに追加します。
リスト内のアカウントキーは、キーベースのペア設定の際に使用されます。
特性: ファームウェアのリビジョン
この特性により、シーカーは必要に応じてプロバイダのファームウェア リビジョンを読み取ることができます。常に次のデータが返されます。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0 - var | utf8s |
ファームウェア リビジョン コード | 場合によって異なる |
プロバイダに複数のファームウェアがある場合でも(たとえば、左のイヤフォン、右のイヤフォン、ケースのファームウェアが 3 つある場合でも)、単一の utf8 文字列にカプセル化する必要があります。プロバイダは、特殊なケースでは特定の文字列を返すこともできます。
status-updating: プロバイダが現在新しいファームウェアに更新中の場合。あるいは、プロバイダがステージングされたファームウェアのバージョンを返すこともできます。
status-abnormal: Provider が異常な状態である場合。たとえば、ファームウェアの更新に失敗したために誤動作したとします。この値により、今すぐ更新する必要があることをユーザーに知らせるメッセージがシーカーに表示されます。
特性: 追加データ
このサービスの特性は次のとおりです。
ファスト ペアリング サービスの特性 | 暗号化 | 権限 | UUID |
---|---|---|---|
データ | × | 書き込みと通知 | FE2C1237-8366-4814-8EB0-01DE32100BEA |
従来のファスト ペアリング サービスの特性(2021 年 1 月 1 日にサポート終了予定) | 暗号化 | 権限 | UUID |
---|---|---|---|
データ | × | 書き込みと通知 | 0x1237 |
この特性への書き込みまたは通知の前に、特性 FE2C1234-8366-4814-8EB0-01DE32100BEA
を介した handshake によって共有シークレットを取得する必要があります。AES-CTR は、この特性を通過するデータを暗号化するために使用されます。このアルゴリズムは以下に定義されています。このモードでは、1 つの 16 バイトのブロックを超えるデータ全体で安全性が高まります。HMAC-SHA256 を使用してデータの整合性を確保します(これも下記で定義します)。
オクテット | 説明 | 値 |
---|---|---|
0~7 | HMAC-SHA256 の最初の 8 バイト。 | 場合によって異なる |
8 ~ 15 | ノンス。AES-CTR 暗号化で使用されます。 | 場合によって異なる |
16 - var | 暗号化されたデータ。 | 場合によって異なる |
表 3.1: プロバイダが通知を介してシーカーに送信するデータパケット、またはシーカーから書き込みを介してプロバイダに送信されるデータパケット。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0 - var | byte array |
データ | 変動する場合は、表 1.2.2 のデータ ID に従ってデコードします。
|
表 3.2: 元データ 表 3.1 の暗号化されたデータから復号されています。
通知が要求された場合(表 1.2.1 のビット 2 を介して個人名をリクエストするなど)、ファスト ペアリング プロバイダは次のことを行うものとします。
- ノンスに暗号的にランダムな 8 バイトを生成します。
AES-CTR を使用してデータを暗号化します。この場合、各 16 バイトのブロックは
encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
ここで
- AES 鍵は、手順のステップ 4 の共有シークレットです。
- clearBlock[i] は、data[i * 16] から始まる 16 バイトのブロックです。最後のブロックは 16 バイト未満にできます。
concat(encryptedBlock[0], encryptedBlock[1],...) を実行して暗号化されたデータを作成します。
HMAC-SHA256 を生成する方法
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
ここで
- K は concat(shared_secret, 48 バイトの 0) によって生成され、shared_secret はプロシージャのステップ 4 で生成されます。
- opad は 64 バイトの外部パディングで、
0x5C
の繰り返しバイトで構成されます。 - iPad は 64 バイトの内部パディングで、
0x36
の繰り返しバイトで構成されます。
HMAC-SHA256 の最初の 8 バイトをデータパケットの接頭辞として使用します。
ファスト ペアリング プロバイダは、書き込みリクエストを受け取ると、次の処理を行うものとします。
- HMAC-SHA256 の最初の 8 バイトを確認して、データの整合性を検証します。
暗号化されたデータを AES-CTR を使用して復号する。各ブロックは
clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
ここで
concat(clearBlock[0], clearBlock[1],...) を実行して元データを作成する。