RFC 9052 COSE構造 2022年8月
Schaad 標準化過程 [ページ]
ストリーム:
Internet Engineering Task Force(IETF)
RFC:
9052
STD:
96
廃止:
8152
カテゴリ:
標準化過程
公開:
ISSN:
2070-1721
著者:
J. Schaad
August Cellars

RFC 9052

CBORオブジェクト署名および暗号化(COSE):構造と処理

要旨

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で入手できます。

目次

1. はじめに

モノのインターネット(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]を作成して、古い副署名アルゴリズムと ヘッダーパラメータを非推奨にするとともに、望ましいセキュリティ特性を持つ新しいアルゴリズムと ヘッダーパラメータを定義することが決定されました。

1.1. 要件用語

本書におけるキーワード「MUST」、「MUST NOT」、 「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「NOT RECOMMENDED」、「MAY」、および 「OPTIONAL」は、ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174]に記述されるとおりに解釈されます。

1.2. RFC 8152からの変更

  • 元の文書を本書と[RFC9053]に分割しました。
  • COSEで定義されるダイジェスト構造が存在しない理由を 説明する本文を追加しました。
  • 本文の明確化と用語の変更を行いました。
  • 副署名に関連する詳細をすべて削除し、 [COSE-COUNTERSIGN]に配置しました。

1.3. JOSEからの設計上の変更

  • 暗号化、署名、およびMACedメッセージを容易に 識別でき、かつ一貫した見方を維持できるように、単一の全体メッセージ構造が定義されました。
  • 署名付きメッセージは、コンテンツに関連する 保護ヘッダーパラメータおよび非保護ヘッダーパラメータと、署名に関連するものを区別します。
  • MACedメッセージは署名付きメッセージから分離されます。
  • MACedメッセージは、MAC認証鍵を取得するために、 エンベロープ化メッセージと同じ受信者アルゴリズムの集合を使用する機能を持ちます。
  • バイナリデータの符号化には、base64url符号化ではなく バイナリ符号化が使用されます。
  • 暗号化アルゴリズムの認証タグは暗号文と結合されました。
  • 暗号アルゴリズムの集合は、一部の方向では拡張され、 他の方向では整理されました。

1.4. CBOR データ構造のためのCDDL文法

COSEが最初に書かれた時点では、Concise Data Definition Language(CDDL)[RFC8610]はまだ RFCとして公開されていなかったため、COSEで用いられるCBORデータ構造を規範的に 記述するデータ記述言語として使用することはできませんでした。 そのため、ここで定義されるCBORデータオブジェクトは散文で記述されています。 COSEデータオブジェクトの追加の(非規範的な)記述は、以下で説明するCDDLの サブセットで提供されています。

本書は、まず文法に取り組み、その後それに伴う散文を作成することで開発されました。 その副産物として、散文はConcise Data Definition Language(CDDL) [RFC8610]によって定義されたプリミティブ型文字列を使用して 書かれています。本仕様では、次のプリミティブ型が使用されます。

any:
すべてのCBOR値をここに配置することを 許す非特定の値。
bool:
ブール値(true: メジャー型7、値 21、false: メジャー型7、値20)。
bstr:
バイト文字列(メジャー型2)。
int:
符号なし整数または負の整数。
nil:
null値(メジャー型7、値22)。
nint:
負の整数(メジャー型1)。
tstr:
UTF-8テキスト文字列(メジャー型3)。
uint:
符号なし整数(メジャー型0)。

本書では、CDDLの3つの構文が省略記法として現れます。それらは次のとおりです。

FOO / BAR:
FOOまたはBARのいずれかがここに 現れ得ることを示します。
[+ FOO]:
型FOOが配列内に1回以上現れることを 示します。
* FOO:
型FOOが0回以上現れることを示します。

CDDLによって定義される制約のうち2つも本書で使用されます。それらは次のとおりです。

type1 .cbor type2:
type1の内容、通常はbstrが、 type2の値を含むことを示します。
type1 .size integer:
type1の内容がintegerバイト長であることを 示します。

散文による説明に加えて、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

1.6. 文書用語

本書では、次の用語を使用します。

Byte:
octetの同義語。
Constrained Application Protocol (CoAP):
制約のあるシステムで使用するための 専用のWeb転送プロトコル。これは [RFC7252]で定義されています。
Authenticated Encryption (AE) algorithms [RFC5116]:
暗号化サービスとともに、内容の 認証チェックを提供する暗号化アルゴリズム。 COSEで使用されるAEアルゴリズムの一例は、AES Key Wrap [RFC3394]です。 これらのアルゴリズムは鍵暗号化に使用されますが、 Authenticated Encryption with Associated Data(AEAD) アルゴリズムの方が望ましいです。
AEAD algorithms [RFC5116]:
AEアルゴリズムと同じ内容の 認証サービスを提供し、さらに、暗号化本文の一部ではない関連データを 認証サービスに含めることを可能にする暗号化アルゴリズム。COSEで使用されるAEAD アルゴリズムの一例は、AES-GCM [RFC5116]です。 これらの アルゴリズムはコンテンツ暗号化に使用され、鍵暗号化にも使用できます。

「Context」は、本書全体を通して、COSEメッセージの一部ではない情報を表すために使用されます。 contextの一部である情報は、プロトコル相互作用、関連する鍵構造、およびプログラム設定を含む 複数の異なるソースから来る可能性があります。 使用するcontextは暗黙的なものでも、[RFC8613]で 定義される「kid context」ヘッダーパラメータを使用して識別されるものでも、プロトコル固有の 識別子によって識別されるものでもかまいません。 Contextは一般に暗号構築に含めるべきです。詳細については、セクション4.3を参照してください。

「byte string」という用語はバイト列に対して使用され、「text string」という用語は文字列に対して使用されます。

2. 基本的なCOSE構造

COSEオブジェクト構造は、さまざまな種類のセキュリティメッセージを解析および処理するときに 大量の共通コードを使用できるように設計されています。 すべてのメッセージ構造はCBOR配列型の上に構築されます。 配列の最初の3つの要素は、常に同じ情報を含みます。

  1. 保護ヘッダーパラメータ。bstrで符号化されラップされます。
  2. マップとしての非保護ヘッダーパラメータ。
  3. メッセージの内容。 内容は、適宜、平文または暗号文です。 内容はデタッチされる(すなわち、COSE構造とは別に転送される)ことがありますが、その場所は 依然として使用されます。 内容が存在する場合はbstrでラップされ、デタッチされている場合はnil値になります。

この時点以降の要素は、特定のメッセージ型に依存します。

COSEメッセージは、異なる種類の暗号概念を分離するためにレイヤーの概念を 使用して構築されます。これがどのように機能するかの例として、COSE_Encryptメッセージ(セクション5.1)を考えます。このメッセージ型は、 コンテンツレイヤーと受信者レイヤーの2つのレイヤーに分けられます。コンテンツレイヤーは、 暗号化された平文と暗号化メッセージに関する情報を含みます。受信者レイヤーは、各受信者について、 暗号化されたコンテンツ暗号化鍵(CEK)と、それがどのように暗号化されているかに関する情報を含みます。 CEKが事前共有されている場合のために、暗号化メッセージの単一レイヤー版COSE_Encrypt0 (セクション5.2)が提供されています。

提示されたメッセージの型の識別は、次の方法によって行われます。

  1. 特定のメッセージ型がcontextから既知である場合。これは、包含構造内の マーカーによって定義される場合も、アプリケーションプロトコルによって指定された制限によって 定義される場合もあります。
  2. メッセージ型がCBORタグによって識別される場合。CBORタグを持つ メッセージは本仕様ではタグ付きメッセージと呼ばれ、CBORタグを持たないものはタグなし メッセージと呼ばれます。本書は各メッセージ構造に対してCBORタグを定義します。これらのタグは 表1にあります。
  3. COSEオブジェクトがメディア型「application/cose」で運ばれる場合、オプションのパラメータ 「cose-type」を使用して埋め込まれたオブジェクトを識別できます。 構造のタグ付き版が使用される場合、このパラメータはOPTIONALです。 構造のタグなし版が使用される場合、このパラメータはREQUIREDです。 各構造についてこのパラメータで使用する値は、表1にあります。
  4. COSEオブジェクトがCoAPペイロードとして運ばれる場合、CoAP Content-Format Optionを使用してメッセージ内容を識別できます。CoAP Content-Format値は表2にあります。各セキュリティメッセージは 一意に識別されるため、メッセージ構造のCBORタグは不要です。
表1: COSEメッセージ識別
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オブジェクト
表2: COSEのためのCoAP Content-Formats
メディア型 符号化 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

3. ヘッダーパラメータ

COSEの構造は、ペイロード自体の一部とは見なされないものの、コンテンツ、 アルゴリズム、鍵、またはレイヤー処理のための評価ヒントに関する情報を保持するために使用される 2つの情報バケットを持つように設計されています。これら2つのバケットは、鍵を除くすべての構造で 使用できます。これらのバケットは存在しますが、すべてのインスタンスで常に使用可能とは限りません。 たとえば、保護バケットは受信者構造の一部として定義されていますが、受信者構造で使用される 一部のアルゴリズムは認証データを提供しません。その場合、保護バケットは空のままになります。

両方のバケットはCBORマップとして実装されます。マップキーは「label」 (セクション1.5)です。値の部分はラベルの定義に依存します。両方の マップは、同じラベル/値ペアの集合を使用します。ラベルの整数値およびテキスト文字列値は、 標準範囲、私的使用範囲、および選択されたアルゴリズムに依存する範囲を含む複数の区分に 分けられています。定義されたラベルは、IANAの「COSE Header Parameters」レジストリ (セクション11.1)にあります。

2つのバケットは次のとおりです。

protected:

