メッセージ認証コード
メッセージ ストリームは、音声の切り替えの構成に使用されます。音声の切り替えメッセージをご覧ください。このような重要な設定では、プロバイダは、メッセージがシーカー上の他のアプリではなく、GMSCore(ファスト ペアリング モジュール)から送信されるようにする必要があります。
MAC(メッセージ認証コード)を生成する
FP Seeker は、HMAC-SHA256 を使用してデバイス設定メッセージのメッセージ認証コードを追加します。メッセージの MAC は、次の最初の 8 バイトで構成されます。
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
ここで
- K は concat(アカウントキー、48 バイトの 0)によって生成されます。
- message は、メッセージ ストリームの追加データです。
- nonce は concat(session_nonce, message_nonce) で生成されます。セッションのノンスとメッセージのノンスについては、次のセクションで定義します。
- opad は 64 バイトの外部パディングで、
0x5C
値の繰り返しバイトで構成されます。 - 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 アドレスの最初の 8 バイトは
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(section_nonce, message_nonce, message)))))
ここで
- K は
concat(account key, 48-byte ZEROs)
によって生成され、プロバイダは保存されているすべてのアカウント鍵を走査して MAC を検証します。 - message は、メッセージ ストリームの追加データ(メッセージのノンスと MAC を除く)です。
MAC が正しい場合、プロバイダはメッセージの指示に従うものとします。それ以外の場合、プロバイダはエラーの理由 0x3(メッセージ認証コードが正しくないため許可されない)で NAK を送信するものとする。