特性

ファスト ペアリング サービス

ファスト ペアリング プロバイダは、以下の 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 フラグ
  • ビット 0(MSB): 非推奨となり、Seeker により無視されました。
  • ビット 1: シーカーがプロバイダがボンディングを開始するようリクエストし、このリクエストにシーカーの BR/EDR アドレスが含まれている場合。それ以外の場合は 0 です。
  • ビット 2: シーカーがプロバイダに既存の名前を通知するよう要求した場合、1。それ以外の場合は 0 です。
  • ビット 3: 遡及的アカウントキーの書き込みの場合は 1。それ以外の場合は 0 です。
  • ビット 4 ~ 7 は将来の使用のために予約されており、無視します。
場合によって異なる 必須
2 ~ 7 uint48 次のいずれか:
  • プロバイダの現在の BLE アドレス
  • プロバイダの公開アドレス
場合によって異なる 必須
8 ~ 13 uint48 シーカーの BR/EDR 住所 場合によって異なる フラグビット 1 または 3 が設定されている場合にのみ存在します
n~ 15 ランダム値(ソルト) 場合によって異なる 必須

表 1.2.1: 未加工のリクエスト(タイプ 0x00)。 表 1.1 の暗号化リクエストから復号化されています。

オクテット データ型 説明 必須かどうか
0 uint8 メッセージの種類 0x10 = アクション リクエスト 必須
1 uint8 フラグ
  • ビット 0(MSB): デバイス アクションの場合は 1、それ以外の場合は 0。
  • ビット 1: 追加データ特性が後に続く場合は 1、それ以外の場合は 0。
  • ビット 2 ~ 7 は将来の使用のために予約されており、無視します。
場合によって異なる 必須
2 ~ 7 uint48 次のいずれか:
  • プロバイダの現在の BLE アドレス
  • プロバイダの公開アドレス
場合によって異なる 必須
8 uint8 メッセージ グループ 場合によって異なる フラグビット 0 が設定されている場合は必須
9 uint8 メッセージ コード 場合によって異なる フラグビット 0 が設定されている場合は必須
10 uint8 フラグによって異なる:
  • ビット 0 を設定: 追加データ長(6 未満)
  • ビット 1: Data ID
場合によって異なる フラグビット 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 メッセージの種類 次のいずれか:
  • 0x02 = シーカーのパスキー
  • 0x03 = プロバイダのパスキー
1 ~ 3 unit32 6 桁のパスキー 場合によって異なる
4 ~ 15 ランダム値(ソルト) 場合によって異なる

表 2.2: 未加工のパスキー ブロック。 表 2.1 の復号バージョン。

特性: アカウントキー

ペア設定後、ファスト ペアリング シーカーはファスト ペアリング プロバイダにアカウントキーを書き込みます。

オクテット データ型 説明
0~15 uint128 アカウントキー(暗号化済み) 場合によって異なる

書き込みリクエストを受け取ると、ファスト ペアリング プロバイダは以下を行います。

  1. 手順のステップ 4 で生成した共有シークレットを使用してアカウント キーを復号します。
    • ボンディングが必要なプロバイダの場合(共通):
      • 復号する前に、ステップ 12 のパスキー リクエストの復号に共有シークレットが使用されていることを確認します。このシークレットを使用してこのステップが成功していない場合は、この書き込みを無視して終了します。
    • この時点では、このペアリングに共有シークレット(この手順の K)が再度使用されることはありません。手順を再開せずにこの鍵で暗号化されたリクエストは、拒否されます。
  2. 復号された値が 0x04 で始まっていることを確認します。存在していない場合は、この書き込みを無視して終了します。
  3. 永続的なアカウントキーリストに新しい値を格納するスペースがあるかどうかを確認します。
  4. 使用しない場合は、最も長い間使用されていない値をリストから削除します。
  5. リストに新しい値を追加します。

リスト内のアカウントキーはキーベースのペア設定で使用されます。

特性:ファームウェアのリビジョン

この特性により、シーカーは必要に応じてプロバイダのファームウェア リビジョンを読み取ることができます。常に次のデータが返されます。

オクテット データ型 説明
0 - var utf8s ファームウェアのリビジョン コード 場合によって異なる

プロバイダに複数のファームウェア(左のイヤホン、右のイヤホン、ケースに 3 つのファームウェアなど)がある場合でも、単一の utf8 文字列にカプセル化する必要があります。Provider は、特殊なケースでは特定の文字列を返すこともできます。

  1. status-updates: プロバイダが現在新しいファームウェアにアップデート中の場合。 あるいは、ステージングされたファームウェアのバージョンをプロバイダが返すこともできます。

  2. 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 に従ってデコードします。
  • 0x01(パーソナライズ名): utf8s

表 3.2: 元データ。 表 3.1 の暗号化データから復号されています。

通知がリクエストされた場合(たとえば、表 1.2.1 のビット 2 を介してパーソナライズ名をリクエストする場合)、ファスト ペアリング プロバイダは次のことを行うものとします。

  1. ノンス用に暗号的にランダムな 8 バイトを生成します。
  2. AES-CTR を使用してデータを暗号化します。ここで、各 16 バイトのブロックは

    encryptedBlock[i] = clearBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    ここで

    1. AES 鍵は、手順のステップ 4 の共有シークレットです。
    2. ClearBlock[i] は、data[i * 16]から始まる 16 バイトのブロックです。最後のブロックは 16 バイト未満にできます。
  3. concat(encryptedBlock[0], encryptedBlock[1],...) を実行して、暗号化されたデータを作成します。

  4. HMAC-SHA256 を生成する方法

    sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, encrypted_data)))))
    

    ここで

    1. K は concat(shared_secret, 48-byte ZEROs) によって生成され、shared_secret は手順のステップ 4 で生成されます。
    2. opad は 64 バイトの外部パディングであり、値 0x5C の繰り返しバイトで構成されます。
    3. iPad は 64 バイトの内部パディングで、値 0x36 の繰り返しバイトで構成されます。
  5. HMAC-SHA256 から最初の 8 バイトをデータパケットの接頭辞として使用します。

書き込みリクエストを受け取ると、ファスト ペアリング プロバイダは以下を行います。

  1. HMAC-SHA256 の最初の 8 バイトを確認して、データの整合性を検証します。
  2. AES-CTR を使用して、暗号化されたデータを復号します。ここで、各ブロックは

    clearBlock[i] = encryptedBlock[i] ^ AES(key, concat((uint8) i, 0x00000000000000, nonce))
    

    ここで

    1. encryptionBlock[i] は、encrypted_data[i * 16] から始まる 16 バイトのブロックです。最後のブロックは 16 バイト未満にできます。
    2. AES 鍵は handshake から生成または識別されます。例:
      1. 命名フロー 1 では、ECDH からのものであり、このペアリングで再び使用されることはありません。手順を再開せずにこの鍵で暗号化されたリクエストは、拒否する必要があります。
      2. 命名フロー 2 では、アカウントキーです。
  3. concat(clearBlock[0], clearBlock[1],...) で元データを作成する。