暗号的に保護される現在のレイヤーに関するパラメータを含みます。 暗号計算に含められない場合、このバケットは空でなければMUSTなりません。 このバケットは、メッセージ内でバイナリオブジェクトとして符号化されます。 この値は、保護マップをCBOR符号化し、それをbstrオブジェクトでラップすることによって取得されます。 送信者は、ゼロ長マップをゼロ長マップ(h'a0'として符号化)としてではなく、ゼロ長バイト文字列として 符号化すべきSHOULDです。 ゼロ長バイト文字列符号化は、より短く、暗号計算のためのシリアライズ構造で使用される バージョンでもあるため、推奨されます。 受信者は、ゼロ長バイト文字列と、バイト文字列内に符号化されたゼロ長マップの両方を 受け入れなければMUSTなりません。

符号化をバイト文字列でラップすることで、保護マップが転送中に偶発的に変更されにくい状態で 転送される可能性が高まります。 (行儀の悪い中継者がデコードして再エンコードすることはできますが、再エンコードされたバイト文字列が デコードされたバイト文字列と同一でない限り、検証は失敗します。) これにより、暗号操作への入力としてマップの共通の正準符号化をすべての当事者が実行できる 必要があるという問題を回避します。

unprotected:
暗号的に保護されない現在のレイヤーに関する パラメータを含みます。

現在のレイヤーを扱うヘッダーパラメータだけが、そのレイヤーに配置されます。この例として、 ヘッダーパラメータ「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.1. 共通COSEヘッダー パラメータ

このセクションは、共通ヘッダーパラメータの集合を定義します。 これらのヘッダーパラメータの概要は表3にあります。 ラベルの値と値の型を判断するには、この表を参照すべきです。

このセクションで定義されるヘッダーパラメータの集合は次のとおりです。

alg:
このヘッダーパラメータは、 セキュリティ処理に使用されるアルゴリズムを示すために使用されます。このヘッダーパラメータは、 それが可能な場合には認証されなければMUSTなりません。このサポートは、AEADアルゴリズムまたは構造 (例: COSE_SignおよびCOSE_Mac0)によって提供されます。この認証は、ヘッダーパラメータを protected-header-parametersバケットに配置することによって、または外部から提供されるデータ (セクション4.3)の一部として行うことができます。値は、 「COSE Algorithms」レジストリ([COSE.Algorithms]を参照)から取得されます。
crit:

このヘッダーパラメータは、メッセージを処理する アプリケーションが理解する必要のある保護ヘッダーパラメータを示すために使用されます。 本書で定義されるヘッダーパラメータは、すべての実装が理解すべきであるため、 含める必要はありません。さらに、[RFC8152]によって定義されたヘッダーパラメータ 「counter signature」(ラベル7)は、その文書に従い、すべての実装がそれを 理解すると仮定する送信者との互換性を維持するため、新しい実装で理解されなければなりません。 存在する場合、「crit」ヘッダーパラメータはprotected-header-parametersバケットに 配置されなければMUSTなりません。配列には少なくとも 1つの値が含まれていなければMUSTなりません。

すべてのヘッダーパラメータラベルを「crit」ヘッダーパラメータに含める必要はありません。 配列にどのヘッダーパラメータを配置するかを決定する規則は次のとおりです。

  • 0から7の範囲の整数ラベルは 省略すべきSHOULDです。
  • -1から-128の範囲の整数ラベルは省略できます。 アルゴリズムは、この範囲にラベルを割り当てることができます。その場合、ラベルの内容を 処理できることは、アルゴリズムの実装における中核であると見なされます。 アルゴリズムは、この範囲外にラベルを割り当て、ラベルの内容を処理できることが アルゴリズムの中核機能とは見なされないが、このインスタンスを正しく処理するために 理解される必要がある場合に、それらを「crit」ヘッダーパラメータに含めることができます。 -129から-65536の範囲の整数ラベルは、これらが一般には サポートされない可能性のある、あまり一般的でないヘッダーパラメータであるため、 含めるべきSHOULDです。
  • アプリケーションに必要なヘッダーパラメータの ラベルは省略してもMAYかまいません。アプリケーションは、 そのラベルを省略できるかどうかを宣言する文を持つべきです。

「crit」によって示されるヘッダーパラメータは、セキュリティライブラリコードによって処理することも、 セキュリティライブラリを使用するアプリケーションによって処理することもできます。唯一の要件は、 そのヘッダーパラメータが処理されることです。「crit」値リストが、 protected-header-parametersバケットに存在しないヘッダーパラメータのラベルを含む場合、 これはメッセージ処理における致命的エラーです。

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」値の内部構造は定義されておらず、アプリケーションはそれに依存できません。鍵識別子値は、 使用する鍵についてのヒントです。これはセキュリティ上重要なフィールドではありません。 このため、unprotected-header-parametersバケットに配置できます。
IV:
このヘッダーパラメータは、 Initialization Vector(IV)値を保持します。一部の対称暗号化アルゴリズムでは、 これはnonceと呼ばれる場合があります。AEおよびAEADアルゴリズムでは、IVを変更すると 復号が失敗するため、IVは非保護バケットに配置できます。
Partial IV:

このヘッダーパラメータはIV値の一部を保持します。 COSE_Encrypt0構造を使用するとき、IVの一部は鍵に関連付けられたcontextの一部 (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を取ります。
表3: 共通ヘッダーパラメータ
名前 ラベル 値型 値レジストリ 説明
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
)

4. 署名オブジェクト

COSEは2つの異なる署名構造をサポートします。COSE_Signでは、同じ内容に1つ以上の 署名を適用できます。COSE_Sign1は単一の署名者に限定されます。これらの構造は相互に変換できません。 署名計算には、どの構造が使用されているかを識別するパラメータが含まれるため、変換された構造は署名検証に失敗します。

4.1. 1人以上の 署名者による署名

COSE_Sign構造では、メッセージペイロードに1つ以上の署名を適用できます。 内容に関連するヘッダーパラメータと、署名に関連するヘッダーパラメータは、署名自体とともに運ばれます。 これらのヘッダーパラメータは署名によって認証される場合も、単に存在するだけの場合もあります。 内容に関するヘッダーパラメータの例として、content typeヘッダーパラメータがあります。 署名に関するヘッダーパラメータの例としては、署名を作成するために使用されたアルゴリズムと鍵があります。

[RFC5652]は次のように示しています。

複数の署名が存在する場合、ある署名者に関連付けられた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配列です。配列のフィールドは順に次のとおりです。

protected:
これはセクション3で説明されるとおりです。
unprotected:
これはセクション3で説明されるとおりです。
payload:

このフィールドは、署名されるシリアライズされた内容を含みます。 payloadがメッセージ内に存在しない場合、アプリケーションはpayloadを別途提供する必要があります。 payloadは、変更されずに転送されることを保証するためにbstrでラップされます。 payloadが別途転送される(「detached content」)場合、この位置にはnil CBORオブジェクトが配置され、 それが変更されずに転送されることを保証する責任はアプリケーションにあります。

注: メッセージ復元アルゴリズムを伴う署名が使用される場合(セクション8.1)、復元できる最大バイト数は元のpayloadの長さです。 符号化されたpayloadのサイズは、復元されるバイト数だけ減少します。 元のpayloadのすべてのバイトが消費される場合、転送されるpayloadは存在しないものとしてではなく、 ゼロ長バイト文字列として符号化されます。

signatures:
このフィールドは署名の配列です。各署名は COSE_Signature構造として表されます。

COSE_Signについて上記の本文を表すCDDL断片は次のとおりです。

COSE_Sign = [
    Headers,
    payload : bstr / nil,
    signatures : [+ COSE_Signature]
]

COSE_Signature構造はCBOR配列です。配列のフィールドは順に次のとおりです。

protected:
これはセクション3で説明されるとおりです。
unprotected:
これはセクション3で説明されるとおりです。
signature:
このフィールドは計算された署名値を含みます。 フィールドの型はbstrです。署名値が8ビットの倍数でない場合、アルゴリズムはパディングを指定しなければ MUSTなりません。

COSE_Signatureについて上記の本文を表すCDDL断片は次のとおりです。

COSE_Signature =  [
    Headers,
    signature : bstr
]

4.2. 1人の署名者による署名

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配列です。配列のフィールドは順に次のとおりです。

protected:
これはセクション3で説明されるとおりです。
unprotected:
これはセクション3で説明されるとおりです。
payload:
これはセクション4.1で説明されるとおりです。
signature:
このフィールドは計算された署名値を含みます。 フィールドの型はbstrです。

COSE_Sign1について上記の本文を表すCDDL断片は次のとおりです。

COSE_Sign1 = [
    Headers,
    payload : bstr / nil,
    signature : bstr
]

4.3. 外部から提供される データ

COSEで提供される機能の1つに、アプリケーションが、認証されるべきだがCOSEオブジェクトの一部として 運ばれない追加データを提供できる機能があります。 これをサポートする主な理由は、CoAPメッセージ構造 [RFC7252]を見ると分かります。そこでは、 payloadの前にoptionを運ぶ機能が存在します。 この位置に配置できるデータの例として、CoAPコードまたはCoAP optionがあります。 データがCoAPメッセージのヘッダー内にある場合、それはプロキシがプロキシ処理を行う際に利用できます。 たとえば、Accept optionは、適切な値がプロキシのキャッシュにあるかどうかを判断するために プロキシで使用できます。 送信者はadditional-data機能を使用して、プロキシまたは攻撃者によって行われたAccept値の集合への 変更を検出できるようにできます。このフィールドを外部から提供されるデータに含めることで、 その後の変更は、サーバーのメッセージ処理を失敗させます。

