メッセージ認証コード

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

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

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

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

ここで

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

セッション nonce とメッセージ nonce

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

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

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

メッセージ ストリームが接続されたら、セッション nonce を生成して Seeker に送信する必要があります。

オクテット データ型 説明
0 uint8 デバイス情報イベント 0x03
1 uint8 セッション nonce 0x0A
2 ~ 3 uint16 追加データの長さ 0x0008
4 ~ 11 セッション nonce 可変

MAC が必要なときにメッセージを送信するには、Seeker はメッセージ nonce と MAC をメッセージとともに送信します。

オクテット データ型 説明
0 uint8 メッセージ グループ 可変
1 uint8 メッセージ コード 可変
2 ~ 3 uint16 追加データの長さ(追加データの長さ + 16) 可変
4 ~ n 追加データ 可変
n + 1 ~ n + 8 メッセージ nonce 可変
n + 9 ~ n + 16 メッセージ認証コード 可変

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

メッセージ認証コードを含むメッセージを受信したら、プロバイダは生成関数と同じ関数を使用して検証する必要があります。つまり、受信した MAC は次の最初の 8 バイトと等しくなければなりません。

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

ここで

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

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