特性
ファスト ペアリング サービス
ファスト ペアリング プロバイダは、以下の 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 |
---|---|
デバイス情報サービス | 0x180A |
ファスト ペアリング シーカーには次の特徴があります。
名前 | 暗号化あり | 権限 | UUID |
---|---|---|---|
ファームウェアのリビジョン | × | 読み取り | 0x2A26 |
特徴: モデル ID
この特性により、シーカーはデバイスが検出可能モードでアドバタイジングしているとき以外、必要に応じてモデル ID を読み取ることができます。常に次のデータが返されます。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
0 ~ 2 | uint24 |
モデル ID | 可変 |
特徴: キーベースのペアリング
この特性は、キーベースのペアリング手順を制御します。この手順では、シーカーとプロバイダの両方が事前共有キーを所有していることを確認することで、特定のレベルの信頼を確立します。鍵はケースごとに異なります。
ケース 1: 事前共有キーは、なりすまし対策の公開鍵/秘密鍵のペアと、ペア設定の試行ごとに変更されるシーカー独自の公開鍵/秘密鍵のペアに基づいています。
- プロバイダがペア設定モードになっています。
- シーカーは、プロバイダがなりすまし対策の秘密鍵を所有していることを確認します。
もちろん、ペア設定モードのときに、プロバイダは通常の方法でペア設定することもできます。たとえば、ファスト ペアリングのキーベースのペア設定をサポートしていないデバイスとペア設定できます。
ケース 2: 事前共有キーはアカウントキーの 1 つです。
- 通常、プロバイダはペア設定モードではありません。(ただし、これは要件ではありません。プロバイダは、ペア設定モードの場合でもアカウントキーの使用をサポートする必要があります)。
- シーカーとプロバイダは、それぞれが他方のアカウント キーを所有していることを確認します。
事前共有キーを使用する点を除き、どちらのケースも非常に類似しているため、手順で組み合わせます。
データ形式
各形式の使用方法については、手順をご覧ください。
オクテット | データ型 | 説明 | 値 | 必須かどうか |
---|---|---|---|---|
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 文字列にカプセル化する必要があります。Provider は、特殊なケースでは特定の文字列を返すこともできます。
status-updates: プロバイダが現在新しいファームウェアにアップデート中の場合。 あるいは、ステージングされたファームウェアのバージョンをプロバイダが返すこともできます。
status-abnormal: プロバイダが異常な状態である場合。たとえば、ファームウェアの更新に失敗したため、不具合が発生しています。この値を指定すると、今すぐ更新する必要があることを知らせるメッセージがシーカーに表示されます。
プロバイダは、デバイスのトラッキングを防ぐために、ファームウェア リビジョンの特性へのアクセスを制限する必要があります。推奨される制限事項:
- ボンディングされたデバイスはいつでもアクセスできなければなりません。
- プロバイダが検出可能である場合、すべてのデバイスがアクセスできる必要があります
特徴: 追加データ
このサービスには次のような特性があります。
ファスト ペアリング サービスの特性 | 暗号化あり | 権限 | UUID |
---|---|---|---|
データ | × | 書き込みと通知 | FE2C1237-8366-4814-8EB0-01DE32100BEA |
以前のファスト ペアリング サービスの特性(2021 年 1 月 1 日にサポート終了予定) | 暗号化あり | 権限 | UUID |
---|---|---|---|
データ | × | 書き込みと通知 | 0x1237 |
この特性に対して書き込みや通知を行う前に、特性 FE2C1234-8366-4814-8EB0-01DE32100BEA
を介して handshake を行って共有シークレットを取得する必要があります。AES-CTR は、この特性を通過するデータを暗号化するために使用されます。アルゴリズムは以下に定義されています。このモードは、16 バイトのブロックを超えるデータ全体でより安全です。HMAC-SHA256 を使用してデータの整合性を確保します。これも以下に定義されています。
オクテット | 説明 | 値 |
---|---|---|
0~7 | HMAC-SHA256 の最初の 8 バイト。 | 場合によって異なる |
8 ~ 15 | ノンス。AES-CTR 暗号化で使用されます。 | 場合によって異なる |
16 - varvar | 暗号化されたデータ。 | 場合によって異なる |
表 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-byte ZEROs) によって生成され、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],...) で元データを作成する。