本書は、外部から提供される認証済みデータのバイト配列を使用するためのプロセスを説明します。 バイト配列を構築する方法は、アプリケーションの関数です。 この機能を使用するアプリケーションは、外部から提供される認証済みデータをどのように構築するかを 定義する必要があります。このような構築では、次の問題を考慮する必要があります。

  • 複数の項目が含まれる場合、異なる入力から同じバイト文字列が生成されないことをアプリケーションは 保証する必要があります。 問題のあるシナリオが発生する例として、テキスト文字列「AB」と「CDE」を連結する場合、または テキスト文字列「ABC」と「DE」を連結する場合があります。 これは通常、フィールドを固定幅にすること、および/またはフィールドの長さを出力の一部として 符号化することによって対処されます。 CoAP [RFC7252]のoptionを例として使用すると、 これらのフィールドはTLV構造を使用するため、問題なく連結できます。
  • 複数の項目が含まれる場合、項目の順序を定義する必要があります。 CoAPのoptionを例にすると、アプリケーションはフィールドをoption番号順に並べると述べることができます。
  • アプリケーションは、バイト文字列が両側で同じになることを保証する必要があります。 CoAPのoptionを使用すると、同じ相対番号付けが維持される場合に問題が生じる可能性があります。 中間ノードがoptionを挿入または削除すると、相対番号付けの行われ方が変わります。 アプリケーションは、相対番号が外部データに含まれるoptionだけに対する相対番号として 再符号化されなければならないことを指定する必要があります。

4.4. 署名および 検証プロセス

署名を作成するには、明確に定義されたバイト文字列が必要です。 Sig_structureは正準形式を作成するために使用されます。 この署名および検証プロセスは、本文情報(COSE_SignまたはCOSE_Sign1)、 署名者情報(COSE_Signature)、およびアプリケーションデータ(外部ソース)を入力として取ります。 Sig_structureはCBOR配列です。 Sig_structureのフィールドは順に次のとおりです。

  1. 署名のcontextを識別するcontextテキスト文字列。contextテキスト文字列は次のとおりです。

    • COSE_Signature構造を使用する署名では 「Signature」。
    • COSE_Sign1構造を使用する署名では 「Signature1」。
  2. 本文構造からの保護属性。bstr型で符号化されます。保護属性がない場合は、 ゼロ長バイト文字列が使用されます。
  3. 署名者構造からの保護属性。bstr型で符号化されます。保護属性がない場合は、 ゼロ長バイト文字列が使用されます。このフィールドはCOSE_Sign1署名構造では省略されます。
  4. アプリケーションから外部的に提供されるデータ。bstr型で符号化されます。 このフィールドが提供されない場合、デフォルトでゼロ長バイト文字列になります。(このフィールドの構築に関する アプリケーション向け指針についてはセクション4.3を参照してください。)
  5. 署名されるpayload。bstr型で符号化されます。ここでは、転送方法にかかわらず、 完全なpayloadが使用されます。

上記の本文を記述するCDDL断片は次のとおりです。

Sig_structure = [
    context : "Signature" / "Signature1",
    body_protected : empty_or_serialized_map,
    ? sign_protected : empty_or_serialized_map,
    external_aad : bstr,
    payload : bstr
]

署名を計算する方法は次のとおりです。

  1. Sig_structureを作成し、適切なフィールドを設定します。
  2. セクション 9で説明される符号化を使用して、Sig_structureをバイト文字列に符号化することで ToBeSigned値を作成します。
  3. 署名作成アルゴリズムを呼び出し、K(署名に使用する鍵)、alg(署名に使用する アルゴリズム)、およびToBeSigned(署名される値)を渡します。
  4. 結果として得られた署名値を正しい場所に配置します。 これはCOSE_SignatureまたはCOSE_Sign1構造の「signature」フィールドです。

署名を検証する手順は次のとおりです。

  1. Sig_structureを作成し、適切なフィールドを設定します。
  2. セクション 9で説明される符号化を使用して、Sig_structureをバイト文字列に符号化することで ToBeSigned値を作成します。
  3. 署名検証アルゴリズムを呼び出し、K(検証に使用する鍵)、alg(署名に使用された アルゴリズム)、ToBeSigned(署名される値)、およびsig(検証される署名)を渡します。

署名検証の実行に加えて、アプリケーションは、その鍵が署名主体と正しく対応していること、および 操作を実行する前に署名主体が権限を付与されていることを保証するための適切なチェックを行います。

5. 暗号化オブジェクト

COSEは2つの異なる暗号化構造をサポートします。 COSE_Encrypt0は、使用される鍵が暗黙的に既知であるため受信者構造が不要な場合に使用されます。 COSE_Encryptはそれ以外の場合に使用されます。 これには、複数の受信者が存在する場合、またはdirect(すなわち、事前共有秘密)以外の 受信者アルゴリズムが使用される場合が含まれます。

5.1. エンベロープ化COSE 構造

エンベロープ化構造では、メッセージの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配列です。配列のフィールドは順に次のとおりです。

protected:
これはセクション3で説明されるとおりです。
unprotected:
これはセクション3で説明されるとおりです。
ciphertext:
このフィールドは、bstrとして符号化された 暗号文を含みます。暗号文が暗号化プロセスに関する制御情報とは独立して転送される (すなわち、detached content)場合、このフィールドはnil値として符号化されます。
recipients:
このフィールドは受信者情報構造の配列を 含みます。受信者情報構造の型はCOSE_recipientです。

上記の本文に対応するCDDL断片は次のとおりです。

COSE_Encrypt = [
    Headers,
    ciphertext : bstr / nil,
    recipients : [+COSE_recipient]
]

COSE_recipient構造はCBOR配列です。配列のフィールドは順に次のとおりです。

protected:
これはセクション3で説明されるとおりです。
unprotected:
これはセクション3で説明されるとおりです。
ciphertext:
このフィールドは、bstrとして符号化された 暗号化された鍵を含みます。すべての符号化された鍵は対称鍵です。鍵のバイナリ値が内容です。 暗号化された鍵がない場合、このフィールドはnil値として符号化されます。
recipients:
このフィールドは受信者情報構造の配列を 含みます。受信者情報構造の型はCOSE_recipientです (この例はAppendix Bにあります)。受信者情報構造がない場合、 この要素は存在しません。

COSE_recipientについて上記の本文に対応するCDDL断片は次のとおりです。

COSE_recipient = [
    Headers,
    ciphertext : bstr / nil,
    ? recipients : [+COSE_recipient]
]

5.1.1. コンテンツ鍵 配布方式

暗号化メッセージは、暗号化された内容と、1人以上の受信者向けに暗号化されたCEKから構成されます。 CEKは、各受信者に固有の鍵を使用して、各受信者向けに暗号化されます。 この暗号化の詳細は、受信者アルゴリズムがどのクラスに属するかに依存します。 各クラスの具体的な詳細はセクション8.5にあります。 5つのコンテンツ鍵配布方式の短い概要は次のとおりです。

direct:
CEKは、識別された以前に配布済みの対称鍵と同じであるか、以前に配布済みの秘密から 導出されます。 メッセージ内でCEKは転送されません。
symmetric key-encryption keys (KEKs):
CEKは、以前に配布済みの対称KEKを使用して暗号化されます。 key wrapとも呼ばれます。
key agreement:
受信者の公開鍵と送信者の秘密鍵を使用してペアワイズ秘密を生成し、Key Derivation Function(KDF)を 適用して鍵を導出します。その後、CEKは導出された鍵そのものになるか、導出された鍵によって暗号化されます。
key transport:
CEKは受信者の公開鍵で暗号化されます。
passwords:
CEKは、パスワードから導出されたKEKで暗号化されます。 本書の公開時点では、パスワードアルゴリズムは定義されていません。

5.2. 単一受信者 暗号化

COSE_Encrypt0暗号化構造には、メッセージの受信者を指定する機能はありません。 この構造は、オブジェクトの受信者が、メッセージを復号するために使用する鍵の識別情報をすでに 知っていることを前提としています。鍵を受信者に識別させる必要がある場合は、エンベロープ化構造を 使用するのが望ましいです。

暗号化メッセージの例はAppendix C.4にあります。

COSE_Encrypt0構造は、それが使用されるcontextに応じて、タグ付きまたはタグなしの いずれかとして符号化できます。タグ付きCOSE_Encrypt0構造はCBORタグ16によって識別されます。 これを表すCDDL断片は次のとおりです。

COSE_Encrypt0_Tagged = #6.16(COSE_Encrypt0)

COSE_Encrypt0構造はCBOR配列です。配列のフィールドは順に次のとおりです。

protected:
これはセクション3で説明されるとおりです。
unprotected:
これはセクション3で説明されるとおりです。
ciphertext:
これはセクション5.1で説明されるとおりです。

上記の本文に対応するCOSE_Encrypt0のCDDL断片は次のとおりです。

COSE_Encrypt0 = [
    Headers,
    ciphertext : bstr / nil,
]

5.3. AEADアルゴリズムで 暗号化および復号する方法

AEADアルゴリズムの暗号化アルゴリズムはかなり単純です。最初の手順は、 認証済みデータ構造のための一貫したバイト文字列を作成することです。この目的のために、 Enc_structureを使用します。Enc_structureはCBOR配列です。Enc_structureのフィールドは順に 次のとおりです。

  1. 認証済みデータ構造のcontextを識別するcontextテキスト文字列。 contextテキスト文字列は次のとおりです。

    • COSE_Encrypt0データ構造の コンテンツ暗号化では「Encrypt0」。
    • COSE_Encryptデータ構造の 第1レイヤー(すなわち、コンテンツ暗号化)では「Encrypt」。
    • COSE_Encryptデータ構造に配置される 受信者符号化では「Enc_Recipient」。
    • MACedメッセージ構造に配置される 受信者符号化では「Mac_Recipient」。
    • 受信者構造に配置される 受信者符号化では「Rec_Recipient」。
  2. 本文構造からの保護属性。bstr型で符号化されます。保護属性がない場合は、 ゼロ長バイト文字列が使用されます。
  3. アプリケーションから外部的に提供されるデータ。bstr型で符号化されます。 このフィールドが提供されない場合、デフォルトでゼロ長バイト文字列になります。(このフィールドの構築に関する アプリケーション向け指針についてはセクション4.3を参照してください。)

