メッセージ認証コード
音声の切り替えを設定するには、メッセージ ストリームを使用します。 音声切り替えメッセージ。このような重要な構成の場合、プロバイダは (ファスト ペアリング モジュール)ではなく、GMSCore(ファスト ペアリング モジュール)から送信される 別のアプリを表示します
MAC(メッセージ認証コード)を生成する
FP シーカーがデバイス構成メッセージにメッセージ認証コードを追加 取得します。メッセージの MAC は、次の最初の 8 バイトで構成されます。
sha256(concat((K ^ opad), sha256(concat((K ^ ipad), concat(nonce, message)))))
ここで
- K は concat(アカウントキー、48 バイトの ZERO)によって生成されます。
- message はメッセージ ストリームの追加データです。
- nonce は concat(session_nonce, message_nonce) で生成されます。セッション 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 が必要な場合にメッセージを送信するために、シーカーはメッセージのノンスを送信します。 メッセージと一緒に送信されます。
オクテット | データ型 | 説明 | 値 |
---|---|---|---|
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)
によって生成され、Provider は は、保存されているすべてのアカウントキーを走査して MAC を検証します。 - message はメッセージの追加データ(メッセージのノンスと MAC を除く)です 表示されます。
MAC が正しい場合、プロバイダは 表示されます。それ以外の場合、プロバイダはエラー理由 0x3 - メッセージ認証コードが正しくないため、許可されていません。