| RFC 9052 | COSE構造 | 2022年8月 |
| Schaad | 標準化過程 | [ページ] |
Concise Binary Object Representation(CBOR)は、小さなコードサイズと小さなメッセージサイズのために設計されたデータ形式です。このデータ形式について、基本的なセキュリティサービスを定義できる必要があります。本書は、CBOR Object Signing and Encryption(COSE)プロトコルを定義します。本仕様は、 シリアライズにCBORを使用して、署名、メッセージ認証コード、および暗号化を作成および処理する方法を 説明します。本仕様はさらに、CBORを使用して暗号鍵を表現する方法も説明します。¶
本書は、RFC 9053とともにRFC 8152を置き換えます。¶
これはインターネット標準化過程文書です。¶
本書は、Internet Engineering Task Force (IETF)の成果物です。これはIETFコミュニティの合意を表しています。公開レビューを 受けており、Internet Engineering Steering Group(IESG)によって 公開が承認されています。インターネット標準に関する詳細情報は、 RFC 7841のセクション2で入手できます。¶
本書の現在の状態、正誤表、およびフィードバックの提供方法に 関する情報は、 https://www.rfc-editor.org/info/rfc9052で入手できます。¶
Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
モノのインターネット(IoT)を構成する、小型で制約のあるデバイスへの注目が 高まっています。この過程から生まれた標準の1つが「Concise Binary Object Representation(CBOR)」[STD94]です。CBORは、 JavaScript Object Notation(JSON)[STD90]の データモデルを、バイナリデータを許容することなどによって拡張しました。CBORは、IoTの世界を扱う IETFの複数のワーキンググループで、データ構造を符号化する方法として採用されています。CBORは、 転送されるメッセージと実装サイズの両方を小さくし、スキーマ不要のデコーダーを持つように 特に設計されました。IoTにメッセージセキュリティサービスを提供する必要があり、CBORを メッセージ符号化形式として使用することには意味があります。¶
JOSEワーキンググループは、JSONを使用して暗号化、署名、および Message Authentication Code(MAC)操作を処理する方法と鍵を符号化する方法を規定した 一連の文書 [RFC7515] [RFC7516] [RFC7517] [RFC7518]を作成しました。本書は、CBOR符号化形式について 同じことを行うCBOR Object Signing and Encryption(COSE)標準を定義します。本書は、 初期のアルゴリズムセットを提供する[RFC9053]と 組み合わせて使用されます。元のJSON Object Signing and Encryption(JOSE)文書の 趣旨を維持するよう強く試みていますが、次の2つの点を考慮しています。¶
本書には次の内容が含まれています。¶
本書には、特定の暗号アルゴリズムを使用するための規則および手順は含まれていません。 特定のアルゴリズムの詳細は、[RFC9053]および[RFC8230]にあります。 追加アルゴリズムの詳細は、将来の文書で定義されることが期待されています。¶
COSEは当初、Constrained RESTful Environments(CoRE)にセキュリティを提供するための解決策の一部として設計され、これは [RFC8613]および [CORE-GROUPCOMM]を使用して行われます。 しかし、COSEはこれらのケースだけに限定されず、セキュリティサービスを提供する目的で JOSEまたはCryptographic Message Syntax(CMS)[RFC5652]のいずれかを検討するような任意の場所で使用できます。 COSEは、JOSEおよびCMSと同様に、ストアアンドフォワードまたはオフラインプロトコルでのみ 使用されます。暗号化を必要とするオンラインプロトコルでCOSEを使用する場合は、オブジェクトを やり取りする前に、オンライン鍵確立プロセスを実行する必要があります。セキュリティサービスのために COSEを使用するアプリケーションは、まず必要なセキュリティサービスを決定し、その必要性に基づいて 適切なCOSE構造と暗号アルゴリズムを選択する必要があります。 セクション10では、COSEを使用するときに アプリケーションが指定する必要のある事項について追加情報を提供します。¶
CMSには存在するが本標準には存在しない機能の1つに、ダイジェスト構造があります。 この省略は意図的なものです。 プロトコルごとに構造に含めたいフィールドの集合が異なるため、構造は各プロトコルで 定義される方が望ましいです。 アルゴリズム識別子とダイジェスト値はすべてのアプリケーションに共通しますが、アルゴリズムが 複数の値を伴って一度だけ定義される場合があるため、この2つの値が常に隣接しているとは限りません。 アプリケーションは、構造の一部として追加のデータフィールドを定義したい場合もあります。 そのようなアプリケーション固有要素の1つとして、ハッシュされているデータを取得できる場所への URIまたはその他のポインターを含めることが考えられます。 [RFC9054]には、そのような可能な構造の1つが 含まれており、ダイジェストアルゴリズムのセットを定義しています。¶
COSEをインターネット標準へ進める過程で、COSE_Sign1構造に対する副署名の セキュリティ特性の説明が正しくないことに気づきました。 説明されていたセキュリティ特性、すなわち真の副署名のセキュリティ特性が、ワーキンググループの 望むものであったため、本書から副署名に関するすべての本文を削除し、新しい文書 [COSE-COUNTERSIGN]を作成して、古い副署名アルゴリズムと ヘッダーパラメータを非推奨にするとともに、望ましいセキュリティ特性を持つ新しいアルゴリズムと ヘッダーパラメータを定義することが決定されました。¶
本書におけるキーワード「MUST」、「MUST NOT」、 「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「NOT RECOMMENDED」、「MAY」、および 「OPTIONAL」は、ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174]に記述されるとおりに解釈されます。¶
COSEが最初に書かれた時点では、Concise Data Definition Language(CDDL)[RFC8610]はまだ RFCとして公開されていなかったため、COSEで用いられるCBORデータ構造を規範的に 記述するデータ記述言語として使用することはできませんでした。 そのため、ここで定義されるCBORデータオブジェクトは散文で記述されています。 COSEデータオブジェクトの追加の(非規範的な)記述は、以下で説明するCDDLの サブセットで提供されています。¶
本書は、まず文法に取り組み、その後それに伴う散文を作成することで開発されました。 その副産物として、散文はConcise Data Definition Language(CDDL) [RFC8610]によって定義されたプリミティブ型文字列を使用して 書かれています。本仕様では、次のプリミティブ型が使用されます。¶
本書では、CDDLの3つの構文が省略記法として現れます。それらは次のとおりです。¶
CDDLによって定義される制約のうち2つも本書で使用されます。それらは次のとおりです。¶
散文による説明に加えて、CBORデータ構造の文法が、前述のCDDLサブセットで提示されます。 CDDL文法は参考情報であり、散文による説明が規範的です。¶
集約されたCDDLは、以下のXPath式によって本書のXML版から抽出できます。 (使用しているXPath評価器によっては、>をエンティティとして扱う必要がある場合があります。)¶
//sourcecode[@type='cddl']/text()¶
CDDLは、最初の非終端記号がファイル内の最初の記号であることを 期待します。このため、CDDLの最初の断片をここに示します。¶
start = COSE_Messages / COSE_Key / COSE_KeySet / Internal_Types ; This is defined to make the tool quieter: Internal_Types = Sig_structure / Enc_structure / MAC_structure¶
非終端記号Internal_Typesは、本書の作成中に使用された自動検証ツールを 扱うために定義されています。これは、セキュリティ計算で使用されるが転送用には出力されない 非終端記号を参照します。¶
JSONでは、マップはオブジェクトと呼ばれ、マップキーはテキスト文字列という 1種類だけです。COSEでは、テキスト文字列、負の整数、および符号なし整数をマップキーとして 使用します。整数は、符号化のコンパクトさと比較の容易さのために使用されます。テキスト文字列を 含めることで、短い符号化値の追加範囲も使用できるようになります。「key」という語は主に 暗号鍵という別の意味で使用されるため、このマップキーとしての用途については「label」という 用語を使用します。¶
本仕様で定義されるCBORマップにおいて、テキスト文字列でも整数でもないラベルが存在することは エラーです。 アプリケーションは、処理に失敗することも、不正なラベルを無視してメッセージを処理することもできます。 しかし、不正なラベルを持つメッセージを作成してはMUST NOTです。¶
CDDL文法断片は、前の段落で述べた非終端記号「label」と、 任意の値の使用を許す「values」を定義します。¶
label = int / tstr values = any¶
本書では、次の用語を使用します。¶
「Context」は、本書全体を通して、COSEメッセージの一部ではない情報を表すために使用されます。 contextの一部である情報は、プロトコル相互作用、関連する鍵構造、およびプログラム設定を含む 複数の異なるソースから来る可能性があります。 使用するcontextは暗黙的なものでも、[RFC8613]で 定義される「kid context」ヘッダーパラメータを使用して識別されるものでも、プロトコル固有の 識別子によって識別されるものでもかまいません。 Contextは一般に暗号構築に含めるべきです。詳細については、セクション4.3を参照してください。¶
「byte string」という用語はバイト列に対して使用され、「text string」という用語は文字列に対して使用されます。¶
COSEオブジェクト構造は、さまざまな種類のセキュリティメッセージを解析および処理するときに 大量の共通コードを使用できるように設計されています。 すべてのメッセージ構造はCBOR配列型の上に構築されます。 配列の最初の3つの要素は、常に同じ情報を含みます。¶
この時点以降の要素は、特定のメッセージ型に依存します。¶
COSEメッセージは、異なる種類の暗号概念を分離するためにレイヤーの概念を 使用して構築されます。これがどのように機能するかの例として、COSE_Encryptメッセージ(セクション5.1)を考えます。このメッセージ型は、 コンテンツレイヤーと受信者レイヤーの2つのレイヤーに分けられます。コンテンツレイヤーは、 暗号化された平文と暗号化メッセージに関する情報を含みます。受信者レイヤーは、各受信者について、 暗号化されたコンテンツ暗号化鍵(CEK)と、それがどのように暗号化されているかに関する情報を含みます。 CEKが事前共有されている場合のために、暗号化メッセージの単一レイヤー版COSE_Encrypt0 (セクション5.2)が提供されています。¶
提示されたメッセージの型の識別は、次の方法によって行われます。¶
| CBORタグ | cose-type | データ項目 | 意味 |
|---|---|---|---|
| 98 | cose-sign | COSE_Sign | COSE署名済みデータオブジェクト |
| 18 | cose-sign1 | COSE_Sign1 | COSE単一署名者データオブジェクト |
| 96 | cose-encrypt | COSE_Encrypt | COSE暗号化データオブジェクト |
| 16 | cose-encrypt0 | COSE_Encrypt0 | COSE単一受信者暗号化データオブジェクト |
| 97 | cose-mac | COSE_Mac | COSE MACedデータオブジェクト |
| 17 | cose-mac0 | COSE_Mac0 | 受信者なしCOSE Macオブジェクト |
| メディア型 | 符号化 | ID | 参照 |
|---|---|---|---|
| application/cose; cose-type="cose-sign" | 98 | RFC 9052 | |
| application/cose; cose-type="cose-sign1" | 18 | RFC 9052 | |
| application/cose; cose-type="cose-encrypt" | 96 | RFC 9052 | |
| application/cose; cose-type="cose-encrypt0" | 16 | RFC 9052 | |
| application/cose; cose-type="cose-mac" | 97 | RFC 9052 | |
| application/cose; cose-type="cose-mac0" | 17 | RFC 9052 | |
| application/cose-key | 101 | RFC 9052 | |
| application/cose-key-set | 102 | RFC 9052 |
次のCDDL断片は、本書で定義されるすべてのトップレベルメッセージを識別します。 メッセージのタグ付き版とタグなし版について、個別の非終端記号が定義されています。¶
COSE_Messages = COSE_Untagged_Message / COSE_Tagged_Message
COSE_Untagged_Message = COSE_Sign / COSE_Sign1 /
COSE_Encrypt / COSE_Encrypt0 /
COSE_Mac / COSE_Mac0
COSE_Tagged_Message = COSE_Sign_Tagged / COSE_Sign1_Tagged /
COSE_Encrypt_Tagged / COSE_Encrypt0_Tagged /
COSE_Mac_Tagged / COSE_Mac0_Tagged
¶
COSEの構造は、ペイロード自体の一部とは見なされないものの、コンテンツ、 アルゴリズム、鍵、またはレイヤー処理のための評価ヒントに関する情報を保持するために使用される 2つの情報バケットを持つように設計されています。これら2つのバケットは、鍵を除くすべての構造で 使用できます。これらのバケットは存在しますが、すべてのインスタンスで常に使用可能とは限りません。 たとえば、保護バケットは受信者構造の一部として定義されていますが、受信者構造で使用される 一部のアルゴリズムは認証データを提供しません。その場合、保護バケットは空のままになります。¶
両方のバケットはCBORマップとして実装されます。マップキーは「label」 (セクション1.5)です。値の部分はラベルの定義に依存します。両方の マップは、同じラベル/値ペアの集合を使用します。ラベルの整数値およびテキスト文字列値は、 標準範囲、私的使用範囲、および選択されたアルゴリズムに依存する範囲を含む複数の区分に 分けられています。定義されたラベルは、IANAの「COSE Header Parameters」レジストリ (セクション11.1)にあります。¶
2つのバケットは次のとおりです。¶
暗号的に保護される現在のレイヤーに関するパラメータを含みます。 暗号計算に含められない場合、このバケットは空でなければMUSTなりません。 このバケットは、メッセージ内でバイナリオブジェクトとして符号化されます。 この値は、保護マップをCBOR符号化し、それをbstrオブジェクトでラップすることによって取得されます。 送信者は、ゼロ長マップをゼロ長マップ(h'a0'として符号化)としてではなく、ゼロ長バイト文字列として 符号化すべきSHOULDです。 ゼロ長バイト文字列符号化は、より短く、暗号計算のためのシリアライズ構造で使用される バージョンでもあるため、推奨されます。 受信者は、ゼロ長バイト文字列と、バイト文字列内に符号化されたゼロ長マップの両方を 受け入れなければMUSTなりません。¶
符号化をバイト文字列でラップすることで、保護マップが転送中に偶発的に変更されにくい状態で 転送される可能性が高まります。 (行儀の悪い中継者がデコードして再エンコードすることはできますが、再エンコードされたバイト文字列が デコードされたバイト文字列と同一でない限り、検証は失敗します。) これにより、暗号操作への入力としてマップの共通の正準符号化をすべての当事者が実行できる 必要があるという問題を回避します。¶
現在のレイヤーを扱うヘッダーパラメータだけが、そのレイヤーに配置されます。この例として、 ヘッダーパラメータ「content type」は、メッセージ内で運ばれるメッセージの内容を記述します。 そのため、このヘッダーパラメータはコンテンツレイヤーにのみ配置され、受信者レイヤーまたは署名レイヤーには 配置されません。原則として、ある任意のレイヤーは他のレイヤーを参照せずに処理できるべきです。 COSE_Sign構造を除き、レイヤーをまたいで必要となる唯一のデータは暗号鍵です。¶
これらのバケットは、本書で定義されるすべてのセキュリティオブジェクトに存在します。フィールドは順に、 「protected」バケット(CBORの「bstr」型として)、次に「unprotected」バケット(CBORの 「map」型として)です。両方のバケットの存在は必須です。バケットに入るヘッダーパラメータは、 IANAの「COSE Header Parameters」レジストリ(セクション 11.1)に由来します。 一部のヘッダーパラメータは次のセクションで定義されます。¶
各マップ内のラベルは一意でなければMUSTなりません。 メッセージを処理するときに、ラベルが複数回現れる場合、そのメッセージは不正形式として 拒否されなければMUSTなりません。アプリケーションは、同じラベルが 保護ヘッダーパラメータと非保護ヘッダーパラメータの両方に現れないことを検証すべき SHOULDです。メッセージが不正形式として拒否されない場合、 属性は保護バケットから取得されなければMUSTならず、保護バケットに 属性が見つからない場合にのみ、その属性を非保護バケットから取得できます。¶
次のCDDL断片は、2つのヘッダーパラメータバケットを表します。CDDLでは、 属性が配置される2つのバケットを表すグループ「Headers」が定義されています。このグループは、 すべての場所でこれら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にあります。 ラベルの値と値の型を判断するには、この表を参照すべきです。¶
このセクションで定義されるヘッダーパラメータの集合は次のとおりです。¶
このヘッダーパラメータは、メッセージを処理する アプリケーションが理解する必要のある保護ヘッダーパラメータを示すために使用されます。 本書で定義されるヘッダーパラメータは、すべての実装が理解すべきであるため、 含める必要はありません。さらに、[RFC8152]によって定義されたヘッダーパラメータ 「counter signature」(ラベル7)は、その文書に従い、すべての実装がそれを 理解すると仮定する送信者との互換性を維持するため、新しい実装で理解されなければなりません。 存在する場合、「crit」ヘッダーパラメータはprotected-header-parametersバケットに 配置されなければMUSTなりません。配列には少なくとも 1つの値が含まれていなければMUSTなりません。¶
すべてのヘッダーパラメータラベルを「crit」ヘッダーパラメータに含める必要はありません。 配列にどのヘッダーパラメータを配置するかを決定する規則は次のとおりです。¶
「crit」によって示されるヘッダーパラメータは、セキュリティライブラリコードによって処理することも、 セキュリティライブラリを使用するアプリケーションによって処理することもできます。唯一の要件は、 そのヘッダーパラメータが処理されることです。「crit」値リストが、 protected-header-parametersバケットに存在しないヘッダーパラメータのラベルを含む場合、 これはメッセージ処理における致命的エラーです。¶
このヘッダーパラメータはIV値の一部を保持します。 COSE_Encrypt0構造を使用するとき、IVの一部は鍵に関連付けられたcontextの一部 (Context IV)であり、別の一部は各メッセージで変更できます(Partial IV)。 このフィールドは、各メッセージでIVを変更させる値を運ぶために使用されます。 値を変更すると、復号によって明らかに破損していると検出しやすい平文が得られるため、 Partial IVは非保護バケットに配置できます。 「Initialization Vector」および「Partial Initialization Vector」ヘッダーパラメータは、 同じセキュリティレイヤー内に両方存在してはMUST NOTなりません。¶
メッセージIVは次の手順で生成されます。¶
| 名前 | ラベル | 値型 | 値レジストリ | 説明 |
|---|---|---|---|---|
| alg | 1 | int / tstr | COSE Algorithms registry | 使用する暗号アルゴリズム |
| crit | 2 | [+ label] | COSE Header Parameters registry | 理解されるべき重要な ヘッダーパラメータ |
| content type | 3 | tstr / uint | CoAP Content-FormatsまたはMedia Types registries | ペイロードのコンテンツ型 |
| kid | 4 | bstr | 鍵識別子 | |
| IV | 5 | bstr | 完全なInitialization Vector | |
| Partial IV | 6 | bstr | 部分的なInitialization Vector |
このセクションで定義されるヘッダーパラメータの集合を表す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
)
¶
COSEは2つの異なる署名構造をサポートします。COSE_Signでは、同じ内容に1つ以上の 署名を適用できます。COSE_Sign1は単一の署名者に限定されます。これらの構造は相互に変換できません。 署名計算には、どの構造が使用されているかを識別するパラメータが含まれるため、変換された構造は署名検証に失敗します。¶
COSE_Sign構造では、メッセージペイロードに1つ以上の署名を適用できます。 内容に関連するヘッダーパラメータと、署名に関連するヘッダーパラメータは、署名自体とともに運ばれます。 これらのヘッダーパラメータは署名によって認証される場合も、単に存在するだけの場合もあります。 内容に関するヘッダーパラメータの例として、content typeヘッダーパラメータがあります。 署名に関するヘッダーパラメータの例としては、署名を作成するために使用されたアルゴリズムと鍵があります。¶
複数の署名が存在する場合、ある署名者に関連付けられた1つの署名の検証が成功すれば、通常はその署名者による 署名として成功したものと扱われます。しかし、別の規則が必要となるアプリケーション環境もあります。 各署名者について1つの有効な署名という規則以外を採用するアプリケーションは、その規則を指定しなければなりません。 また、署名者識別子の単純な照合だけでは、署名が同じ署名者によって生成されたかどうかを判断するのに十分でない場合、 アプリケーション仕様は、どの署名が同じ署名者によって生成されたかを判断する方法を記述しなければなりません。 署名者が複数の署名を含める主な理由は、異なる受信者コミュニティをサポートすることです。¶
たとえば、COSE_Sign構造には、Edwards曲線 Digital Signature Algorithm(EdDSA)[RFC8032] とElliptic Curve Digital Signature Algorithm(ECDSA)[DSS]で生成された署名を含めることができます。これにより、受信者は 一方または他方のアルゴリズムに関連付けられた署名を検証できます。複数署名の評価に関するより詳細な情報は [RFC5752]にあります。¶
署名構造は、それが使用されるcontextに応じて、タグ付きまたはタグなしのいずれかとして 符号化できます。タグ付きCOSE_Sign構造はCBORタグ98によって識別されます。これを表すCDDL断片は次のとおりです。¶
COSE_Sign_Tagged = #6.98(COSE_Sign)¶
COSE署名付きメッセージは2つの部分で定義されます。本文とメッセージに関する情報を運ぶ CBORオブジェクトはCOSE_Sign構造と呼ばれます。署名と署名に関する情報を運ぶCBORオブジェクトは COSE_Signature構造と呼ばれます。COSE署名付きメッセージの例はAppendix C.1にあります。¶
COSE_Sign構造はCBOR配列です。配列のフィールドは順に次のとおりです。¶
このフィールドは、署名されるシリアライズされた内容を含みます。 payloadがメッセージ内に存在しない場合、アプリケーションはpayloadを別途提供する必要があります。 payloadは、変更されずに転送されることを保証するためにbstrでラップされます。 payloadが別途転送される(「detached content」)場合、この位置にはnil CBORオブジェクトが配置され、 それが変更されずに転送されることを保証する責任はアプリケーションにあります。¶
注: メッセージ復元アルゴリズムを伴う署名が使用される場合(セクション8.1)、復元できる最大バイト数は元のpayloadの長さです。 符号化されたpayloadのサイズは、復元されるバイト数だけ減少します。 元のpayloadのすべてのバイトが消費される場合、転送されるpayloadは存在しないものとしてではなく、 ゼロ長バイト文字列として符号化されます。¶
COSE_Signについて上記の本文を表すCDDL断片は次のとおりです。¶
COSE_Sign = [
Headers,
payload : bstr / nil,
signatures : [+ COSE_Signature]
]
¶
COSE_Signature構造はCBOR配列です。配列のフィールドは順に次のとおりです。¶
COSE_Signatureについて上記の本文を表すCDDL断片は次のとおりです。¶
COSE_Signature = [
Headers,
signature : bstr
]
¶
COSE_Sign1署名構造は、メッセージに配置される署名が1つだけの場合に使用されます。 内容と署名を扱うヘッダーパラメータは、COSE_Signのように分離されるのではなく、同じ一対のバケットに配置されます。¶
この構造は、それが使用されるcontextに応じて、タグ付きまたはタグなしのいずれかとして 符号化できます。タグ付きCOSE_Sign1構造はCBORタグ18によって識別されます。これを表すCDDL 断片は次のとおりです。¶
COSE_Sign1_Tagged = #6.18(COSE_Sign1)¶
本文、署名、および本文と署名に関する情報を運ぶCBORオブジェクトは COSE_Sign1構造と呼ばれます。COSE_Sign1メッセージの例はAppendix C.2にあります。¶
COSE_Sign1構造はCBOR配列です。配列のフィールドは順に次のとおりです。¶
COSE_Sign1について上記の本文を表すCDDL断片は次のとおりです。¶
COSE_Sign1 = [
Headers,
payload : bstr / nil,
signature : bstr
]
¶
COSEで提供される機能の1つに、アプリケーションが、認証されるべきだがCOSEオブジェクトの一部として 運ばれない追加データを提供できる機能があります。 これをサポートする主な理由は、CoAPメッセージ構造 [RFC7252]を見ると分かります。そこでは、 payloadの前にoptionを運ぶ機能が存在します。 この位置に配置できるデータの例として、CoAPコードまたはCoAP optionがあります。 データがCoAPメッセージのヘッダー内にある場合、それはプロキシがプロキシ処理を行う際に利用できます。 たとえば、Accept optionは、適切な値がプロキシのキャッシュにあるかどうかを判断するために プロキシで使用できます。 送信者はadditional-data機能を使用して、プロキシまたは攻撃者によって行われたAccept値の集合への 変更を検出できるようにできます。このフィールドを外部から提供されるデータに含めることで、 その後の変更は、サーバーのメッセージ処理を失敗させます。¶
本書は、外部から提供される認証済みデータのバイト配列を使用するためのプロセスを説明します。 バイト配列を構築する方法は、アプリケーションの関数です。 この機能を使用するアプリケーションは、外部から提供される認証済みデータをどのように構築するかを 定義する必要があります。このような構築では、次の問題を考慮する必要があります。¶
署名を作成するには、明確に定義されたバイト文字列が必要です。 Sig_structureは正準形式を作成するために使用されます。 この署名および検証プロセスは、本文情報(COSE_SignまたはCOSE_Sign1)、 署名者情報(COSE_Signature)、およびアプリケーションデータ(外部ソース)を入力として取ります。 Sig_structureはCBOR配列です。 Sig_structureのフィールドは順に次のとおりです。¶
署名のcontextを識別するcontextテキスト文字列。contextテキスト文字列は次のとおりです。¶
上記の本文を記述するCDDL断片は次のとおりです。¶
Sig_structure = [
context : "Signature" / "Signature1",
body_protected : empty_or_serialized_map,
? sign_protected : empty_or_serialized_map,
external_aad : bstr,
payload : bstr
]
¶
署名を計算する方法は次のとおりです。¶
署名を検証する手順は次のとおりです。¶
署名検証の実行に加えて、アプリケーションは、その鍵が署名主体と正しく対応していること、および 操作を実行する前に署名主体が権限を付与されていることを保証するための適切なチェックを行います。¶
COSEは2つの異なる暗号化構造をサポートします。 COSE_Encrypt0は、使用される鍵が暗黙的に既知であるため受信者構造が不要な場合に使用されます。 COSE_Encryptはそれ以外の場合に使用されます。 これには、複数の受信者が存在する場合、またはdirect(すなわち、事前共有秘密)以外の 受信者アルゴリズムが使用される場合が含まれます。¶
エンベロープ化構造では、メッセージの1人以上の受信者を扱うことができます。 内容に関するヘッダーパラメータと、受信者情報に関するヘッダーパラメータをメッセージ内で運ぶための 規定があります。内容に関連付けられた保護ヘッダーパラメータは、コンテンツ暗号化アルゴリズムによって 認証されます。受信者に関連付けられた保護ヘッダーパラメータは、アルゴリズムがそれをサポートする場合、 受信者アルゴリズムによって認証されます。内容に関するヘッダーパラメータの例として、内容の型と コンテンツ暗号化アルゴリズムがあります。受信者に関するヘッダーパラメータの例として、受信者の鍵識別子と 受信者の暗号化アルゴリズムがあります。¶
平文と鍵の両方を暗号化するために、同じ技法とほぼ同じ構造が使用されます。 これは、「Cryptographic Message Syntax(CMS)」[RFC5652]と「JSON Web Encryption(JWE)」 [RFC7516]の両方で使用されるアプローチとは異なります。 そこでは、コンテンツレイヤーと受信者レイヤーに異なる構造が使用されます。 2つの構造が定義されています。暗号化された内容を保持するCOSE_Encryptと、受信者用の 暗号化された鍵を保持するCOSE_recipientです。 エンベロープ化メッセージの例はAppendix C.3にあります。¶
COSE_Encrypt構造は、それが使用されるcontextに応じて、タグ付きまたはタグなしのいずれかとして 符号化できます。タグ付きCOSE_Encrypt構造はCBORタグ96によって識別されます。これを表すCDDL断片は次のとおりです。¶
COSE_Encrypt_Tagged = #6.96(COSE_Encrypt)¶
COSE_Encrypt構造はCBOR配列です。配列のフィールドは順に次のとおりです。¶
上記の本文に対応するCDDL断片は次のとおりです。¶
COSE_Encrypt = [
Headers,
ciphertext : bstr / nil,
recipients : [+COSE_recipient]
]
¶
COSE_recipient構造はCBOR配列です。配列のフィールドは順に次のとおりです。¶
COSE_recipientについて上記の本文に対応するCDDL断片は次のとおりです。¶
COSE_recipient = [
Headers,
ciphertext : bstr / nil,
? recipients : [+COSE_recipient]
]
¶
暗号化メッセージは、暗号化された内容と、1人以上の受信者向けに暗号化されたCEKから構成されます。 CEKは、各受信者に固有の鍵を使用して、各受信者向けに暗号化されます。 この暗号化の詳細は、受信者アルゴリズムがどのクラスに属するかに依存します。 各クラスの具体的な詳細はセクション8.5にあります。 5つのコンテンツ鍵配布方式の短い概要は次のとおりです。¶
COSE_Encrypt0暗号化構造には、メッセージの受信者を指定する機能はありません。 この構造は、オブジェクトの受信者が、メッセージを復号するために使用する鍵の識別情報をすでに 知っていることを前提としています。鍵を受信者に識別させる必要がある場合は、エンベロープ化構造を 使用するのが望ましいです。¶
暗号化メッセージの例はAppendix C.4にあります。¶
COSE_Encrypt0構造は、それが使用されるcontextに応じて、タグ付きまたはタグなしの いずれかとして符号化できます。タグ付きCOSE_Encrypt0構造はCBORタグ16によって識別されます。 これを表すCDDL断片は次のとおりです。¶
COSE_Encrypt0_Tagged = #6.16(COSE_Encrypt0)¶
COSE_Encrypt0構造はCBOR配列です。配列のフィールドは順に次のとおりです。¶
上記の本文に対応するCOSE_Encrypt0のCDDL断片は次のとおりです。¶
COSE_Encrypt0 = [
Headers,
ciphertext : bstr / nil,
]
¶
AEADアルゴリズムの暗号化アルゴリズムはかなり単純です。最初の手順は、 認証済みデータ構造のための一貫したバイト文字列を作成することです。この目的のために、 Enc_structureを使用します。Enc_structureはCBOR配列です。Enc_structureのフィールドは順に 次のとおりです。¶
認証済みデータ構造のcontextを識別するcontextテキスト文字列。 contextテキスト文字列は次のとおりです。¶
上記の本文を記述するCDDL断片は次のとおりです。¶
Enc_structure = [
context : "Encrypt" / "Encrypt0" / "Enc_Recipient" /
"Mac_Recipient" / "Rec_Recipient",
protected : empty_or_serialized_map,
external_aad : bstr
]
¶
メッセージを暗号化する方法は次のとおりです。¶
暗号化鍵(K)を決定します。この手順は、使用される 受信者アルゴリズムのクラスに依存します。以下の場合です。¶
メッセージを復号する方法は次のとおりです。¶
復号鍵を決定します。この手順は、使用される受信者アルゴリズムの クラスに依存します。以下の場合です。¶
メッセージを暗号化する方法は次のとおりです。¶
暗号化鍵を決定します。この手順は、使用される受信者アルゴリズムの クラスに依存します。以下の場合です。¶
メッセージを復号する方法は次のとおりです。¶
復号鍵を決定します。この手順は、使用される受信者アルゴリズムの クラスに依存します。以下の場合です。¶
COSEは2つの異なるMAC構造をサポートします。 COSE_Mac0は、使用される鍵が暗黙的に既知であるため受信者構造が不要な場合に使用されます。 COSE_Macはそれ以外のすべての場合に使用されます。 これには、複数の受信者が必要な場合、鍵が不明な場合、またはdirect以外の受信者アルゴリズムが 使用される場合が含まれます。¶
このセクションでは、COSEでMAC認証を行うときに使用される構造と方法を説明します。 本書は、暗号化で許可されるものと同じすべてのクラスの受信者アルゴリズムの使用を許可します。¶
MAC操作を使用できるモードは2つあります。第1のモードは、MACが計算されて以降、 内容が変更されていないことだけを確認するものです。この目的には任意のクラスの受信者アルゴリズムを 使用できます。第2のモードは、MACが計算されて以降、内容が変更されていないことを確認し、さらに 受信者アルゴリズムを使用して誰がそれを送信したかを検証するものです。これをサポートする受信者 アルゴリズムのクラスは、事前共有秘密を使用するもの、またはStatic-Static(SS)鍵共有を行うもの (key wrap手順なし)です。これらのいずれの場合も、メッセージMACを作成して送信した実体を検証できます。 (送信者に関するこの知識は、関与する当事者が2者だけであり、かつ自分自身にメッセージを送信していないことを 前提としています。)originatingの特性は、両方のMACメッセージ構造で取得できます。¶
複数受信者のMACedメッセージは、本文を運ぶためにこのセクションで定義される COSE_Mac構造と、MAC計算に使用される鍵を保持するためのCOSE_recipient構造(セクション5.1)という2つの構造を使用します。 MACedメッセージの例はAppendix C.5にあります。¶
MAC構造は、それが使用されるcontextに応じて、タグ付きまたはタグなしのいずれかとして 符号化できます。タグ付きCOSE_Mac構造はCBORタグ97によって識別されます。これを表すCDDL断片は 次のとおりです。¶
COSE_Mac_Tagged = #6.97(COSE_Mac)¶
COSE_Mac構造はCBOR配列です。配列のフィールドは順に次のとおりです。¶
COSE_Macについて上記の本文を表すCDDL断片は次のとおりです。¶
COSE_Mac = [ Headers, payload : bstr / nil, tag : bstr, recipients : [+COSE_recipient] ]¶
このセクションでは、受信者が暗黙的に既知である場合にMAC認証を行うときに 使用される構造と方法を説明します。¶
MACedメッセージは、本文を運ぶためにこのセクションで定義される COSE_Mac0構造を使用します。暗黙鍵を用いるMACedメッセージの例はAppendix C.6にあります。¶
MAC構造は、それが使用されるcontextに応じて、タグ付きまたはタグなしのいずれかとして 符号化できます。タグ付きCOSE_Mac0構造はCBORタグ17によって識別されます。これを表すCDDL 断片は次のとおりです。¶
COSE_Mac0_Tagged = #6.17(COSE_Mac0)¶
COSE_Mac0構造はCBOR配列です。配列のフィールドは順に次のとおりです。¶
上記の本文に対応するCDDL断片は次のとおりです。¶
COSE_Mac0 = [ Headers, payload : bstr / nil, tag : bstr, ]¶
認証されるデータの一貫した符号化を得るために、MAC_structureが正準形式を 作成するために使用されます。MAC_structureはCBOR配列です。MAC_structureのフィールドは順に次のとおりです。¶
上記の本文に対応するCDDL断片は次のとおりです。¶
MAC_structure = [
context : "MAC" / "MAC0",
protected : empty_or_serialized_map,
external_aad : bstr,
payload : bstr
]
¶
MACを計算する手順は次のとおりです。¶
MACを検証する手順は次のとおりです。¶
COSE Key構造はCBORマップ上に構築されます。COSE Keyに現れる可能性のある 共通パラメータの集合は、IANAの「COSE Key Common Parameters」レジストリ[COSE.KeyParameters]にあります(セクション11.2を参照)。特定の鍵型向けに定義された 追加パラメータは、IANAの「COSE Key Type Parameters」レジストリ[COSE.KeyTypes]にあります。¶
COSE Key Setは、その基礎となる型としてCBOR配列オブジェクトを使用します。配列 要素の値はCOSE Keysです。COSE Key Setは、配列内に少なくとも1つの要素を持たなければ MUSTなりません。COSE Key Setsの例はAppendix C.7にあります。¶
COSE Key Set内の各要素は独立に処理されなければMUST なりません。COSE Key Set内の1つの要素が不正形式であるか、アプリケーションが理解しない鍵を 使用している場合、その鍵は無視され、他の鍵は通常どおり処理されます。¶
要素「kty」は、COSE_Keyマップ内の必須要素です。¶
COSE_KeyおよびCOSE_KeySetを記述するCDDL文法は次のとおりです。¶
COSE_Key = {
1 => tstr / int, ; kty
? 2 => bstr, ; kid
? 3 => tstr / int, ; alg
? 4 => [+ (tstr / int) ], ; key_ops
? 5 => bstr, ; Base IV
* label => values
}
COSE_KeySet = [+COSE_Key]
¶
本文書は、COSE Keyオブジェクトの共通パラメータの集合を定義します。表4は、このセクションで定義されるパラメータの概要を 提供します。特定の鍵型向けに定義されるパラメータもあります。 鍵型固有のパラメータは[RFC9053]にあります。¶
| 名前 | ラベル | CBOR型 | 値レジストリ | 説明 |
|---|---|---|---|---|
| kty | 1 | tstr / int | COSE Key Types | 鍵型の識別 |
| kid | 2 | bstr | 鍵識別値 -- メッセージ内の 「kid」と照合 | |
| alg | 3 | tstr / int | COSE Algorithms | このアルゴリズムへの鍵使用制限 |
| key_ops | 4 | [+ (tstr/int)] | 許可される操作の集合を制限 | |
| Base IV | 5 | bstr | Partial IVとxorされるBase IV |
このパラメータは、IVの基底部分を運ぶために定義されています。 これは、セクション3.1で定義される Partial IVヘッダーパラメータとともに使用されるように設計されています。このフィールドは、 鍵にBase IVを関連付け、その後、メッセージごとにPartial IVで変更できるようにします。¶
アプリケーションでBase IVを使用するときは、極めて慎重に扱う必要があります。 多くの暗号化アルゴリズムは、同じIVが2回使用されるとセキュリティを失います。¶
送信者ごとに異なる鍵が導出される場合、同じBase IVから開始しても、この条件を満たす可能性が高いです。 同じ鍵が複数の送信者に使用される場合、アプリケーションは送信者間でIV空間を分割する方法を 提供する必要があります。 これは、開始する異なる基点、または開始用の異なるPartial IVを提供し、鍵更新前に送信される メッセージ数を制限することで行えます。¶
| 名前 | 値 | 説明 |
|---|---|---|
| sign | 1 | 鍵は署名の作成に使用されます。 秘密鍵フィールドが必要です。 |
| verify | 2 | 鍵は署名の検証に使用されます。 |
| encrypt | 3 | 鍵は鍵トランスポート暗号化に使用されます。 |
| decrypt | 4 | 鍵は鍵トランスポート復号に使用されます。 秘密鍵フィールドが必要です。 |
| wrap key | 5 | 鍵はkey wrap暗号化に使用されます。 |
| unwrap key | 6 | 鍵はkey wrap復号に使用されます。 秘密鍵フィールドが必要です。 |
| derive key | 7 | 鍵は鍵の導出に使用されます。 秘密鍵フィールドが必要です。 |
| derive bits | 8 | 鍵は、鍵として使用されないビットの導出に 使用されます。秘密鍵フィールドが必要です。 |
| MAC create | 9 | 鍵はMACの作成に使用されます。 |
| MAC verify | 10 | 鍵はMACの検証に使用されます。 |
このセクションでは、COSEで使用できるさまざまなアルゴリズム型の分類を示します。 この分類は網羅的であると見なすべきではありません。 この分類に当てはまらない新しいアルゴリズムが作成されるでしょう。¶
署名アルゴリズムは、データ発信元およびデータ完全性サービスを提供します。 データ発信元は、誰がデータに署名したかに基づいて、誰がデータを発信したかを推定できる能力を提供します。 データ完全性は、署名されて以降データが変更されていないことを検証できる能力を提供します。¶
署名アルゴリズム方式には、一般に2つあります。 第1は、付録付き署名です。 この方式では、メッセージ内容が処理され、署名が生成されます。この署名は付録と呼ばれます。 これは、ECDSAやRSA Probabilistic Signature Scheme(RSASSA-PSS)などのアルゴリズムで使用される方式です。 (実際、RSASSA-PSSのSSAはSignature Scheme with Appendixを表します。)¶
この方式の署名関数は次のとおりです。¶
signature = Sign(message content, key) valid = Verification(message content, key, signature)¶
第2の方式は、メッセージ復元付き署名です。そのようなアルゴリズムの例は[PVSig]です。 この方式では、メッセージ内容が処理されますが、その一部が署名に含まれます。 メッセージ内容のバイトを署名に移すことで、署名付きメッセージを小さくできます。署名サイズは依然として 大きい可能性がありますが、メッセージ内容は縮小されます。 これは、これらのアルゴリズムを実装するシステムおよびそれらを使用するアプリケーションに影響します。 第1に、署名が検証されるまで、メッセージ内容は完全には利用できません。 その時点までは、署名内に含まれるメッセージの部分は復元できません。 第2の影響は、署名強度のセキュリティ分析が、メッセージ内容の構造に大きく依存し得ることです。 最後に、複数の署名がメッセージに適用される場合、すべての署名アルゴリズムはメッセージ内容の同じバイトを 消費する必要があります。 これは、1つのメッセージ内でメッセージ復元付き署名方式と付録付き署名方式を混在させることは サポートされないことを意味します。¶
この方式の署名関数は次のとおりです。¶
signature, message sent = Sign(message content, key) valid, message content = Verification(message sent, key, signature)¶
COSE向けのメッセージ復元署名アルゴリズムは、まだ正式には定義されていません。この方式から生じる 新しい制約を考えると、いくつかの問題はすでに特定されていますが、メッセージ復元署名アルゴリズムを 統合するときに追加の問題が発生する可能性は高いです。 最初に定義されるアルゴリズムは、これらの問題について決定を行う必要があり、それらの決定は、 その後定義されるあらゆるアルゴリズムを拘束する可能性があります。¶
以下では次の用語を使用します。¶
すでに特定されている問題の一部は次のとおりです。¶
署名アルゴリズムは、COSE_SignatureおよびCOSE_Sign1構造とともに使用されます。 本稿執筆時点では、COSEで使用するために定義されているのは付録付き署名だけです。しかし、 可能な実効的サイズ削減のため、メッセージ復元付き署名アルゴリズムの使用に大きな関心が示されています。¶
Message Authentication Codes(MAC)は、データ認証と完全性保護を提供します。 それらはデータ発信元をまったく提供しないか、非常に限定的にしか提供しません。たとえばMACは、 送信者の身元を第三者に証明するためには使用できません。¶
MACは、付録付き署名アルゴリズムと同じ方式を使用します。メッセージ内容が 処理され、認証コードが生成されます。認証コードはしばしばtagと呼ばれます。¶
MAC関数は次のとおりです。¶
tag = MAC_Create(message content, key) valid = MAC_Verify(message content, key, tag)¶
MACアルゴリズムは、ブロック暗号アルゴリズム(すなわちAES-MAC)またはハッシュアルゴリズム (すなわちHash-based Message Authentication Code(HMAC))のいずれかに基づくことができます。 [RFC9053]は、これらの各構成を使用する MACアルゴリズムを定義しています。¶
MACアルゴリズムは、COSE_MacおよびCOSE_Mac0構造で使用されます。¶
コンテンツ暗号化アルゴリズムは、対称鍵を使用して、潜在的に大きなデータブロックに データ機密性を提供します。それらは暗号化されたデータの完全性を提供します。しかし、データ発信元は まったく提供しないか、非常に限定的にしか提供しません。(たとえば、送信者の身元を第三者に証明するためには 使用できません。)データ発信元を提供する能力は、CEKがどのように取得されるかに結び付いています。¶
COSEは、正当なコンテンツ暗号化アルゴリズムの集合を、内容と追加データの両方の 認証をサポートするものに制限します。暗号化プロセスは何らかの種類の認証値を生成しますが、 その値はアルゴリズム定義の観点で明示的である場合も暗黙的である場合もあります。単純化のため、 認証コードは通常、暗号文ストリームに追加されるものとして定義されます。暗号化関数は次のとおりです。¶
ciphertext = Encrypt(message content, key, additional data) valid, message content = Decrypt(ciphertext, key, additional data)¶
ほとんどのAEADアルゴリズムは、復号が有効な場合にのみメッセージ内容を返すものとして 論理的に定義されています。多くの実装はこの慣例に従いますが、すべてではありません。復号が検証されない場合、 メッセージ内容を使用してはMUST NOTなりません。¶
これらのアルゴリズムはCOSE_EncryptおよびCOSE_Encrypt0で使用されます。¶
KDFは、何らかの秘密値を取り、別の値を生成するために使用されます。秘密値には 3つの種類があります。¶
一般的なKDFは、第1の種類の秘密ではうまく機能し、第2の種類の秘密ではある程度うまく機能できますが、 最後の種類の秘密では一般にうまく機能しません。非ランダムな秘密にはArgon2 [RFC9106]のような関数を使用する必要があります。¶
同じKDFを、最初の2種類の秘密を異なる方法で扱うように設定できます。 [RFC9053]のセクション5.1で定義されるKDFはそのような 関数です。 これは、HMAC-based Extract-and-Expand Key Derivation Function(HKDF)を中心に定義される アルゴリズムの集合に反映されています。¶
KDFを使用するとき、含められる構成要素の1つにcontext情報があります。context情報は、 同じ秘密から異なる鍵情報を導出できるようにするために使用されます。contextに基づく鍵材料の使用は、 良いセキュリティ慣行と見なされます。¶
コンテンツ鍵配布方式(受信者アルゴリズム)は、いくつかの異なるクラスに定義できます。 COSEには、多くのクラスの受信者アルゴリズムをサポートする能力があります。 このセクションでは、いくつかのクラスを列挙します。[RFC7516]で 定義される受信者アルゴリズムクラスについては、同じ名前を使用します。 他の仕様では、受信者アルゴリズムクラスに異なる用語を使用するか、受信者アルゴリズムクラスの一部を サポートしていません。¶
Direct Encryptionクラスのアルゴリズムは、送信者と受信者の間で秘密を共有し、 それを直接、または操作後にCEKとして使用します。direct-encryptionモードが使用される場合、 それはメッセージ上で使用される唯一のモードでなければMUSTなりません。¶
受信者のCOSE_Recipient構造は次のように構成されます。¶
key wrapモードでは、CEKがランダムに生成され、その鍵は送信者と受信者の間の 共有秘密によって暗号化されます。COSE向けに現在定義されているすべてのkey wrapアルゴリズムは AEアルゴリズムです。システムがランダム鍵生成を行う能力を少しでも持つ場合、key wrapモードは Direct Encryptionより優れていると見なされます。これは、共有鍵が、ある程度の構造を持ち、 実際に同じ内容を繰り返している可能性のあるデータではなく、ランダムデータをラップするために 使用されるからです。key wrapの使用では、direct-encryptionアルゴリズムによって提供される 弱いデータ発信元性が失われます。¶
受信者のCOSE_Recipient構造は次のように構成されます。¶
key transportモードは、一部の標準ではkey encryptionモードとも呼ばれます。 key transportモードは、鍵を保護するために対称暗号化アルゴリズムではなく非対称暗号化アルゴリズムを 使用する点でkey wrapモードと異なります。 key transportアルゴリズムの集合は[RFC8230]で定義されています。¶
key transportアルゴリズムを使用するとき、受信者のCOSE_Recipient構造は 次のように構成されます。¶
Direct Key Agreementクラスの受信者アルゴリズムは、鍵共有方式を使用して 共有秘密を作成します。その後KDFが共有秘密に適用され、データを保護するために使用される鍵を導出します。 この鍵は通常、CEKまたはMAC鍵として使用されますが、2つを超えるレイヤーが使用されている場合は 他の目的に使用されることもあります(Appendix Bを参照)。¶
最も一般的に使用される鍵共有アルゴリズムはDiffie-Hellmanですが、他の 変種も存在します。COSEはオンライン環境ではなくストアアンドフォワード環境向けに設計されているため、 メッセージの受信者が動的鍵材料を提供できないので、多くのDH変種は使用できません。 この副作用の1つは、forward secrecy([RFC4949]を参照)が達成できないことです。 COSEオブジェクトの受信者には常に静的鍵が使用されます。¶
サポートされるDHの2つの変種は次のとおりです。¶
direct key agreementモードが使用される場合、メッセージ内の受信者は1人だけで なければMUSTなりません。この方式は鍵を直接作成するため、追加の 受信者と混在させることが困難です。複数の受信者が必要な場合は、key wrap付きの版を使用する必要があります。¶
受信者のCOSE_Recipient構造は次のように構成されます。¶
Key Agreement with Key Wrapは、ランダムに生成されたCEKを使用します。 その後CEKは、鍵共有アルゴリズムによって計算された共有秘密から導出された鍵と、key wrap アルゴリズムを使用して暗号化されます。この関数は次のようになります。¶
encryptedKey = KeyWrap(KDF(DH-Shared, context), CEK)¶
受信者のCOSE_Recipient構造は次のように構成されます。¶
本文書は、CBOR Encoderがどのように動作する必要があるかについて課す制限を限定しています。 新しい符号化制限は、RFC 8949 [STD94]のセクション4.2.1で 規定されるCore Deterministic Encoding Requirementsと整合しています。 これは次の制限に絞り込まれています。¶
本文書は、一連のセキュリティサービスを提供するように設計されていますが、 特定の用途に対するアルゴリズム実装要件を課すものではありません。相互運用性要件は、個々のサービスの それぞれがどのように使用されるか、および相互運用性のためにアルゴリズムがどのように使用されるかについて 提供されます。どのアルゴリズムとどのサービスが必要かに関する要件は、各アプリケーションに委ねられます。¶
プロファイルの例は[RFC8613]にあり、 そこではCoAPヘッダーと組み合わせてコンテンツを運ぶためのものが開発されました。¶
本文書のプロファイルが作成され、その特定のアプリケーションに対する相互運用性要件を 定義することが意図されています。このセクションは、本文書をプロファイル化するときに考慮する必要のある 指針とトピックの集合を提供します。¶
複数のアルゴリズムまたはメッセージ構造が許可される場合、アプリケーションは 何らかの種類のネゴシエーションまたは発見方法を提供する必要があるかもしれません。この方法は、 アルゴリズムの集合を事前設定することを要求するという単純なものから、プロトコルに組み込まれた 発見方法を提供するものまでさまざまです。S/MIMEは、アプリケーションが従うことができる、この問題に 取り組むためのいくつかの異なる方法を提供しました。¶
以下に列挙されるレジストリおよび登録は、RFC 8152 [RFC8152]によって定義されました。 以下の措置の大部分は、参照先を本文書に向けるよう更新するものです。¶
[RFC9053]も[RFC8152]によって 元々確立されたレジストリおよび登録を更新しますが、要求される更新は相互に排他的であることに注意してください。 本文書で要求される更新は、[RFC9053]で要求される更新と 競合または重複せず、その逆も同様です。¶
「COSE Header Parameters」レジストリは[RFC8152]によって定義されました。 IANAは、このレジストリの参照を[RFC8152]ではなく本文書を指すように更新しました。IANAはまた、 「counter signature」および「CounterSignature0」を除き、[RFC8152]を参照していた すべてのエントリを本文書を参照するように更新しました。「counter signature」および「CounterSignature0」の参照は、引き続き[RFC8152]を参照します。¶
「COSE Key Common Parameters」レジストリ[COSE.KeyParameters]は[RFC8152]で定義されました。 IANAは、このレジストリの参照を[RFC8152]ではなく本文書を指すように更新しました。IANAはまた、 [RFC8152]を参照していたエントリを本文書を参照するように 更新しました。¶
IANAは、「Media Types」レジストリに「application/cose」メディア型を 登録しました。このメディア型は、内容がCOSEメッセージであることを示すために使用されます。¶
IANAは、「Media Types」レジストリに「application/cose-key」および 「application/cose-key-set」メディア型を登録しました。これらのメディア型は、それぞれ内容が COSE_KeyまたはCOSE_KeySetオブジェクトであることを示すために使用されます。¶
「application/cose-key」のテンプレートは次のとおりです。¶
「application/cose-key-set」を登録するためのテンプレートは次のとおりです。¶
IANAは、[RFC8152]で示されたとおり、「CoAP Content-Formats」レジストリに エントリを追加しました。IANAは、参照を[RFC8152]ではなく 本文書を指すように更新しました。¶
IANAは、[RFC8152]で示されたとおり、「CBOR Tags」レジストリにエントリを追加しました。 IANAは、参照を[RFC8152]ではなく本文書を 指すように更新しました。¶
[RFC8152]によって確立されたすべてのIANAレジストリは、少なくとも一部が Expert Review [RFC8126]として定義されています。このセクションは、 専門家が何を見るべきかについての一般的な指針を示しますが、専門家として指定されているのには理由があるため、 十分な裁量が与えられるべきです。¶
専門家レビュー担当者は、次を考慮すべきです。¶
本仕様の実装者が考慮する必要のあるセキュリティ上の考慮事項がいくつかあります。 ここで強調されている考慮事項もありますが、追加の考慮事項は参考文献に列挙された文書にあります。¶
実装は、すべての個人の秘密鍵材料を保護する必要があります。本文書のいくつかの ケースは、この問題に関して強調する必要があります。¶
Elliptic Curve Diffie-Hellman(ECDH)およびdirect plus KDF(key wrapなし)の 使用が、直接秘密鍵の漏洩につながることはありません。KDFの一方向関数がそれを防ぐためです。 しかし、対処する必要のある別の問題があります。2人の受信者がいる場合、CEKを2人の受信者間で 共有する必要があります。したがって、第2の受信者は、弱い発信元証明に使用できる材料から導出されたCEKを 持つことになります。第2の受信者は、同じCEKを使用してメッセージを作成し、第1の受信者に送信できます。 第1の受信者は、Static-Static ECDHまたはdirect plus KDFのいずれかについて、そのCEKが発信元証明に 使用できると仮定するでしょう。たとえそれが誤った実体からのものであってもです。key wrap手順が追加される場合、 発信元証明は暗示されず、これは問題ではありません。¶
以前にも述べましたが、繰り返しておく価値があります。複数のアルゴリズムに単一の鍵を使用すると、 一部の場合に鍵に関する情報を漏洩することが示されており、攻撃者が完全性タグを偽造したり、 暗号化された内容に関する情報を得たりする機会を与えます。 鍵を単一のアルゴリズムに結び付けることで、これらの問題を防げます。 鍵の作成者と鍵の利用者は、異なるアルゴリズムごとに新しい鍵を作成するだけでなく、そのアルゴリズムの選択を 鍵材料の配布に含め、鍵構造内のアルゴリズムとメッセージ構造内のアルゴリズムの照合を厳密に強制することが 強く推奨されます。 アルゴリズムが正しいことを確認することに加えて、鍵形式も確認する必要があります。 「OKP」鍵が期待される場所で「EC2」鍵を使用してはなりません。¶
送信に鍵を使用する前、または受信した情報に基づいて行動する前に、鍵に関する信頼判断を 行う必要があります。データまたは行動は、その鍵に関連付けられた実体が見る権利、または要求する権利を持つものか。 この信頼判断には多くの要因が関連します。ここで強調する一部は次のとおりです。¶
注目されている分野の1つに、メッセージの長さに基づく暗号化メッセージの トラフィック分析があります。本仕様は、メッセージ構造の一部としてパディングを提供する統一的な方法を 提供しません。観測者は、[RFC9053]で定義される すべてのコンテンツ暗号化アルゴリズムについて、長さに基づいて2つの異なるメッセージ(たとえば 「YES」と「NO」)を区別できます。これは、そのような分析を防止または抑制するために、コンテンツ パディングをどのように行うかを文書化するのはアプリケーション次第であることを意味します。 (たとえば、テキスト文字列を「YES」と「NO 」として定義できます。)¶
COSEの開発中、アルゴリズム識別子を保護属性に配置しなければならないという要件は、 mustからshouldへと緩和されました。 この立場を支持するために、2つの基本的な理由が提示されています。 第1に、CoAP環境で最も一般的なメッセージからアルゴリズム識別子を省略すれば、結果として得られる メッセージはより小さくなります。 第2に、アルゴリズム識別子を配置できるさまざまな場所(メッセージ自体、アプリケーションの記述、 送信者が保持する鍵構造、および受信者が保持する鍵構造)の間で完全なチェックが正しく行われない場合、 潜在的なバグが発生します。¶
この付録は、そのような変更をどのように行えるか、およびこのオプションを使用するためにアプリケーションが 指定する必要のある詳細を示します。 2つの異なる詳細の集合が指定されます。1つはアルゴリズム識別子を省略するために必要なもの、もう1つは 自身に関する属性を含まない副署名属性の変種を使用するために必要なものです。¶
3つの推奨事項の集合を示します。第1の推奨事項の集合は、COSEオブジェクトの単一レイヤーに 暗黙のアルゴリズムを識別させる場合に適用されます。第2の推奨事項の集合は、COSEオブジェクトの 複数レイヤーに複数の暗黙のアルゴリズムを識別させる場合に適用されます。第3の推奨事項の集合は、 複数のCOSEオブジェクト構成物に対して暗黙のアルゴリズムを持たせる場合に適用されます。¶
BCP 14([RFC2119]および [RFC8174])のキーワードは、ここでは意図的に使用していません。 本仕様は推奨事項を提供できますが、それを強制することはできません。¶
この推奨事項の集合は、アプリケーションが単一のCOSEオブジェクトで使用するために、 固定アルゴリズムを鍵情報とともに配布する場合に適用されます。これは通常、最小のCOSEオブジェクト、 具体的にはCOSE_Sign1、COSE_Mac0、およびCOSE_Encrypt0に適用されますが、他の構造にも適用できます。¶
次の項目を考慮すべきです。¶
第2のケースは、複数レイヤーのCOSEオブジェクトに対して複数の暗黙のアルゴリズム識別子を 指定することです。これがどのように機能するかの例は、アプリケーションが指定する暗号化contextです。 それには、コンテンツ暗号化アルゴリズム、key wrapアルゴリズム、鍵識別子、および共有秘密が含まれます。 送信者はコンテンツレイヤーと受信者レイヤーの両方についてアルゴリズム識別子の送信を省略し、 鍵識別子だけを残します。受信者はその後、鍵識別子を使用して暗黙のアルゴリズム識別子を取得します。¶
次の追加項目を考慮する必要があります。¶
第3のケースは、複数の暗黙のアルゴリズム識別子を持つものの、それらが潜在的に 関連しないレイヤーまたは異なるCOSEオブジェクトを対象とする場合です。これが適用可能となるさまざまな シナリオが存在します。その一部は次のとおりです。¶
これらの場合、次の追加項目を考慮する必要があります。¶
現在定義されているすべての受信者アルゴリズムクラスは、COSE構造の2つのレイヤーだけを使用します。 第1レイヤー(COSE_Encrypt)はメッセージ内容であり、第2レイヤー(COSE_Recipient)は コンテンツ鍵暗号化です。 しかし、RSA Key Encapsulation Mechanism(RSA-KEM)のような受信者アルゴリズムを使用する場合(RSA-KEM [RFC5990]のAppendix Aを参照)、 COSE_Recipient構造を2つのレイヤー持つことが理にかないます。¶
これらのレイヤーは次のようになります。¶
これは、3レイヤーメッセージがどのように見えるかの例です。読みやすくするため、 バイナリダンプとしてではなく、拡張CBOR診断記法([RFC8610]で定義)を使用して提示されています。メッセージには次の レイヤーがあります。¶
実質的に、この例はECDH-ES+A128KWアルゴリズムを使用することの分解版です。¶
バイナリファイルのサイズは183バイトです¶
96(
[ / COSE_Encrypt /
/ protected h'a10101' / << {
/ alg / 1:1 / AES-GCM 128 /
} >>,
/ unprotected / {
/ iv / 5:h'02d1f7e6f26c43d4868d87ce'
},
/ ciphertext / h'64f84d913ba60a76070a9a48f26e97e863e2852948658f0
811139868826e89218a75715b',
/ recipients / [
[ / COSE_Recipient /
/ protected / h'',
/ unprotected / {
/ alg / 1:-3 / A128KW /
},
/ ciphertext / h'dbd43c4e9d719c27c6275c67d628d493f090593db82
18f11',
/ recipients / [
[ / COSE_Recipient /
/ protected h'a1013818' / << {
/ alg / 1:-25 / ECDH-ES + HKDF-256 /
} >> ,
/ unprotected / {
/ ephemeral / -1:{
/ kty / 1:2,
/ crv / -1:1,
/ x / -2:h'b2add44368ea6d641f9ca9af308b4079aeb519f11
e9b8a55a600b21233e86e68',
/ y / -3:false
},
/ kid / 4:'meriadoc.brandybuck@buckland.example'
},
/ ciphertext / h''
]
]
]
]
]
)
¶
この付録には、本文書で定義されたさまざまな機能とメッセージ型を示す例の集合が 含まれています。例を読みやすくするため、バイナリダンプとしてではなく、拡張CBOR診断記法([RFC8610]で定義)を使用して提示されています。¶
[GitHub-Examples]にGitHubプロジェクトが作成されており、そこには本文書で 提示される例だけでなく、より完全なテスト例の集合も含まれています。 各例はJSONファイル内にあり、その例を作成するために使用された入力、例のデバッグに使用できる一部の 中間値、および例の出力がhex dumpとCBOR診断記法形式の両方で提示されています。 サイト上の一部の例は失敗テストケースとして設計されており、これらはJSONファイル内で明確にそのように マークされています。 本文書の例に誤りが見つかった場合、GitHub上の例が更新され、その旨の注記がJSONファイルに配置されます。¶
前述のとおり、例はCBORの診断記法を使用して提示されています。診断記法とバイナリの間で 変換できるRubyベースのツールが存在します。このツールは次のコマンドラインでインストールできます。¶
gem install cbor-diag¶
診断記法は、次のコマンドラインを使用してバイナリファイルに変換できます。¶
diag2cbor.rb < inputfile > outputfile¶
すべてのソースコードが属性type='cbor-diag'でタグ付けされているため、 XPath式を介して本文書のXML版から例を抽出できます。(使用しているXPath評価器によっては、 >をエンティティとして扱う必要がある場合があります。)¶
//sourcecode[@type='cbor-diag']/text()¶
この例は次を使用します。¶
バイナリファイルのサイズは103バイトです¶
98(
[
/ protected / h'',
/ unprotected / {},
/ payload / 'This is the content.',
/ signatures / [
[
/ protected h'a10126' / << {
/ alg / 1:-7 / ECDSA 256 /
} >>,
/ unprotected / {
/ kid / 4:'11'
},
/ signature / h'e2aeafd40d69d19dfe6e52077c5d7ff4e408282cbefb
5d06cbf414af2e19d982ac45ac98b8544c908b4507de1e90b717c3d34816fe926a2b
98f53afd2fa0f30a'
]
]
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは277バイトです¶
98(
[
/ protected / h'',
/ unprotected / {},
/ payload / 'This is the content.',
/ signatures / [
[
/ protected h'a10126' / << {
/ alg / 1:-7 / ECDSA 256 /
} >>,
/ unprotected / {
/ kid / 4:'11'
},
/ signature / h'e2aeafd40d69d19dfe6e52077c5d7ff4e408282cbefb
5d06cbf414af2e19d982ac45ac98b8544c908b4507de1e90b717c3d34816fe926a2b
98f53afd2fa0f30a'
],
[
/ protected h'a1013823' / << {
/ alg / 1:-36 / ECDSA 521 /
} >> ,
/ unprotected / {
/ kid / 4:'bilbo.baggins@hobbiton.example'
},
/ signature / h'00a2d28a7c2bdb1587877420f65adf7d0b9a06635dd1
de64bb62974c863f0b160dd2163734034e6ac003b01e8705524c5c4ca479a952f024
7ee8cb0b4fb7397ba08d009e0c8bf482270cc5771aa143966e5a469a09f613488030
c5b07ec6d722e3835adb5b2d8c44e95ffb13877dd2582866883535de3bb03d01753f
83ab87bb4f7a0297'
]
]
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは125バイトです¶
98(
[
/ protected h'a2687265736572766564f40281687265736572766564' /
<< {
"reserved":false,
/ crit / 2:[
"reserved"
]
} >>,
/ unprotected / {},
/ payload / 'This is the content.',
/ signatures / [
[
/ protected h'a10126' / << {
/ alg / 1:-7 / ECDSA 256 /
} >>,
/ unprotected / {
/ kid / 4:'11'
},
/ signature / h'3fc54702aa56e1b2cb20284294c9106a63f91bac658d
69351210a031d8fc7c5ff3e4be39445b1a3e83e1510d1aca2f2e8a7c081c7645042b
18aba9d1fad1bd9c'
]
]
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは98バイトです¶
18(
[
/ protected h'a10126' / << {
/ alg / 1:-7 / ECDSA 256 /
} >>,
/ unprotected / {
/ kid / 4:'11'
},
/ payload / 'This is the content.',
/ signature / h'8eb33e4ca31d1c465ab05aac34cc6b23d58fef5c083106c4
d25a91aef0b0117e2af9a291aa32e14ab834dc56ed2a223444547e01f11d3b0916e5
a4c345cacb36'
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは151バイトです¶
96(
[
/ protected h'a10101' / << {
/ alg / 1:1 / AES-GCM 128 /
} >>,
/ unprotected / {
/ iv / 5:h'c9cf4df2fe6c632bf7886413'
},
/ ciphertext / h'7adbe2709ca818fb415f1e5df66f4e1a51053ba6d65a1a0
c52a357da7a644b8070a151b0',
/ recipients / [
[
/ protected h'a1013818' / << {
/ alg / 1:-25 / ECDH-ES + HKDF-256 /
} >>,
/ unprotected / {
/ ephemeral / -1:{
/ kty / 1:2,
/ crv / -1:1,
/ x / -2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbf
bf054e1c7b4d91d6280',
/ y / -3:true
},
/ kid / 4:'meriadoc.brandybuck@buckland.example'
},
/ ciphertext / h''
]
]
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは91バイトです¶
96(
[
/ protected h'a1010a' / << {
/ alg / 1:10 / AES-CCM-16-64-128 /
} >>,
/ unprotected / {
/ iv / 5:h'89f52f65a1c580933b5261a76c'
},
/ ciphertext / h'753548a19b1307084ca7b2056924ed95f2e3b17006dfe93
1b687b847',
/ recipients / [
[
/ protected h'a10129' / << {
/ alg / 1:-10
} >>,
/ unprotected / {
/ salt / -20:'aabbccddeeffgghh',
/ kid / 4:'our-secret'
},
/ ciphertext / h''
]
]
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは173バイトです¶
96(
[
/ protected h'a10101' / << {
/ alg / 1:1 / AES-GCM 128 /
} >> ,
/ unprotected / {
/ iv / 5:h'02d1f7e6f26c43d4868d87ce'
},
/ ciphertext / h'64f84d913ba60a76070a9a48f26e97e863e28529d8f5335
e5f0165eee976b4a5f6c6f09d',
/ recipients / [
[
/ protected / h'a101381f' / {
\ alg \ 1:-32 \ ECDH-SS+A128KW \
} / ,
/ unprotected / {
/ static kid / -3:'peregrin.took@tuckborough.example',
/ kid / 4:'meriadoc.brandybuck@buckland.example',
/ U nonce / -22:h'0101'
},
/ ciphertext / h'41e0d76f579dbd0d936a662d54d8582037de2e366fd
e1c62'
]
]
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは52バイトです¶
16(
[
/ protected h'a1010a' / << {
/ alg / 1:10 / AES-CCM-16-64-128 /
} >> ,
/ unprotected / {
/ iv / 5:h'89f52f65a1c580933b5261a78c'
},
/ ciphertext / h'5974e1b99a3a4cc09a659aa2e9e7fff161d38ce71cb45ce
460ffb569'
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは41バイトです¶
16(
[
/ protected h'a1010a' / << {
/ alg / 1:10 / AES-CCM-16-64-128 /
} >> ,
/ unprotected / {
/ partial iv / 6:h'61a7'
},
/ ciphertext / h'252a8911d465c125b6764739700f0141ed09192de139e05
3bd09abca'
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは57バイトです¶
97(
[
/ protected h'a1010f' / << {
/ alg / 1:15 / AES-CBC-MAC-256//64 /
} >> ,
/ unprotected / {},
/ payload / 'This is the content.',
/ tag / h'9e1226ba1f81b848',
/ recipients / [
[
/ protected / h'',
/ unprotected / {
/ alg / 1:-6 / direct /,
/ kid / 4:'our-secret'
},
/ ciphertext / h''
]
]
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは214バイトです¶
97(
[
/ protected h'a10105' / << {
/ alg / 1:5 / HMAC 256//256 /
} >> ,
/ unprotected / {},
/ payload / 'This is the content.',
/ tag / h'81a03448acd3d305376eaa11fb3fe416a955be2cbe7ec96f012c99
4bc3f16a41',
/ recipients / [
[
/ protected h'a101381a' / << {
/ alg / 1:-27 / ECDH-SS + HKDF-256 /
} >> ,
/ unprotected / {
/ static kid / -3:'peregrin.took@tuckborough.example',
/ kid / 4:'meriadoc.brandybuck@buckland.example',
/ U nonce / -22:h'4d8553e7e74f3c6a3a9dd3ef286a8195cbf8a23d
19558ccfec7d34b824f42d92bd06bd2c7f0271f0214e141fb779ae2856abf585a583
68b017e7f2a9e5ce4db5'
},
/ ciphertext / h''
]
]
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは109バイトです¶
97(
[
/ protected h'a1010e' / << {
/ alg / 1:14 / AES-CBC-MAC-128//64 /
} >> ,
/ unprotected / {},
/ payload / 'This is the content.',
/ tag / h'36f5afaf0bab5d43',
/ recipients / [
[
/ protected / h'',
/ unprotected / {
/ alg / 1:-5 / A256KW /,
/ kid / 4:'018c0ae5-4d9b-471b-bfd6-eef314bc7037'
},
/ ciphertext / h'711ab0dc2fc4585dce27effa6781c8093eba906f227
b6eb0'
]
]
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは309バイトです¶
97(
[
/ protected h'a10105' / << {
/ alg / 1:5 / HMAC 256//256 /
} >> ,
/ unprotected / {},
/ payload / 'This is the content.',
/ tag / h'bf48235e809b5c42e995f2b7d5fa13620e7ed834e337f6aa43df16
1e49e9323e',
/ recipients / [
[
/ protected h'a101381c' / << {
/ alg / 1:-29 / ECDH-ES+A128KW /
} >> ,
/ unprotected / {
/ ephemeral / -1:{
/ kty / 1:2,
/ crv / -1:3,
/ x / -2:h'0043b12669acac3fd27898ffba0bcd2e6c366d53bc4db
71f909a759304acfb5e18cdc7ba0b13ff8c7636271a6924b1ac63c02688075b55ef2
d613574e7dc242f79c3',
/ y / -3:true
},
/ kid / 4:'bilbo.baggins@hobbiton.example'
},
/ ciphertext / h'339bc4f79984cdc6b3e6ce5f315a4c7d2b0ac466fce
a69e8c07dfbca5bb1f661bc5f8e0df9e3eff5'
],
[
/ protected / h'',
/ unprotected / {
/ alg / 1:-5 / A256KW /,
/ kid / 4:'018c0ae5-4d9b-471b-bfd6-eef314bc7037'
},
/ ciphertext / h'0b2c7cfce04e98276342d6476a7723c090dfdd15f9a
518e7736549e998370695e6d6a83b4ae507bb'
]
]
]
)
¶
この例は次を使用します。¶
バイナリファイルのサイズは37バイトです¶
17(
[
/ protected h'a1010f' / << {
/ alg / 1:15 / AES-CBC-MAC-256//64 /
} >> ,
/ unprotected / {},
/ payload / 'This is the content.',
/ tag / h'726043745027214f'
]
)
¶
この例はAppendix C.5.1と同じ入力を使用していることに注意してください。¶
これはCOSE Key Setの例です。この例には、以前のすべての例に対する 公開鍵が含まれています。¶
順に、鍵は次のとおりです。¶
バイナリファイルのサイズは481バイトです¶
[
{
-1:1,
-2:h'65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c0
8551d',
-3:h'1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd008
4d19c',
1:2,
2:'meriadoc.brandybuck@buckland.example'
},
{
-1:1,
-2:h'bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a
09eff',
-3:h'20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbf
c117e',
1:2,
2:'11'
},
{
-1:3,
-2:h'0072992cb3ac08ecf3e5c63dedec0d51a8c1f79ef2f82f94f3c737bf5de
7986671eac625fe8257bbd0394644caaa3aaf8f27a4585fbbcad0f2457620085e5c8
f42ad',
-3:h'01dca6947bce88bc5790485ac97427342bc35f887d86d65a089377e247e
60baa55e4e8501e2ada5724ac51d6909008033ebc10ac999b9d7f5cc2519f3fe1ea1
d9475',
1:2,
2:'bilbo.baggins@hobbiton.example'
},
{
-1:1,
-2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbfbf054e1c7b4d91
d6280',
-3:h'f01400b089867804b8e9fc96c3932161f1934f4223069170d924b7e03bf
822bb',
1:2,
2:'peregrin.took@tuckborough.example'
}
]
¶
これはCOSE Key Setの例です。この例には、以前のすべての例に対する 秘密鍵が含まれています。¶
順に、鍵は次のとおりです。¶
バイナリファイルのサイズは816バイトです¶
[
{
1:2,
2:'meriadoc.brandybuck@buckland.example',
-1:1,
-2:h'65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c0
8551d',
-3:h'1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd008
4d19c',
-4:h'aff907c99f9ad3aae6c4cdf21122bce2bd68b5283e6907154ad911840fa
208cf'
},
{
1:2,
2:'11',
-1:1,
-2:h'bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a
09eff',
-3:h'20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbf
c117e',
-4:h'57c92077664146e876760c9520d054aa93c3afb04e306705db609030850
7b4d3'
},
{
1:2,
2:'bilbo.baggins@hobbiton.example',
-1:3,
-2:h'0072992cb3ac08ecf3e5c63dedec0d51a8c1f79ef2f82f94f3c737bf5de
7986671eac625fe8257bbd0394644caaa3aaf8f27a4585fbbcad0f2457620085e5c8
f42ad',
-3:h'01dca6947bce88bc5790485ac97427342bc35f887d86d65a089377e247e
60baa55e4e8501e2ada5724ac51d6909008033ebc10ac999b9d7f5cc2519f3fe1ea1
d9475',
-4:h'00085138ddabf5ca975f5860f91a08e91d6d5f9a76ad4018766a476680b
55cd339e8ab6c72b5facdb2a2a50ac25bd086647dd3e2e6e99e84ca2c3609fdf177f
eb26d'
},
{
1:4,
2:'our-secret',
-1:h'849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c4
27188'
},
{
1:2,
-1:1,
2:'peregrin.took@tuckborough.example',
-2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbfbf054e1c7b4d91
d6280',
-3:h'f01400b089867804b8e9fc96c3932161f1934f4223069170d924b7e03bf
822bb',
-4:h'02d1f7e6f26c43d4868d87ceb2353161740aacf1f7163647984b522a848
df1c3'
},
{
1:4,
2:'our-secret2',
-1:h'849b5786457c1491be3a76dcea6c4271'
},
{
1:4,
2:'018c0ae5-4d9b-471b-bfd6-eef314bc7037',
-1:h'849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c4
27188'
}
]
¶
本文書はIETFのCOSE Working Groupの成果物です。¶
そもそも私がこのプロジェクトを始めるきっかけを作った責任は、次の個人にあります。 Richard Barnes、Matt Miller、および Martin Thomson。¶
仕様の初期ドラフト版は、ある程度JOSEおよびS/MIME Working Groupsの成果に基づいていました。¶
次の個人は、文書の最終的な形に対して意見を提供しました。Carsten Bormann、John Bradley、Brian Campbell、Michael B. Jones、Ilari Liusvaara、Francesca Palombini、 Ludwig Seitz、およびGöran Selander。¶