上記の本文を記述するCDDL断片は次のとおりです。

Enc_structure = [
    context : "Encrypt" / "Encrypt0" / "Enc_Recipient" /
        "Mac_Recipient" / "Rec_Recipient",
    protected : empty_or_serialized_map,
    external_aad : bstr
]

メッセージを暗号化する方法は次のとおりです。

  1. Enc_structureを作成し、適切なフィールドを設定します。
  2. セクション 9で説明される符号化を使用して、Enc_structureをバイト文字列(Additional Authenticated Data(AAD))に符号化します。
  3. 暗号化鍵(K)を決定します。この手順は、使用される 受信者アルゴリズムのクラスに依存します。以下の場合です。

    No Recipients:
    使用する鍵は、現在のレイヤーの アルゴリズムと鍵によって決定されます。例として、key wrap鍵(セクション8.5.2)と事前共有秘密があります。
    Direct Encryption and Direct Key Agreement:
    鍵は受信者構造内の鍵とアルゴリズムによって決定されます。 使用される暗号化アルゴリズムと鍵のサイズは、受信者に使用されるKDFへの入力です。 (directの場合、KDFは恒等操作と考えることができます。) これらのアルゴリズムの例は、[RFC9053]のセクション6.1 および6.3にあります。
    Other:
    鍵はランダムに生成されます。
  4. K(暗号化鍵)、P(平文)、およびAADを指定して暗号化アルゴリズムを呼び出します。 返された暗号文を構造の「ciphertext」フィールドに配置します。
  5. non-directアルゴリズムを使用するメッセージの受信者については、K(暗号化鍵)を 平文として使用し、その受信者に対して暗号化アルゴリズムを再帰的に実行します。

メッセージを復号する方法は次のとおりです。

  1. Enc_structureを作成し、適切なフィールドを設定します。
  2. セクション9で説明される符号化を 使用して、Enc_structureをバイト文字列(AAD)に符号化します。
  3. 復号鍵を決定します。この手順は、使用される受信者アルゴリズムの クラスに依存します。以下の場合です。

    No Recipients:
    使用する鍵は、現在のレイヤーの アルゴリズムと鍵によって決定されます。例として、key wrap鍵(セクション8.5.2)と事前共有秘密があります。
    Direct Encryption and Direct Key Agreement:
    鍵は受信者構造内の鍵とアルゴリズムによって決定されます。 使用される暗号化アルゴリズムと鍵のサイズは、受信者に使用されるKDFへの入力です。 (directの場合、KDFは恒等操作と考えることができます。)
    Other:
    鍵は、受信者構造の1つを デコードおよび復号することによって決定されます。
  4. K(使用する復号鍵)、C(暗号文)、およびAADを指定して復号アルゴリズムを 呼び出します。

5.4. AEアルゴリズムで 暗号化および復号する方法

メッセージを暗号化する方法は次のとおりです。

  1. 「protected」フィールドがゼロ長バイト文字列であることを検証します。
  2. この操作に外部の追加認証済みデータが提供されていないことを検証します。
  3. 暗号化鍵を決定します。この手順は、使用される受信者アルゴリズムの クラスに依存します。以下の場合です。

    No Recipients:
    使用する鍵は、現在のレイヤーの アルゴリズムと鍵によって決定されます。例として、key wrap鍵(セクション8.5.2)と事前共有秘密があります。
    Direct Encryption and Direct Key Agreement:
    鍵は受信者構造内の鍵と アルゴリズムによって決定されます。使用される暗号化アルゴリズムと鍵のサイズは、 受信者に使用されるKDFへの入力です。(directの場合、KDFは恒等操作と考えることができます。) これらのアルゴリズムの例は、[RFC9053]のセクション6.1 および6.3にあります。
    Other:
    鍵はランダムに生成されます。
  4. K(使用する暗号化鍵)とP(平文)を指定して暗号化アルゴリズムを呼び出します。 返された暗号文を構造の「ciphertext」フィールドに配置します。
  5. non-directアルゴリズムを使用するメッセージの受信者については、K(暗号化鍵)を 平文として使用し、その受信者に対して暗号化アルゴリズムを再帰的に実行します。

メッセージを復号する方法は次のとおりです。

  1. 「protected」フィールドがゼロ長バイト文字列であることを検証します。
  2. この操作に外部の追加認証済みデータが提供されていないことを検証します。
  3. 復号鍵を決定します。この手順は、使用される受信者アルゴリズムの クラスに依存します。以下の場合です。

    No Recipients:
    使用する鍵は、現在のレイヤーの アルゴリズムと鍵によって決定されます。例として、key wrap鍵(セクション8.5.2)と事前共有秘密があります。
    Direct Encryption and Direct Key Agreement:
    鍵は受信者構造内の鍵と アルゴリズムによって決定されます。使用される暗号化アルゴリズムと鍵のサイズは、 受信者に使用されるKDFへの入力です。(directの場合、KDFは恒等操作と考えることができます。) これらのアルゴリズムの例は、[RFC9053]のセクション6.1 および6.3にあります。
    Other:
    鍵は、受信者構造の1つを デコードおよび復号することによって決定されます。
  4. K(使用する復号鍵)とC(暗号文)を指定して復号アルゴリズムを呼び出します。

6. MACオブジェクト

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メッセージ構造で取得できます。

6.1. 受信者付き MACedメッセージ

複数受信者の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配列です。配列のフィールドは順に次のとおりです。

protected:
これはセクション3で説明されるとおりです。
unprotected:
これはセクション3で説明されるとおりです。
payload:
このフィールドは、MACedされる シリアライズされた内容を含みます。payloadがメッセージ内に存在しない場合、アプリケーションは payloadを別途提供する必要があります。payloadは、変更されずに転送されることを保証するために bstrでラップされます。payloadが別途転送される(すなわち、detached content)場合、この位置には nil CBOR値が配置され、変更されずに転送されることを保証する責任はアプリケーションにあります。
tag:
このフィールドはMAC値を含みます。
recipients:
これはセクション5.1で説明されるとおりです。

COSE_Macについて上記の本文を表すCDDL断片は次のとおりです。

COSE_Mac = [
   Headers,
   payload : bstr / nil,
   tag : bstr,
   recipients : [+COSE_recipient]
]

6.2. 暗黙鍵を用いる MACedメッセージ

このセクションでは、受信者が暗黙的に既知である場合に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配列です。配列のフィールドは順に次のとおりです。

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のフィールドは順に次のとおりです。

  1. 符号化される構造を識別するcontextテキスト文字列。 このcontextテキスト文字列は、COSE_Mac構造では「MAC」です。このcontextテキスト文字列は、 COSE_Mac0構造では「MAC0」です。
  2. 本文構造からの保護属性。保護属性がない場合は、ゼロ長bstrが使用されます。
  3. アプリケーションから外部的に提供されるデータ。bstr型として符号化されます。 このフィールドが提供されない場合、デフォルトでゼロ長バイト文字列になります。(このフィールドの構築に関する アプリケーション向け指針についてはセクション4.3を参照してください。)
  4. MACedされるpayload。bstr型で符号化されます。ここでは、転送方法にかかわらず、 完全なpayloadが使用されます。

上記の本文に対応するCDDL断片は次のとおりです。

MAC_structure = [
     context : "MAC" / "MAC0",
     protected : empty_or_serialized_map,
     external_aad : bstr,
     payload : bstr
]

MACを計算する手順は次のとおりです。

  1. MAC_structureを作成し、適切なフィールドを設定します。
  2. セクション9で説明される符号化を 使用して、MAC_structureをバイト文字列に符号化することでToBeMaced値を作成します。
  3. MAC作成アルゴリズムを呼び出し、K(使用する鍵)、alg(MACに使用する アルゴリズム)、およびToBeMaced(MACを計算する対象の値)を渡します。
  4. 結果として得られたMACをCOSE_MacまたはCOSE_Mac0構造の「tag」フィールドに 配置します。
  5. COSE_Mac構造では、メッセージの各受信者向けにMAC鍵を暗号化し符号化します。

MACを検証する手順は次のとおりです。

  1. MAC_structureを作成し、適切なフィールドを設定します。
  2. セクション9で説明される符号化を 使用して、MAC_structureをバイト文字列に符号化することでToBeMaced値を作成します。
  3. COSE_Mac構造では、受信者構造の1つをデコードおよび復号することによって暗号鍵を取得します。
  4. MAC作成アルゴリズムを呼び出し、K(使用する鍵)、alg(MACに使用する アルゴリズム)、およびToBeMaced(MACを計算する対象の値)を渡します。
  5. MAC値をCOSE_MacまたはCOSE_Mac0構造の「tag」フィールドと比較します。

7. 鍵オブジェクト

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]

7.1. COSE Key共通 パラメータ

本文書は、COSE Keyオブジェクトの共通パラメータの集合を定義します。表4は、このセクションで定義されるパラメータの概要を 提供します。特定の鍵型向けに定義されるパラメータもあります。 鍵型固有のパラメータは[RFC9053]にあります。

