メッセージ認証コード

メッセージ ストリームは、音声の切り替えの構成に使用されます。音声の切り替えメッセージをご覧ください。このような重要な設定では、プロバイダは、シーカー上の他のアプリではなく、GMSCore(ファスト ペアリング モジュール)によってメッセージが送信されるようにする必要があります。

MAC(メッセージ認証コード)を生成する

FP Seeker は、HMAC-SHA256 を使用して、デバイス構成メッセージにメッセージ認証コードを追加します。メッセージの最初の 8 バイトは次の MAC アドレスで構成されます。

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

ここで

  1. K は concat(アカウントキー、48 バイトの 0)によって生成されます。
  2. message は、メッセージ ストリームの追加データです。
  3. nonce は concat(session_nonce, message_nonce) によって生成されます。セッションのノンスとメッセージのノンスについては、次のセクションで定義します。
  4. opad は、64 バイトの外部パディングで、0x5C 値のバイトの繰り返しで構成されます。
  5. ipad は 64 バイトの内部パディングで、0x36 の繰り返しバイトで構成されます。

セッションのノンスとメッセージのノンス

リプレイ攻撃を防ぐために、プロバイダはノンスが繰り返されないようにする必要があります。プロバイダとシーカーの両方でクロックまたはカウンタの同期を維持するのは簡単ではないため、プロバイダはセッション ノンス(接続ごと)を生成します。これは接続中にすべてのメッセージで共有され、シーカーはメッセージごとにランダムに生成されるメッセージのノンス(メッセージごと)を生成します。各メッセージの MAC を生成するノンスは、セッションのノンスとメッセージのノンスを組み合わせたものです(つまり concat(session_nonce, message_nonce)。

デバイス情報イベント グループにセッションのノンスを追加します。

メッセージ グループ名
デバイス情報イベント 0x03
メッセージ コード名
セッションのノンス 0x0A

RFCOMM が接続したときに、セッションのノンスが生成され、シーカーに送信されます。

オクテット データ型 説明
0 uint8 デバイス情報イベント 0x03
1 uint8 セッションのノンス 0x0A
2 ~ 3 uint16 追加データの長さ 0x0008
4 ~ 11 セッションのノンス 場合によって異なる

MAC が必要な場合にメッセージを送信するために、シーカーはメッセージのノンスと MAC をメッセージとともに送信します。

オクテット データ型 説明
0 uint8 メッセージ グループ 場合によって異なる
1 uint8 メッセージ コード 場合によって異なる
2 ~ 3 uint16 追加データ長(追加データ長 + 16) 場合によって異なる
4 ~ n 追加データ 場合によって異なる
n + 1 ~ n + 8 メッセージのノンス 場合によって異なる
n+9 ~ n+16 メッセージ認証コード 場合によって異なる

MAC(メッセージ認証コード)を確認する

メッセージ認証コードを含むメッセージを受信すると、プロバイダは生成関数と同じ関数を使用して認証を行います。つまり 受信 MAC アドレスは

 sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))

ここで

  1. Kconcat(account key, 48-byte ZEROs) によって生成され、プロバイダは保存されているすべてのアカウント キーを走査して MAC を検証します。
  2. message は、メッセージ ストリームの追加データです(メッセージのノンスと MAC を除く)。

MAC が正しい場合、プロバイダはメッセージの指示に従います。それ以外の場合、プロバイダはエラー理由 0x3(メッセージ認証コードが正しくないため許可されない)で NAK を送信するものとします。