6. MAC オブジェクト
- MAC オブジェクト
COSE は 2 つの異なる MAC 構造をサポートしています。COSE_Mac0 は、使用する鍵が暗黙的に知られているため、受信者構造が必要ない場合に使用されます。COSE_Mac はそれ以外のすべての場合に使用されます。これには、複数の受信者が必要な場合、鍵が不明な場合、または直接以外の受信者アルゴリズムを使用する場合が含まれます。
このセクションでは、COSE で MAC 認証を行う際に使用する構造と方法について説明します。このドキュメントでは、暗号化に許可されているものと同じクラスの受信者アルゴリズムをすべて使用できます。
MAC 操作を使用できるモードは 2 つあります。1 つ目は、MAC が計算されてからコンテンツが変更されていないことを確認するだけのものです。この目的には、どのクラスの受信者アルゴリズムでも使用できます。2 つ目のモードは、MAC が計算されてからコンテンツが変更されていないことを確認し、さらに受信者アルゴリズムを使用して誰が送信したかを検証するものです。これをサポートする受信者アルゴリズムのクラスは、事前共有シークレットを使用するもの、または静的-静的 (SS) 鍵合意 (鍵ラップステップなし) を行うものです。これらのどちらの場合でも、メッセージ MAC を作成して送信したエンティティを検証できます。(送信者に関するこの知識は、関与している当事者が 2 者のみであり、自分自身にメッセージを送信していないことを前提としています。) どちらの MAC メッセージ構造でも、発信元プロパティを取得できます。
6.1. 受信者付き MAC メッセージ
複数受信者の MAC メッセージは、2 つの構造を使用します。ボディを運ぶためにこのセクションで定義されている COSE_Mac 構造と、MAC 計算に使用される鍵を保持するための COSE_recipient 構造 (セクション 5.1) です。MAC メッセージの例は、付録 C.5 にあります。
MAC 構造は、使用されるコンテキストに応じて、タグ付きまたはタグなしでエンコードできます。タグ付き COSE_Mac 構造は、CBOR タグ 97 で識別されます。これを表す CDDL フラグメントは次のとおりです。
COSE_Mac_Tagged = #6.97(COSE_Mac)
COSE_Mac 構造は CBOR 配列です。配列のフィールドは順に次のとおりです。
protected: セクション 3 で説明されているとおりです。
unprotected: セクション 3 で説明されているとおりです。
payload: このフィールドには、MAC 処理されるシリアル化されたコンテンツが含まれます。ペイロードがメッセージに存在しない場合、アプリケーションはペイロードを別途提供する必要があります。ペイロードは、変更されずに転送されることを保証するために bstr でラップされます。ペイロードが別途転送される場合 (つまり、分離されたコンテンツ)、この場所には nil CBOR 値が配置され、変更されずに転送されることを保証するのはアプリケーションの責任です。
tag: このフィールドには MAC 値が含まれます。
recipients: セクション 5.1 で説明されているとおりです。
COSE_Mac の上記のテキストを表す CDDL フラグメントは次のとおりです。
COSE_Mac = [ Headers, payload : bstr / nil, tag : bstr, recipients : [+COSE_recipient] ]
6.2. 暗黙的鍵付き MAC メッセージ
このセクションでは、受信者が暗黙的に知られている場合に MAC 認証を行う際に使用する構造と方法について説明します。
MAC メッセージは、ボディを運ぶためにこのセクションで定義されている COSE_Mac0 構造を使用します。暗黙的鍵付き MAC メッセージの例は、付録 C.6 にあります。
MAC 構造は、使用されるコンテキストに応じて、タグ付きまたはタグなしでエンコードできます。タグ付き COSE_Mac0 構造は、CBOR タグ 17 で識別されます。これを表す CDDL フラグメントは次のとおりです。
COSE_Mac0_Tagged = #6.17(COSE_Mac0)
COSE_Mac0 構造は CBOR 配列です。配列のフィールドは順に次のとおりです。
protected: セクション 3 で説明されているとおりです。
unprotected: セクション 3 で説明されているとおりです。
payload: セクション 6.1 で説明されているとおりです。
tag: このフィールドには MAC 値が含まれます。
上記のテキストに対応する CDDL フラグメントは次のとおりです。
COSE_Mac0 = [ Headers, payload : bstr / nil, tag : bstr, ]
6.3. MAC の計算と検証方法
認証されるデータの一貫したエンコーディングを取得するために、MAC_structure を使用して正規形式を作成します。MAC_structure は CBOR 配列です。MAC_structure のフィールドは順に次のとおりです。
-
エンコードされている構造を識別するコンテキストテキスト文字列。このコンテキストテキスト文字列は、COSE_Mac 構造の場合は "MAC" です。COSE_Mac0 構造の場合は "MAC0" です。
-
ボディ構造からの保護属性。保護属性がない場合は、長さゼロの bstr が使用されます。
-
アプリケーションから外部的に提供されたデータで、bstr 型としてエンコードされます。このフィールドが提供されない場合、デフォルトは長さゼロのバイト文字列になります。(このフィールドの構築に関するアプリケーションガイダンスについては、セクション 4.3 を参照してください。)
-
MAC 処理されるペイロードで、bstr 型でエンコードされます。ここでは、転送方法に関係なく、完全なペイロードが使用されます。
上記のテキストに対応する CDDL フラグメントは次のとおりです。
MAC_structure = [ context : "MAC" / "MAC0", protected : empty_or_serialized_map, external_aad : bstr, payload : bstr ]
MAC を計算する手順は次のとおりです。
-
MAC_structure を作成し、適切なフィールドを入力します。
-
セクション 9 で説明されているエンコーディングを使用して MAC_structure をバイト文字列にエンコードし、値 ToBeMaced を作成します。
-
K (使用する鍵)、alg (MAC アルゴリズム)、および ToBeMaced (MAC を計算する値) を渡して、MAC 作成アルゴリズムを呼び出します。
-
結果の MAC を COSE_Mac または COSE_Mac0 構造の "tag" フィールドに配置します。
-
COSE_Mac 構造の場合、メッセージの各受信者の MAC 鍵を暗号化してエンコードします。
MAC を検証する手順は次のとおりです。
-
MAC_structure を作成し、適切なフィールドを入力します。
-
セクション 9 で説明されているエンコーディングを使用して MAC_structure をバイト文字列にエンコードし、値 ToBeMaced を作成します。
-
COSE_Mac 構造の場合、受信者構造の 1 つをデコードおよび復号化して、暗号化鍵を取得します。
-
K (使用する鍵)、alg (MAC アルゴリズム)、および ToBeMaced (MAC を計算する値) を渡して、MAC 作成アルゴリズムを呼び出します。
-
MAC 値を COSE_Mac または COSE_Mac0 構造の "tag" フィールドと比較します。