表4: Key Mapラベル
名前 ラベル 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
kty:
このパラメータは、この構造に対する 鍵のファミリー、したがって検出されるべき鍵型固有パラメータの集合を識別するために使用されます。 本文書で定義される値の集合は[COSE.KeyTypes]にあります。このパラメータは 鍵オブジェクト内に存在しなければMUSTなりません。実装は、 処理中のアルゴリズムに対して鍵型が適切であることを検証しなければMUSTなりません。鍵型は、信頼判断プロセスの一部として含められなければ MUSTなりません。
alg:
このパラメータは、鍵とともに使用される アルゴリズムを制限するために使用されます。このパラメータが鍵構造内に存在する場合、アプリケーションは、 このアルゴリズムがその鍵が使用されるアルゴリズムと一致することを検証しなければ MUSTなりません。アルゴリズムが一致しない場合、この鍵オブジェクトは 暗号操作を実行するために使用してはMUST NOTなりません。同じ鍵が、異なるアルゴリズムを指定した、または アルゴリズムを指定しない別の鍵構造内に存在することもできます。ただし、これは不適切なセキュリティ慣行と見なされます。
kid:
このパラメータは、鍵の識別子を与えるために 使用されます。識別子は構造化されておらず、ユーザーが提供したバイト文字列から、鍵の公開部分に基づいて 計算された値まで、任意のものにできます。このフィールドは、確認が必要な鍵の集合を絞り込むために、 メッセージ内の「kid」パラメータと照合することを意図しています。 識別子の値は一意の値ではなく、異なる鍵であっても他の鍵オブジェクトに出現する可能性があります。
key_ops:
このパラメータは、鍵が使用されるべき 操作の集合を制限するために定義されています。フィールドの値は、表5からの 値の配列です。アルゴリズムは、現れてよいkey opsの値と、特定の操作に必要な値を定義します。 値の集合は[RFC7517]および [W3C.WebCrypto]のものと一致します。
Base IV:

このパラメータは、IVの基底部分を運ぶために定義されています。 これは、セクション3.1で定義される Partial IVヘッダーパラメータとともに使用されるように設計されています。このフィールドは、 鍵にBase IVを関連付け、その後、メッセージごとにPartial IVで変更できるようにします。

アプリケーションでBase IVを使用するときは、極めて慎重に扱う必要があります。 多くの暗号化アルゴリズムは、同じIVが2回使用されるとセキュリティを失います。

送信者ごとに異なる鍵が導出される場合、同じBase IVから開始しても、この条件を満たす可能性が高いです。 同じ鍵が複数の送信者に使用される場合、アプリケーションは送信者間でIV空間を分割する方法を 提供する必要があります。 これは、開始する異なる基点、または開始用の異なるPartial IVを提供し、鍵更新前に送信される メッセージ数を制限することで行えます。

表5: 鍵操作値
名前 説明
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の検証に使用されます。

8. COSEで使用されるアルゴリズムの分類

このセクションでは、COSEで使用できるさまざまなアルゴリズム型の分類を示します。 この分類は網羅的であると見なすべきではありません。 この分類に当てはまらない新しいアルゴリズムが作成されるでしょう。

8.1. 署名アルゴリズム

署名アルゴリズムは、データ発信元およびデータ完全性サービスを提供します。 データ発信元は、誰がデータに署名したかに基づいて、誰がデータを発信したかを推定できる能力を提供します。 データ完全性は、署名されて以降データが変更されていないことを検証できる能力を提供します。

署名アルゴリズム方式には、一般に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向けのメッセージ復元署名アルゴリズムは、まだ正式には定義されていません。この方式から生じる 新しい制約を考えると、いくつかの問題はすでに特定されていますが、メッセージ復元署名アルゴリズムを 統合するときに追加の問題が発生する可能性は高いです。 最初に定義されるアルゴリズムは、これらの問題について決定を行う必要があり、それらの決定は、 その後定義されるあらゆるアルゴリズムを拘束する可能性があります。

以下では次の用語を使用します。

message content bytes:
署名されるためにアプリケーションから提供される バイト文字列。
to-be-signed bytes:
署名アルゴリズムに渡される バイト文字列。
recovered bytes:
署名検証プロセス中に復元されるバイト。

すでに特定されている問題の一部は次のとおりです。

  • to-be-signed bytesはmessage content bytesと同じではありません。 これは、署名処理中により大きなto-be-signedメッセージを構築するためです。 recovered bytesの長さはmessage contentの長さを超える場合がありますが、to-be-signed bytesの長さは 超えません。 これは、たとえば外部から提供されるデータに機密情報が含まれる場合、プライバシー上の考慮事項につながる可能性があります。
  • recovered bytesにはmessage content bytesにないデータが含まれるため、recovered bytesが to-be-signed bytesのどこに対応するかを判断することが困難な場合があります。 それを防ぐためにパディング方式を作成することが1つの可能な選択肢です。
  • すべてのメッセージ復元署名アルゴリズムが、to-be-signed bytesの末尾からrecovered bytesを取得するわけではありません。 これは問題です。なぜなら、message content bytesはto-be-signed bytesの末尾にあるためです。 復元されるバイトがto-be-signed bytesの末尾ではなく先頭から取得される場合、デフォルトでは、 message content bytesのどれもrecovered bytesに含まれない可能性があります。 これに対処するための1つの選択肢は、recovered bytesがto-be-signed bytesの末尾ではなく先頭から 取得される場合に、to-be-signed dataを反転することです。

署名アルゴリズムは、COSE_SignatureおよびCOSE_Sign1構造とともに使用されます。 本稿執筆時点では、COSEで使用するために定義されているのは付録付き署名だけです。しかし、 可能な実効的サイズ削減のため、メッセージ復元付き署名アルゴリズムの使用に大きな関心が示されています。

8.2. メッセージ認証コード (MAC)アルゴリズム

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構造で使用されます。

8.3. コンテンツ暗号化 アルゴリズム

コンテンツ暗号化アルゴリズムは、対称鍵を使用して、潜在的に大きなデータブロックに データ機密性を提供します。それらは暗号化されたデータの完全性を提供します。しかし、データ発信元は まったく提供しないか、非常に限定的にしか提供しません。(たとえば、送信者の身元を第三者に証明するためには 使用できません。)データ発信元を提供する能力は、CEKがどのように取得されるかに結び付いています。

COSEは、正当なコンテンツ暗号化アルゴリズムの集合を、内容と追加データの両方の 認証をサポートするものに制限します。暗号化プロセスは何らかの種類の認証値を生成しますが、 その値はアルゴリズム定義の観点で明示的である場合も暗黙的である場合もあります。単純化のため、 認証コードは通常、暗号文ストリームに追加されるものとして定義されます。暗号化関数は次のとおりです。

ciphertext = Encrypt(message content, key, additional data)

valid, message content = Decrypt(ciphertext, key, additional data)

ほとんどのAEADアルゴリズムは、復号が有効な場合にのみメッセージ内容を返すものとして 論理的に定義されています。多くの実装はこの慣例に従いますが、すべてではありません。復号が検証されない場合、 メッセージ内容を使用してはMUST NOTなりません。

これらのアルゴリズムはCOSE_EncryptおよびCOSE_Encrypt0で使用されます。

8.4. 鍵導出関数 (KDF)

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に基づく鍵材料の使用は、 良いセキュリティ慣行と見なされます。

8.5. コンテンツ鍵配布 方式

コンテンツ鍵配布方式(受信者アルゴリズム)は、いくつかの異なるクラスに定義できます。 COSEには、多くのクラスの受信者アルゴリズムをサポートする能力があります。 このセクションでは、いくつかのクラスを列挙します。[RFC7516]で 定義される受信者アルゴリズムクラスについては、同じ名前を使用します。 他の仕様では、受信者アルゴリズムクラスに異なる用語を使用するか、受信者アルゴリズムクラスの一部を サポートしていません。

8.5.1. 直接暗号化

Direct Encryptionクラスのアルゴリズムは、送信者と受信者の間で秘密を共有し、 それを直接、または操作後にCEKとして使用します。direct-encryptionモードが使用される場合、 それはメッセージ上で使用される唯一のモードでなければMUSTなりません。

受信者のCOSE_Recipient構造は次のように構成されます。

  • 「protected」フィールドは、コンテンツ鍵の計算で使用される 場合を除き、ゼロ長バイト文字列でなければMUSTなりません。
  • 「alg」ヘッダーパラメータは存在しなければ MUSTなりません。
  • 共有秘密を識別するヘッダーパラメータが存在すべき SHOULDです。
  • 「ciphertext」フィールドはゼロ長バイト文字列でなければ MUSTなりません。
  • 「recipients」フィールドは存在しては MUSTなりません。

8.5.2. Key Wrap

key wrapモードでは、CEKがランダムに生成され、その鍵は送信者と受信者の間の 共有秘密によって暗号化されます。COSE向けに現在定義されているすべてのkey wrapアルゴリズムは AEアルゴリズムです。システムがランダム鍵生成を行う能力を少しでも持つ場合、key wrapモードは Direct Encryptionより優れていると見なされます。これは、共有鍵が、ある程度の構造を持ち、 実際に同じ内容を繰り返している可能性のあるデータではなく、ランダムデータをラップするために 使用されるからです。key wrapの使用では、direct-encryptionアルゴリズムによって提供される 弱いデータ発信元性が失われます。

受信者のCOSE_Recipient構造は次のように構成されます。

  • key wrapアルゴリズムがAEアルゴリズムである場合、 「protected」フィールドはゼロ長バイト文字列でなければMUSTなりません。
  • 「recipients」フィールドは通常存在しませんが、使用できます。 アプリケーションは、サポートされていないアルゴリズムを持つrecipientフィールドが存在する場合に 対処しなければMUSTなりません。 その特定の受信者の復号に失敗することは、それに対処する許容可能な方法です。 メッセージの処理に失敗することは、それに対処する許容可能な方法ではありません。
  • 暗号化される平文は、1つ下のレイヤー(通常は コンテンツレイヤー)からの鍵です。
  • 最低限、「unprotected」フィールドは「alg」 ヘッダーパラメータを含まなければMUSTならず、共有秘密を識別するヘッダーパラメータを含むべき SHOULDです。

8.5.3. 鍵トランスポート

key transportモードは、一部の標準ではkey encryptionモードとも呼ばれます。 key transportモードは、鍵を保護するために対称暗号化アルゴリズムではなく非対称暗号化アルゴリズムを 使用する点でkey wrapモードと異なります。 key transportアルゴリズムの集合は[RFC8230]で定義されています。

