3. ヘッダーパラメータ
- ヘッダーパラメータ
COSEの構造は、ペイロード自体の一部とは見なされないが、コンテンツ、アルゴリズム、キー、またはレイヤーの処理のための評価ヒントに関する情報を保持するために使用される2つの情報のバケットを持つように設計されています。これら2つのバケットは、キーを除くすべての構造で使用できます。これらのバケットは存在しますが、すべてのインスタンスで常に使用できるとは限りません。たとえば、保護されたバケットは受信者構造の一部として定義されていますが、受信者構造に使用されるアルゴリズムの一部は認証データを提供しません。この場合、保護されたバケットは空のままになります。
両方のバケットはCBORマップとして実装されています。マップキーは「ラベル」(セクション1.5)です。値の部分はラベルの定義に依存します。両方のマップは同じラベル/値ペアのセットを使用します。ラベルの整数値とテキスト文字列値は、標準範囲、私的使用範囲、選択されたアルゴリズムに依存する範囲など、いくつかのセクションに分割されています。定義されたラベルは、「COSE Header Parameters」IANAレジストリ(セクション11.1)にあります。
2つのバケットは次のとおりです。
protected(保護された): 暗号的に保護されている現在のレイヤーに関するパラメータが含まれています。暗号計算に含まれない場合、このバケットは空でなければなりません(MUST)。このバケットは、メッセージ内でバイナリオブジェクトとしてエンコードされます。この値は、保護されたマップをCBORエンコードし、bstrオブジェクトにラップすることで取得されます。送信者は、ゼロ長マップ(h'a0'としてエンコード)ではなく、ゼロ長マップをゼロ長バイト文字列としてエンコードすべきです(SHOULD)。ゼロ長バイト文字列エンコーディングが推奨されるのは、短く、暗号計算のためのシリアル化構造で使用されるバージョンであるためです。受信者は、ゼロ長バイト文字列とバイト文字列でエンコードされたゼロ長マップの両方を受け入れなければなりません(MUST)。
エンコーディングをバイト文字列でラップすることで、保護されたマップが転送中に誤って変更されない可能性が高くなります。(行儀の悪い中間者はデコードして再エンコードできますが、再エンコードされたバイト文字列がデコードされたバイト文字列と同一でない限り、検証に失敗します。)これにより、すべての当事者が暗号操作への入力のためにマップの共通の正規エンコーディングを行うことができる必要があるという問題を回避できます。
unprotected(保護されていない): 暗号的に保護されていない現在のレイヤーに関するパラメータが含まれています。
現在のレイヤーを扱うヘッダーパラメータのみがそのレイヤーに配置されます。この例として、ヘッダーパラメータ「content type」は、メッセージで運ばれるメッセージの内容を記述します。そのため、このヘッダーパラメータはコンテンツレイヤーにのみ配置され、受信者または署名レイヤーには配置されません。原則として、他のレイヤーを参照せずに任意の特定のレイヤーを処理できる必要があります。COSE_Sign構造を除き、レイヤーをまたぐ必要があるデータは暗号化キーのみです。
バケットは、このドキュメントで定義されているすべてのセキュリティオブジェクトに存在します。フィールドは順に、「保護された」バケット(CBOR "bstr"タイプとして)、次に「保護されていない」バケット(CBOR "map"タイプとして)です。両方のバケットの存在は必須です。バケットに入るヘッダーパラメータは、IANA「COSE Header Parameters」レジストリ(セクション11.1)からのものです。いくつかのヘッダーパラメータは次のセクションで定義されています。
各マップ内のラベルは一意でなければなりません(MUST)。メッセージを処理するときに、ラベルが複数回表示される場合、メッセージは不正な形式として拒否されなければなりません(MUST)。アプリケーションは、同じラベルが保護されたヘッダーパラメータと保護されていないヘッダーパラメータの両方に現れないことを検証すべきです(SHOULD)。メッセージが不正な形式として拒否されない場合、属性は保護されたバケットから取得されなければならず(MUST)、属性が保護されたバケットに見つからない場合にのみ、その属性を保護されていないバケットから取得できます。
以下のCDDLフラグメントは、2つのヘッダーパラメータバケットを表しています。グループ「Headers」は、属性が配置される2つのバケットを表すCDDLで定義されています。このグループは、これら2つのフィールドをすべての場所で一貫して提供するために使用されます。一般的なヘッダーパラメータのマップを表すタイプも定義されています。
Headers = ( protected : empty_or_serialized_map, unprotected : header_map )
header_map = {
Generic_Headers,
* label => values
}
empty_or_serialized_map = bstr .cbor header_map / bstr .size 0
3.1. 一般的なCOSEヘッダーパラメータ
このセクションでは、一般的なヘッダーパラメータのセットを定義します。これらのヘッダーパラメータの概要は表3にあります。ラベルの値と値のタイプを決定するには、この表を参照する必要があります。
このセクションで定義されているヘッダーパラメータのセットは次のとおりです。
alg: このヘッダーパラメータは、セキュリティ処理に使用されるアルゴリズムを示すために使用されます。このヘッダーパラメータは、そうする機能が存在する場合、認証されなければなりません(MUST)。このサポートは、AEADアルゴリズムまたは構築(例:COSE_SignおよびCOSE_Mac0)によって提供されます。この認証は、ヘッダーパラメータを保護されたヘッダーパラメータバケットに配置するか、外部から提供されるデータ(セクション4.3)の一部として行うことができます。値は「COSE Algorithms」レジストリ([COSE.Algorithms]を参照)から取得されます。
crit: このヘッダーパラメータは、メッセージを処理しているアプリケーションが理解する必要がある保護されたヘッダーパラメータを示すために使用されます。このドキュメントで定義されているヘッダーパラメータは、すべての実装で理解される必要があるため、含める必要はありません。さらに、[RFC8152]で定義されているヘッダーパラメータ「counter signature」(ラベル7)は、そのドキュメントに準拠し、すべての実装がそれを理解すると仮定する送信者との互換性を維持するために、新しい実装で理解されなければなりません。存在する場合、「crit」ヘッダーパラメータは保護されたヘッダーパラメータバケットに配置されなければなりません(MUST)。配列には少なくとも1つの値が含まれていなければなりません(MUST)。
すべてのヘッダーパラメータラベルを「crit」ヘッダーパラメータに含める必要はありません。どのヘッダーパラメータを配列に配置するかを決定するためのルールは次のとおりです。
* 0〜7の範囲の整数ラベルは省略すべきです(SHOULD)。
* -1〜-128の範囲の整数ラベルは省略できます。アルゴリズムは、ラベルの内容を処理する能力がアルゴリズムの実装の中核であると考えられる場合に、この範囲のラベルを割り当てることができます。アルゴリズムは、この範囲外のラベルを割り当て、ラベルの内容を処理する能力がアルゴリズムの中核機能とは見なされないが、このインスタンスを正しく処理するために理解する必要がある場合に、それらを「crit」ヘッダーパラメータに含めることができます。-129〜-65536の範囲の整数ラベルは、一般的にサポートされていない可能性のあるあまり一般的でないヘッダーパラメータであるため、含めるべきです(SHOULD)。
* アプリケーションに必要なヘッダーパラメータのラベルは省略できます(MAY)。アプリケーションには、ラベルを省略できるかどうかを宣言するステートメントが必要です。
「crit」で示されるヘッダーパラメータは、セキュリティライブラリコードまたはセキュリティライブラリを使用するアプリケーションによって処理できます。唯一の要件は、ヘッダーパラメータが処理されることです。「crit」値リストに、ヘッダーパラメータが保護されたヘッダーパラメータバケットにないラベルが含まれている場合、これはメッセージの処理において致命的なエラーです。
content type: このヘッダーパラメータは、「payload」または「ciphertext」フィールド内のデータのコンテンツタイプを示すために使用されます。整数は「CoAP Content-Formats」IANAレジストリテーブル[COAP.Formats]からのものです。テキスト値は「<type-name>/<subtype-name>」の構文に従います。ここで、<type-name>と<subtype-name>は[RFC6838]のセクション4.2で定義されています。先頭と末尾の空白は許可されていません。テキストのコンテンツタイプ値は、パラメータとサブパラメータとともに、IANA「Media Types」レジストリを使用して特定できます。コンテンツ構造が曖昧になる可能性がある場合、アプリケーションはこのヘッダーパラメータを提供すべきです(SHOULD)。
kid: このヘッダーパラメータは、必要な暗号化キーを見つけるための入力として使用できる1つのデータを識別します。このヘッダーパラメータの値は、COSE_Key構造の「kid」メンバーと照合できます。他の鍵配布方法は、照合される同等のフィールドを定義できます。アプリケーションは、「kid」値が一意であると想定してはなりません(MUST NOT)。同じ「kid」値を持つ複数のキーが存在する可能性があるため、この「kid」に関連付けられたすべてのキーを確認する必要がある場合があります。「kid」値の内部構造は定義されておらず、アプリケーションはそれに依存できません。キー識別子の値は、どのキーを使用するかについてのヒントです。これはセキュリティクリティカルなフィールドではありません。このため、保護されていないヘッダーパラメータバケットに配置できます。
IV: このヘッダーパラメータは、初期化ベクトル(IV)値を保持します。一部の対称暗号化アルゴリズムでは、これはナンスと呼ばれる場合があります。AEおよびAEADアルゴリズムの場合、IVを変更すると復号化が失敗するため、IVは保護されていないバケットに配置できます。
Partial IV: このヘッダーパラメータは、IV値の一部を保持します。COSE_Encrypt0構造を使用する場合、IVの一部はキーに関連付けられたコンテキストの一部(Context IV)にすることができ、一部はメッセージごとに変更できます(Partial IV)。このフィールドは、メッセージごとにIVが変更される値を運ぶために使用されます。値を変更すると復号化によって文字化けとして容易に検出可能な平文が生成されるため、Partial IVは保護されていないバケットに配置できます。「Initialization Vector」と「Partial Initialization Vector」ヘッダーパラメータは、同じセキュリティレイヤーに両方存在してはなりません(MUST NOT)。
メッセージIVは次の手順で生成されます。
1. Partial IVをIVの長さ(アルゴリズムによって決定)までゼロで左パディングします。
2. パディングされたPartial IVとContext IVをXORします。
+=========+=======+========+=====================+==================+ | Name | Label | Value | Value Registry | Description | | | | Type | | | +=========+=======+========+=====================+==================+ | alg | 1 | int / | COSE Algorithms | Cryptographic | | | | tstr | registry | algorithm to use | +---------+-------+--------+---------------------+------------------+ | crit | 2 | [+ | COSE Header | Critical header | | | | label] | Parameters | parameters to be | | | | | registry | understood | +---------+-------+--------+---------------------+------------------+ | content | 3 | tstr / | CoAP Content- | Content type of | | type | | uint | Formats or Media | the payload | | | | | Types registries | | +---------+-------+--------+---------------------+------------------+ | kid | 4 | bstr | | Key identifier | +---------+-------+--------+---------------------+------------------+ | IV | 5 | bstr | | Full | | | | | | Initialization | | | | | | Vector | +---------+-------+--------+---------------------+------------------+ | Partial | 6 | bstr | | Partial | | IV | | | | Initialization | | | | | | Vector | +---------+-------+--------+---------------------+------------------+
表 3: 一般的なヘッダーパラメータ
このセクションで定義されているヘッダーパラメータのセットを表すCDDLフラグメントを以下に示します。各ヘッダーパラメータは、すべてのマップにある必要がないため、オプションとしてタグ付けされています。特定のマップで必要なヘッダーパラメータについては、上記で説明しています。
Generic_Headers = ( ? 1 => int / tstr, ; algorithm identifier ? 2 => [+label], ; criticality ? 3 => tstr / int, ; content type ? 4 => bstr, ; key identifier ? ( 5 => bstr // ; IV 6 => bstr ) ; Partial IV )