key transportアルゴリズムを使用するとき、受信者のCOSE_Recipient構造は 次のように構成されます。

  • 「protected」フィールドはゼロ長バイト文字列でなければ MUSTなりません。
  • 暗号化される平文は、1つ下のレイヤー(通常は コンテンツレイヤー)からの鍵です。
  • 最低限、「unprotected」フィールドは「alg」 ヘッダーパラメータを含まなければMUSTならず、非対称鍵を識別するパラメータを含むべき SHOULDです。

8.5.4. 直接鍵共有

Direct Key Agreementクラスの受信者アルゴリズムは、鍵共有方式を使用して 共有秘密を作成します。その後KDFが共有秘密に適用され、データを保護するために使用される鍵を導出します。 この鍵は通常、CEKまたはMAC鍵として使用されますが、2つを超えるレイヤーが使用されている場合は 他の目的に使用されることもあります(Appendix Bを参照)。

最も一般的に使用される鍵共有アルゴリズムはDiffie-Hellmanですが、他の 変種も存在します。COSEはオンライン環境ではなくストアアンドフォワード環境向けに設計されているため、 メッセージの受信者が動的鍵材料を提供できないので、多くのDH変種は使用できません。 この副作用の1つは、forward secrecy([RFC4949]を参照)が達成できないことです。 COSEオブジェクトの受信者には常に静的鍵が使用されます。

サポートされるDHの2つの変種は次のとおりです。

Ephemeral-Static (ES) DH:
メッセージの送信者は1回限りのDH鍵を作成し、 受信者には静的鍵を使用します。エフェメラル送信者鍵を使用することは、各メッセージごとに ランダムに生成されるため、追加のランダム入力が不要であることを意味します。
Static-Static (SS) DH:
送信者と受信者の両方に静的鍵が使用されます。 静的鍵の使用により、受信者はメッセージについて弱い形式のデータ発信元性を得ることができます。 Static-Static鍵共有が使用される場合、各メッセージに対して異なる鍵が作成されることを保証するため、 KDFに対して何らかの一意なデータが必要です。

direct key agreementモードが使用される場合、メッセージ内の受信者は1人だけで なければMUSTなりません。この方式は鍵を直接作成するため、追加の 受信者と混在させることが困難です。複数の受信者が必要な場合は、key wrap付きの版を使用する必要があります。

受信者のCOSE_Recipient構造は次のように構成されます。

  • 最低限、ヘッダーは「alg」ヘッダーパラメータを含まなければ MUSTならず、受信者の非対称鍵を識別するヘッダーパラメータを 含むべきSHOULDです。
  • ヘッダーはStatic-Static版では送信者の鍵を識別すべき SHOULDであり、ephemeral-static版では送信者のエフェメラル鍵を 含まなければMUSTなりません。

8.5.5. Key Wrap付き 鍵共有

Key Agreement with Key Wrapは、ランダムに生成されたCEKを使用します。 その後CEKは、鍵共有アルゴリズムによって計算された共有秘密から導出された鍵と、key wrap アルゴリズムを使用して暗号化されます。この関数は次のようになります。

encryptedKey = KeyWrap(KDF(DH-Shared, context), CEK)

受信者のCOSE_Recipient構造は次のように構成されます。

  • 「protected」フィールドはKDF context構造に入力されます。
  • 暗号化される平文は、1つ下のレイヤー(通常は コンテンツレイヤー)からの鍵です。
  • 「alg」ヘッダーパラメータはそのレイヤー内に 存在しなければMUSTなりません。
  • 受信者の鍵を識別するヘッダーパラメータが存在すべき SHOULDです。送信者の鍵を識別するヘッダーパラメータが 存在すべきSHOULDです。

9. CBOR符号化制限

本文書は、CBOR Encoderがどのように動作する必要があるかについて課す制限を限定しています。 新しい符号化制限は、RFC 8949 [STD94]のセクション4.2.1で 規定されるCore Deterministic Encoding Requirementsと整合しています。 これは次の制限に絞り込まれています。

10. アプリケーションプロファイル化に関する考慮事項

本文書は、一連のセキュリティサービスを提供するように設計されていますが、 特定の用途に対するアルゴリズム実装要件を課すものではありません。相互運用性要件は、個々のサービスの それぞれがどのように使用されるか、および相互運用性のためにアルゴリズムがどのように使用されるかについて 提供されます。どのアルゴリズムとどのサービスが必要かに関する要件は、各アプリケーションに委ねられます。

プロファイルの例は[RFC8613]にあり、 そこではCoAPヘッダーと組み合わせてコンテンツを運ぶためのものが開発されました。

本文書のプロファイルが作成され、その特定のアプリケーションに対する相互運用性要件を 定義することが意図されています。このセクションは、本文書をプロファイル化するときに考慮する必要のある 指針とトピックの集合を提供します。

11. IANAに関する考慮事項

以下に列挙されるレジストリおよび登録は、RFC 8152 [RFC8152]によって定義されました。 以下の措置の大部分は、参照先を本文書に向けるよう更新するものです。

[RFC9053][RFC8152]によって 元々確立されたレジストリおよび登録を更新しますが、要求される更新は相互に排他的であることに注意してください。 本文書で要求される更新は、[RFC9053]で要求される更新と 競合または重複せず、その逆も同様です。

11.1. COSE Header Parameters レジストリ

「COSE Header Parameters」レジストリは[RFC8152]によって定義されました。 IANAは、このレジストリの参照を[RFC8152]ではなく本文書を指すように更新しました。IANAはまた、 「counter signature」および「CounterSignature0」を除き、[RFC8152]を参照していた すべてのエントリを本文書を参照するように更新しました。「counter signature」および「CounterSignature0」の参照は、引き続き[RFC8152]を参照します。

11.2. COSE Key Common Parametersレジストリ

「COSE Key Common Parameters」レジストリ[COSE.KeyParameters][RFC8152]で定義されました。 IANAは、このレジストリの参照を[RFC8152]ではなく本文書を指すように更新しました。IANAはまた、 [RFC8152]を参照していたエントリを本文書を参照するように 更新しました。

11.3. メディア型登録

11.3.1. COSEセキュリティメッセージ

IANAは、「Media Types」レジストリに「application/cose」メディア型を 登録しました。このメディア型は、内容がCOSEメッセージであることを示すために使用されます。

型名:
application
サブタイプ名:
cose
必須パラメータ:
N/A
任意パラメータ:
cose-type
符号化に関する考慮事項:
binary
セキュリティに関する考慮事項:
RFC 9052の「Security Considerations」 セクションを参照してください。
相互運用性に関する考慮事項:
N/A
公開された仕様:
RFC 9052
このメディア型を使用するアプリケーション:
HTTP(S)トランスポート上でセキュリティ コンテンツを送信するIoTアプリケーション。
フラグメント識別子に関する考慮事項:
N/A
追加情報:
  • この型の非推奨エイリアス名: N/A
  • マジックナンバー: N/A
  • ファイル拡張子: cbor
  • Macintoshファイルタイプコード: N/A
詳細情報の連絡先となる人物およびメールアドレス:

iesg@ietf.org
意図される用途:
COMMON
使用上の制限:
N/A
著者:
Jim Schaad
変更管理者:
IESG
暫定登録か?
いいえ

11.3.2. COSE Keyメディア型

IANAは、「Media Types」レジストリに「application/cose-key」および 「application/cose-key-set」メディア型を登録しました。これらのメディア型は、それぞれ内容が COSE_KeyまたはCOSE_KeySetオブジェクトであることを示すために使用されます。

「application/cose-key」のテンプレートは次のとおりです。

型名:
application
サブタイプ名:
cose-key
必須パラメータ:
N/A
任意パラメータ:
N/A
符号化に関する考慮事項:
binary
セキュリティに関する考慮事項:
RFC 9052の「Security Considerations」 セクションを参照してください。
相互運用性に関する考慮事項:
N/A
公開された仕様:
RFC 9052
このメディア型を使用するアプリケーション:
IoTアプリケーション向けの COSEベース鍵の配布。
フラグメント識別子に関する考慮事項:
N/A
追加情報:
  • この型の非推奨エイリアス名: N/A
  • マジックナンバー: N/A
  • ファイル拡張子: cbor
  • Macintoshファイルタイプコード: N/A
詳細情報の連絡先となる人物およびメールアドレス:

iesg@ietf.org
意図される用途:
COMMON
使用上の制限:
N/A
著者:
Jim Schaad
変更管理者:
IESG
暫定登録か?
いいえ

「application/cose-key-set」を登録するためのテンプレートは次のとおりです。

型名:
application
サブタイプ名:
cose-key-set
必須パラメータ:
N/A
任意パラメータ:
N/A
符号化に関する考慮事項:
binary
セキュリティに関する考慮事項:
RFC 9052の「Security Considerations」 セクションを参照してください。
相互運用性に関する考慮事項:
N/A
公開された仕様:
RFC 9052
このメディア型を使用するアプリケーション:
IoTアプリケーション向けのCOSEベース鍵の配布。
フラグメント識別子に関する考慮事項:
N/A
追加情報:
  • この型の非推奨エイリアス名: N/A
  • マジックナンバー: N/A
  • ファイル拡張子: cbor
  • Macintoshファイルタイプコード: N/A
詳細情報の連絡先となる人物およびメールアドレス:
iesg@ietf.org
意図される用途:
COMMON
使用上の制限:
N/A
著者:
Jim Schaad
変更管理者:
IESG
暫定登録か?
いいえ

11.4. CoAP Content-Formats レジストリ

IANAは、[RFC8152]で示されたとおり、「CoAP Content-Formats」レジストリに エントリを追加しました。IANAは、参照を[RFC8152]ではなく 本文書を指すように更新しました。

11.5. CBOR Tagsレジストリ

IANAは、[RFC8152]で示されたとおり、「CBOR Tags」レジストリにエントリを追加しました。 IANAは、参照を[RFC8152]ではなく本文書を 指すように更新しました。

11.6. 専門家レビュー 指示

[RFC8152]によって確立されたすべてのIANAレジストリは、少なくとも一部が Expert Review [RFC8126]として定義されています。このセクションは、 専門家が何を見るべきかについての一般的な指針を示しますが、専門家として指定されているのには理由があるため、 十分な裁量が与えられるべきです。

専門家レビュー担当者は、次を考慮すべきです。

  • ポイント占有は抑制されるべきです。レビュー担当者は、 登録要求について十分な情報を得て、その使用が既存の登録と重複しないこと、およびそのコードポイントが デプロイメントで使用される可能性が高いことを確認するよう奨励されます。私的使用としてタグ付けされた 範囲は、テスト目的および閉じた環境を意図しています。他の範囲のコードポイントは、テスト用に割り当てるべきではありません。
  • Standards Action範囲にコードポイントを登録するには、 Standards TrackまたはBCP RFCが必要です。Specification Required範囲については仕様が存在すべきですが、 RFCが利用可能になる前の早期割り当ては許容されると見なされます。first-come, first-served範囲については、 そのポイントが閉じた環境の外で相互運用可能な形で使用されることが期待される場合、仕様が必要です。 仕様が提供されない場合、提供される説明には、そのポイントが何に使用されるのかを識別するのに十分な情報が必要です。
  • 専門家は、コードポイント割り当てを承認するとき、フィールドの 想定される使用を考慮すべきです。 Standards Action範囲がStandards Track文書にのみ利用可能であるという事実は、 Standards Track文書がその範囲外にポイントを割り当てられないことを意味しません。 符号化値の長さは、その長さのコードポイントがどれだけ残っているか、およびそれが使用されるデバイスの サイズと比較検討されるべきです。
  • アルゴリズムが登録されるとき、虚栄的な登録は抑制されるべきです。 これを行う1つの方法は、登録に対してアルゴリズムのセキュリティ分析に関する追加文書の提供を要求することです。 もう1つ考慮すべきことは、そのアルゴリズムについてCrypto Forum Research Group(CFRG)の意見を求めることです。 アルゴリズムは、登録に適するために、コミュニティのセキュリティ要件とメッセージ構造の要件を 満たすことが期待されます。

12. セキュリティに関する考慮事項

本仕様の実装者が考慮する必要のあるセキュリティ上の考慮事項がいくつかあります。 ここで強調されている考慮事項もありますが、追加の考慮事項は参考文献に列挙された文書にあります。

実装は、すべての個人の秘密鍵材料を保護する必要があります。本文書のいくつかの ケースは、この問題に関して強調する必要があります。

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 」として定義できます。)

13. 参考文献

13.1. 規範的参考文献

[RFC2119]
Bradner, S., 「RFCで要件レベルを示すために 使用するキーワード」, BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC8174]
Leiba, B., 「RFC 2119キーワードにおける 大文字と小文字の曖昧さ」, BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.
[RFC9053]
Schaad, J., 「CBOR Object Signing and Encryption(COSE):初期アルゴリズム」, RFC 9053, DOI 10.17487/RFC9053, , <https://www.rfc-editor.org/info/rfc9053>.
[STD94]
Bormann, C. and P. Hoffman, 「Concise Binary Object Representation(CBOR)」, STD 94, RFC 8949, , <https://www.rfc-editor.org/info/std94>.

13.2. 参考情報としての参考文献

[BCP201]
Housley, R., 「暗号アルゴリズムのアジリティと 必須実装アルゴリズム選択のための指針」, BCP 201, RFC 7696, , <https://www.rfc-editor.org/info/bcp201>.
[COAP.Formats]
IANA, 「CoAP Content-Formats」, <https://www.iana.org/assignments/core-parameters/>.
[CORE-GROUPCOMM]
Dijk, E., Wang, C., and M. Tiloca, 「Constrained Application Protocol (CoAP)のためのグループ通信」, 作業中, Internet-Draft, draft-ietf-core-groupcomm-bis-07, , <https://datatracker.ietf.org/doc/html/draft-ietf-core-groupcomm-bis-07>.
[COSE-COUNTERSIGN]
Schaad, J. and R. Housley, 「CBOR Object Signing and Encryption(COSE):副署名」, 作業中, Internet-Draft, draft-ietf-cose-countersign-08, , <https://datatracker.ietf.org/doc/html/draft-ietf-cose-countersign-08>.
[COSE.Algorithms]
IANA, 「COSE Algorithms」, <https://www.iana.org/assignments/cose/>.
[COSE.KeyParameters]
IANA, 「COSE Key Common Parameters」, <https://www.iana.org/assignments/cose/>.
[COSE.KeyTypes]
IANA, 「COSE Key Types」, <https://www.iana.org/assignments/cose/>.
[DSS]
National Institute of Standards and Technology, 「Digital Signature Standard(DSS)」, FIPS 186-4, DOI 10.6028/NIST.FIPS.186-4, , <https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf>.
[GitHub-Examples]
「COSEのGitHub例」, commit 3221310, , <https://github.com/cose-wg/Examples>.
[PVSig]
Brown, D.R.L. and D.B. Johnson, 「部分メッセージ復元付き署名方式の形式的セキュリティ証明」, LNCS Volume 2020, DOI 10.1007/3-540-45353-9_11, , <https://www.certicom.com/content/dam/certicom/images/pdfs/CerticomWP-PVSigSec_login.pdf>.
[RFC2633]
Ramsdell, B., Ed., 「S/MIME Version 3 Message Specification」, RFC 2633, DOI 10.17487/RFC2633, , <https://www.rfc-editor.org/info/rfc2633>.
[RFC3394]
Schaad, J. and R. Housley, 「Advanced Encryption Standard(AES)Key Wrap Algorithm」, RFC 3394, DOI 10.17487/RFC3394, , <https://www.rfc-editor.org/info/rfc3394>.
[RFC3851]
Ramsdell, B., Ed., 「Secure/Multipurpose Internet Mail Extensions(S/MIME)Version 3.1 Message Specification」, RFC 3851, DOI 10.17487/RFC3851, , <https://www.rfc-editor.org/info/rfc3851>.
[RFC4262]
Santesson, S., 「Secure/Multipurpose Internet Mail Extensions(S/MIME)CapabilitiesのためのX.509証明書拡張」, RFC 4262, DOI 10.17487/RFC4262, , <https://www.rfc-editor.org/info/rfc4262>.
[RFC4949]
Shirey, R., 「Internet Security Glossary, Version 2」, FYI 36, RFC 4949, DOI 10.17487/RFC4949, , <https://www.rfc-editor.org/info/rfc4949>.
[RFC5116]
McGrew, D., 「認証付き暗号のためのインターフェースと アルゴリズム」, RFC 5116, DOI 10.17487/RFC5116, , <https://www.rfc-editor.org/info/rfc5116>.
[RFC5652]
Housley, R., 「Cryptographic Message Syntax (CMS)」, STD 70, RFC 5652, DOI 10.17487/RFC5652, , <https://www.rfc-editor.org/info/rfc5652>.
[RFC5751]
Ramsdell, B. and S. Turner, 「Secure/Multipurpose Internet Mail Extensions(S/MIME)Version 3.2 Message Specification」, RFC 5751, DOI 10.17487/RFC5751, , <https://www.rfc-editor.org/info/rfc5751>.
[RFC5752]
Turner, S. and J. Schaad, 「Cryptographic Message Syntax(CMS)における複数署名」, RFC 5752, DOI 10.17487/RFC5752, , <https://www.rfc-editor.org/info/rfc5752>.
[RFC5990]
Randall, J., Kaliski, B., Brainard, J., and S. Turner, 「Cryptographic Message Syntax(CMS)におけるRSA-KEM Key Transport Algorithmの使用」, RFC 5990, DOI 10.17487/RFC5990, , <https://www.rfc-editor.org/info/rfc5990>.
[RFC6838]
Freed, N., Klensin, J., and T. Hansen, 「メディア型仕様および登録手続き」, BCP 13, RFC 6838, DOI 10.17487/RFC6838, , <https://www.rfc-editor.org/info/rfc6838>.
[RFC7252]
Shelby, Z., Hartke, K., and C. Bormann, 「Constrained Application Protocol(CoAP)」, RFC 7252, DOI 10.17487/RFC7252, , <https://www.rfc-editor.org/info/rfc7252>.
[RFC7515]
Jones, M., Bradley, J., and N. Sakimura, 「JSON Web Signature(JWS)」, RFC 7515, DOI 10.17487/RFC7515, , <https://www.rfc-editor.org/info/rfc7515>.
[RFC7516]
Jones, M. and J. Hildebrand, 「JSON Web Encryption(JWE)」, RFC 7516, DOI 10.17487/RFC7516, , <https://www.rfc-editor.org/info/rfc7516>.
[RFC7517]
Jones, M., 「JSON Web Key(JWK)」, RFC 7517, DOI 10.17487/RFC7517, , <https://www.rfc-editor.org/info/rfc7517>.
[RFC7518]
Jones, M., 「JSON Web Algorithms(JWA)」, RFC 7518, DOI 10.17487/RFC7518, , <https://www.rfc-editor.org/info/rfc7518>.
[RFC8032]
Josefsson, S. and I. Liusvaara, 「Edwards-Curve Digital Signature Algorithm(EdDSA)」, RFC 8032, DOI 10.17487/RFC8032, , <https://www.rfc-editor.org/info/rfc8032>.
[RFC8126]
Cotton, M., Leiba, B., and T. Narten, 「RFCでIANA Considerationsセクションを 書くための指針」, BCP 26, RFC 8126, DOI 10.17487/RFC8126, , <https://www.rfc-editor.org/info/rfc8126>.
[RFC8152]
Schaad, J., 「CBOR Object Signing and Encryption(COSE)」, RFC 8152, DOI 10.17487/RFC8152, , <https://www.rfc-editor.org/info/rfc8152>.
[RFC8230]
Jones, M., 「CBOR Object Signing and Encryption(COSE)メッセージでのRSAアルゴリズムの使用」, RFC 8230, DOI 10.17487/RFC8230, , <https://www.rfc-editor.org/info/rfc8230>.
[RFC8551]
Schaad, J., Ramsdell, B., and S. Turner, 「Secure/Multipurpose Internet Mail Extensions(S/MIME)Version 4.0 Message Specification」, RFC 8551, DOI 10.17487/RFC8551, , <https://www.rfc-editor.org/info/rfc8551>.
[RFC8610]
Birkholz, H., Vigano, C., and C. Bormann, 「Concise Data Definition Language (CDDL):Concise Binary Object Representation(CBOR)およびJSONデータ構造を表現するための記法規約」, RFC 8610, DOI 10.17487/RFC8610, , <https://www.rfc-editor.org/info/rfc8610>.
[RFC8613]
Selander, G., Mattsson, J., Palombini, F., and L. Seitz, 「Object Security for Constrained RESTful Environments(OSCORE)」, RFC 8613, DOI 10.17487/RFC8613, , <https://www.rfc-editor.org/info/rfc8613>.
[RFC9054]
Schaad, J., 「CBOR Object Signing and Encryption(COSE):ハッシュアルゴリズム」, RFC 9054, DOI 10.17487/RFC9054, , <https://www.rfc-editor.org/info/rfc9054>.
[RFC9106]
Biryukov, A., Dinu, D., Khovratovich, D., and S. Josefsson, 「パスワードハッシュ化およびProof-of-WorkアプリケーションのためのArgon2 Memory-Hard Function」, RFC 9106, DOI 10.17487/RFC9106, , <https://www.rfc-editor.org/info/rfc9106>.
[STD90]
Bray, T., Ed., 「JavaScript Object Notation (JSON)Data Interchange Format」, STD 90, RFC 8259, , <https://www.rfc-editor.org/info/std90>.
[W3C.WebCrypto]
Watson, M., Ed., 「Web Cryptography API」, W3C Recommendation, , <https://www.w3.org/TR/WebCryptoAPI/>.

Appendix A. アルゴリズムの外部データ 認証のための指針

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オブジェクトを対象とする場合です。これが適用可能となるさまざまな シナリオが存在します。その一部は次のとおりです。

これらの場合、次の追加項目を考慮する必要があります。

Appendix B. 2レイヤーの受信者 情報

現在定義されているすべての受信者アルゴリズムクラスは、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''
          ]
        ]
      ]
    ]
  ]
)

Appendix C.

この付録には、本文書で定義されたさまざまな機能とメッセージ型を示す例の集合が 含まれています。例を読みやすくするため、バイナリダンプとしてではなく、拡張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評価器によっては、 &gt;をエンティティとして扱う必要がある場合があります。)

//sourcecode[@type='cbor-diag']/text()

C.1. 署名付き メッセージの例

C.1.1. 単一署名

この例は次を使用します。

  • 署名アルゴリズム: ECDSA w/ SHA-256, Curve P-256

バイナリファイルのサイズは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'
      ]
    ]
  ]
)

C.1.2. 複数署名者

この例は次を使用します。

  • 署名アルゴリズム: ECDSA w/ SHA-256, Curve P-256
  • 署名アルゴリズム: ECDSA w/ SHA-512, Curve P-521

バイナリファイルのサイズは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'
      ]
    ]
  ]
)

C.1.3. Criticality付き 署名

この例は次を使用します。

  • 署名アルゴリズム: ECDSA w/ SHA-256, Curve P-256
  • 「reserved」ヘッダーパラメータにcriticality マーカーがあります。

バイナリファイルのサイズは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'
      ]
    ]
  ]
)

C.2. 単一署名者の例

C.2.1. 単一ECDSA 署名

この例は次を使用します。

  • 署名アルゴリズム: ECDSA w/ SHA-256, Curve P-256

バイナリファイルのサイズは98バイトです

18(
  [
    / protected h'a10126' / << {
        / alg / 1:-7 / ECDSA 256 /
      } >>,
    / unprotected / {
      / kid / 4:'11'
    },
    / payload / 'This is the content.',
    / signature / h'8eb33e4ca31d1c465ab05aac34cc6b23d58fef5c083106c4
d25a91aef0b0117e2af9a291aa32e14ab834dc56ed2a223444547e01f11d3b0916e5
a4c345cacb36'
  ]
)

C.3. エンベロープ化 メッセージの例

C.3.1. Direct ECDH

この例は次を使用します。

  • CEK: AES-GCM w/ 128-bit key
  • 受信者クラス: ECDH Ephemeral-Static, Curve P-256

バイナリファイルのサイズは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''
      ]
    ]
  ]
)

C.3.2. Direct Plus Key Derivation

この例は次を使用します。

  • CEK: AES-CCM w/ 128-bit key, tagを64ビットに 切り詰め
  • 受信者クラス: 次の暗黙フィールドをcontextの一部として 共有秘密にHKDFを使用します。

    • salt: "aabbccddeeffgghh"
    • PartyU identity: "lighting-client"
    • PartyV identity: "lighting-server"
    • Supplementary Public Other: "Encryption Example 02"

バイナリファイルのサイズは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''
      ]
    ]
  ]
)

C.3.3. 外部データ付き 暗号化内容

この例は次を使用します。

  • CEK: AES-GCM w/ 128-bit key
  • 受信者クラス: ECDH Static-Static, Curve P-256 with AES Key Wrap
  • Externally Supplied AAD: h'0011bbcc22dd44ee55ff660077'

バイナリファイルのサイズは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'
      ]
    ]
  ]
)

C.4. 暗号化 メッセージの例

C.4.1. 単純な暗号化 メッセージ

この例は次を使用します。

  • CEK: AES-CCM w/ 128-bit key and a 64-bit tag

バイナリファイルのサイズは52バイトです

16(
  [
    / protected h'a1010a' / << {
        / alg / 1:10 / AES-CCM-16-64-128 /
      } >> ,
    / unprotected / {
      / iv / 5:h'89f52f65a1c580933b5261a78c'
    },
    / ciphertext / h'5974e1b99a3a4cc09a659aa2e9e7fff161d38ce71cb45ce
460ffb569'
  ]
)

C.4.2. Partial IV付き 暗号化メッセージ

この例は次を使用します。

  • CEK: AES-CCM w/ 128-bit key and a 64-bit tag
  • IVのプレフィックスは89F52F65A1C580933B52

バイナリファイルのサイズは41バイトです

16(
  [
    / protected h'a1010a' / << {
        / alg / 1:10 / AES-CCM-16-64-128 /
      } >> ,
    / unprotected / {
      / partial iv / 6:h'61a7'
    },
    / ciphertext / h'252a8911d465c125b6764739700f0141ed09192de139e05
3bd09abca'
  ]
)

C.5. MACed メッセージの例

C.5.1. 共有秘密 Direct MAC

この例は次を使用します。

  • MAC: AES-CMAC, 256-bit key, truncated to 64 bits
  • 受信者クラス: direct shared secret

バイナリファイルのサイズは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''
      ]
    ]
  ]
)

C.5.2. ECDH Direct MAC

この例は次を使用します。

  • MAC: HMAC w/SHA-256, 256-bit key
  • 受信者クラス: ECDH key agreement, two static keys, HKDF w/context structure

バイナリファイルのサイズは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''
      ]
    ]
  ]
)

C.5.3. Wrapped MAC

この例は次を使用します。

  • MAC: AES-MAC, 128-bit key, truncated to 64 bits
  • 受信者クラス: AES Key Wrap w/ a preshared 256-bit key

バイナリファイルのサイズは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'
      ]
    ]
  ]
)

C.5.4. 複数受信者MACedメッセージ

この例は次を使用します。

  • MAC: HMAC w/ SHA-256, 128-bit key
  • 受信者クラス: 2つの異なる方式を使用します。

    1. ECDH Ephemeral-Static, Curve P-521, AES Key Wrap w/ 128-bit key
    2. AES Key Wrap w/ 256-bit key

バイナリファイルのサイズは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'
      ]
    ]
  ]
)

C.6. MAC0 メッセージの例

C.6.1. 共有秘密 Direct MAC

この例は次を使用します。

  • MAC: AES-CMAC, 256-bit key, truncated to 64 bits
  • 受信者クラス: direct shared secret

バイナリファイルのサイズは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と同じ入力を使用していることに注意してください。

C.7. COSE鍵

C.7.1. 公開鍵

これはCOSE Key Setの例です。この例には、以前のすべての例に対する 公開鍵が含まれています。

順に、鍵は次のとおりです。

  • kidが "meriadoc.brandybuck@buckland.example"であるEC鍵
  • kidが"11"であるEC鍵
  • kidが "bilbo.baggins@hobbiton.example"であるEC鍵
  • kidが "peregrin.took@tuckborough.example"であるEC鍵

バイナリファイルのサイズは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'
  }
]

C.7.2. 秘密鍵

これはCOSE Key Setの例です。この例には、以前のすべての例に対する 秘密鍵が含まれています。

順に、鍵は次のとおりです。

  • kidが "meriadoc.brandybuck@buckland.example"であるEC鍵
  • kidが"11"であるEC鍵
  • kidが "bilbo.baggins@hobbiton.example"であるEC鍵
  • kidが"our-secret"である共有秘密鍵
  • kidが "peregrin.took@tuckborough.example"であるEC鍵
  • kidが"our-secret2"である共有秘密鍵
  • kidが "018c0ae5-4d9b-471b-bfd6-eef314bc7037"である共有秘密鍵

バイナリファイルのサイズは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 BarnesMatt Miller、および Martin Thomson

仕様の初期ドラフト版は、ある程度JOSEおよびS/MIME Working Groupsの成果に基づいていました。

次の個人は、文書の最終的な形に対して意見を提供しました。Carsten BormannJohn BradleyBrian CampbellMichael B. JonesIlari LiusvaaraFrancesca PalombiniLudwig Seitz、およびGöran Selander

著者の住所

Jim Schaad
August Cellars