5. Producing and Consuming JWEs (JWEの生成と使用)
5.1 Message Encryption (メッセージ暗号化)
メッセージ暗号化プロセスは以下の通りです。入力と出力の間に依存関係がない場合、ステップの順序は重要ではありません。
-
Content Encryption Key値を決定するために使用されるアルゴリズムが採用するKey Management Modeを決定します。(これは、結果のJWEの "alg" (algorithm、アルゴリズム) Header Parameterに記録されるアルゴリズムです。)
-
Key Wrapping (鍵ラッピング)、Key Encryption (鍵暗号化)、またはKey Agreement with Key Wrapping (鍵ラッピング付き鍵合意) が採用される場合、ランダムなCEK値を生成します。ランダム値の生成に関する考慮事項については、RFC 4086 [RFC4086]を参照してください。CEKの長さは、コンテンツ暗号化アルゴリズムに必要な長さと等しくなければなりません (MUST)。
-
Direct Key Agreement (直接鍵合意) またはKey Agreement with Key Wrappingが採用される場合、鍵合意アルゴリズムを使用して合意された鍵の値を計算します。Direct Key Agreementが採用される場合、CEKを合意された鍵とします。Key Agreement with Key Wrappingが採用される場合、合意された鍵はCEKをラップするために使用されます。
-
Key Wrapping、Key Encryption、またはKey Agreement with Key Wrappingが採用される場合、CEKを受信者に暗号化し、その結果をJWE Encrypted Keyとします。
-
Direct Key AgreementまたはDirect Encryption (直接暗号化) が採用される場合、JWE Encrypted Keyを空のオクテットシーケンスとします。
-
Direct Encryptionが採用される場合、CEKを共有対称鍵とします。
-
エンコードされた鍵値BASE64URL(JWE Encrypted Key)を計算します。
-
JWE JSON Serializationが使用されている場合、各受信者に対してこのプロセス(ステップ1-7)を繰り返します。
-
コンテンツ暗号化アルゴリズムに適切なサイズのランダムなJWE Initialization Vectorを生成します(アルゴリズムで必要な場合)。それ以外の場合、JWE Initialization Vectorを空のオクテットシーケンスとします。
-
エンコードされたInitialization Vector値BASE64URL(JWE Initialization Vector)を計算します。
-
"zip"パラメータが含まれている場合、指定された圧縮アルゴリズムを使用して平文を圧縮し、Mを圧縮された平文を表すオクテットシーケンスとします。それ以外の場合、Mを平文を表すオクテットシーケンスとします。
-
必要なHeader Parametersのセットを含むJSONオブジェクトを作成します。これらは一緒にJOSE Headerを構成します:JWE Protected Header、JWE Shared Unprotected Header、およびJWE Per-Recipient Unprotected Headerの1つ以上。
-
Encoded Protected Header値BASE64URL(UTF8(JWE Protected Header))を計算します。JWE Protected Headerが存在しない場合(これはJWE JSON Serializationを使用していて "protected"メンバーが存在しない場合にのみ発生します)、この値を空文字列とします。
-
Additional Authenticated Data暗号化パラメータをASCII(Encoded Protected Header)とします。ただし、JWE AAD値が存在する場合(これはJWE JSON Serializationを使用している場合にのみ発生します)、代わりにAdditional Authenticated Data暗号化パラメータをASCII(Encoded Protected Header || '.' || BASE64URL(JWE AAD))とします。
-
CEK、JWE Initialization Vector、およびAdditional Authenticated Data値を使用して、指定されたコンテンツ暗号化アルゴリズムを使用してMを暗号化し、JWE Ciphertext値とJWE Authentication Tag(暗号化操作からのAuthentication Tag出力)を作成します。
-
エンコードされた暗号文値BASE64URL(JWE Ciphertext)を計算します。
-
エンコードされたAuthentication Tag値BASE64URL(JWE Authentication Tag)を計算します。
-
JWE AAD値が存在する場合、エンコードされたAAD値BASE64URL(JWE AAD)を計算します。
-
必要な直列化出力を作成します。この結果のCompact Serializationは、文字列BASE64URL(UTF8(JWE Protected Header)) || '.' || BASE64URL(JWE Encrypted Key) || '.' || BASE64URL(JWE Initialization Vector) || '.' || BASE64URL(JWE Ciphertext) || '.' || BASE64URL(JWE Authentication Tag)です。JWE JSON Serializationはセクション7.2で説明されています。
5.2 Message Decryption (メッセージ復号化)
メッセージ復号化プロセスは暗号化プロセスの逆です。入力と出力の間に依存関係がない場合、ステップの順序は重要ではありません。これらのステップのいずれかが失敗した場合、暗号化されたコンテンツを検証できません。
複数の受信者が存在する場合、JWEが受け入れられるためにどの受信者の暗号化されたコンテンツが正常に検証される必要があるかは、アプリケーションの決定です。場合によっては、すべての受信者の暗号化されたコンテンツが正常に検証される必要があり、そうでない場合JWEは無効と見なされます。他の場合、単一の受信者の暗号化されたコンテンツのみが正常に検証される必要があります。ただし、すべての場合において、少なくとも1つの受信者の暗号化されたコンテンツが正常に検証されなければならず (MUST)、そうでない場合JWEは無効と見なされなければなりません (MUST)。
-
JWE表現を解析して、JWEコンポーネントの直列化された値を抽出します。JWE Compact Serializationを使用する場合、これらのコンポーネントは、JWE Protected Header、JWE Encrypted Key、JWE Initialization Vector、JWE Ciphertext、およびJWE Authentication Tagのbase64urlエンコードされた表現であり、JWE JSON Serializationを使用する場合、これらのコンポーネントには、JWE AADのbase64urlエンコードされた表現と、エンコードされていないJWE Shared Unprotected HeaderおよびJWE Per-Recipient Unprotected Header値も含まれます。JWE Compact Serializationを使用する場合、JWE Protected Header、JWE Encrypted Key、JWE Initialization Vector、JWE Ciphertext、およびJWE Authentication Tagは、その順序でbase64urlエンコードされた値として表され、各値は次の値と単一のピリオド('.')文字で区切られ、正確に4つの区切りピリオド文字が使用されます。JWE JSON Serializationはセクション7.2で説明されています。
-
JWE Protected Header、JWE Encrypted Key、JWE Initialization Vector、JWE Ciphertext、JWE Authentication Tag、およびJWE AADのエンコードされた表現をbase64urlデコードします。改行、空白、またはその他の追加文字が使用されていないという制限に従います。
-
エンコードされたJWE Protected Headerをデコードした結果のオクテットシーケンスが、RFC 7159 [RFC7159]に準拠した完全に有効なJSONオブジェクトのUTF-8エンコード表現であることを確認します。JWE Protected HeaderをこのJSONオブジェクトとします。
-
JWE Compact Serializationを使用している場合、JOSE HeaderをJWE Protected Headerとします。それ以外の場合、JWE JSON Serializationを使用している場合、JOSE HeaderをJWE Protected Header、JWE Shared Unprotected Header、および対応するJWE Per-Recipient Unprotected Headerのメンバーの和集合とします。これらはすべて完全に有効なJSONオブジェクトでなければなりません。このステップ中に、結果のJOSE Headerに重複するHeader Parameter名が含まれていないことを確認します。JWE JSON Serializationを使用する場合、この制限には、同じHeader Parameter名がJOSE Headerを構成する異なるJSONオブジェクト値に出現してはならない (MUST NOT) ことも含まれます。
-
実装が、本仕様で必要とされるか、使用されているアルゴリズムで必要とされるか、または "crit" Header Parameter値で必要とされるかにかかわらず、サポートする必要があるすべてのフィールドを理解し、処理でき、それらのパラメータの値も理解およびサポートされていることを確認します。
-
"alg" (algorithm、アルゴリズム) Header Parameterで指定されたアルゴリズムが採用するKey Management Modeを決定します。
-
JWEが受信者に既知の鍵を使用していることを確認します。
-
Direct Key AgreementまたはKey Agreement with Key Wrappingが採用される場合、鍵合意アルゴリズムを使用して合意された鍵の値を計算します。Direct Key Agreementが採用される場合、CEKを合意された鍵とします。Key Agreement with Key Wrappingが採用される場合、合意された鍵はJWE Encrypted Keyを復号化するために使用されます。
-
Key Wrapping、Key Encryption、またはKey Agreement with Key Wrappingが採用される場合、JWE Encrypted Keyを復号化してCEKを生成します。CEKの長さは、コンテンツ暗号化アルゴリズムに必要な長さと等しくなければなりません (MUST)。複数の受信者が存在する場合、各受信者はその受信者が所有する鍵に暗号化されたJWE Encrypted Key値のみを復号化できることに注意してください。したがって、受信者ごとのJWE Encrypted Key値の1つのみを復号化してCEK値を取得できることは正常です。また、タイミング攻撃の緩和に関するセキュリティ考慮事項については、セクション11.5も参照してください。
-
Direct Key AgreementまたはDirect Encryptionが採用される場合、JWE Encrypted Key値が空のオクテットシーケンスであることを確認します。
-
Direct Encryptionが採用される場合、CEKを共有対称鍵とします。
-
この受信者に対してCEKを正常に決定できたかどうかを記録します。
-
JWE JSON Serializationが使用されている場合、表現に含まれる各受信者に対してこのプロセス(ステップ4-12)を繰り返します。
-
Encoded Protected Header値BASE64URL(UTF8(JWE Protected Header))を計算します。JWE Protected Headerが存在しない場合(これはJWE JSON Serializationを使用していて "protected"メンバーが存在しない場合にのみ発生します)、この値を空文字列とします。
-
Additional Authenticated Data暗号化パラメータをASCII(Encoded Protected Header)とします。ただし、JWE AAD値が存在する場合(これはJWE JSON Serializationを使用している場合にのみ発生します)、代わりにAdditional Authenticated Data暗号化パラメータをASCII(Encoded Protected Header || '.' || BASE64URL(JWE AAD))とします。
-
CEK、JWE Initialization Vector、Additional Authenticated Data値、およびJWE Authentication Tag(計算へのAuthentication Tag入力)を使用して、指定されたコンテンツ暗号化アルゴリズムを使用してJWE Ciphertextを復号化し、復号化された平文を返し、アルゴリズムに指定された方法でJWE Authentication Tagを検証し、JWE Authentication Tagが正しくない場合は復号化出力を発行せずに入力を拒否します。
-
"zip"パラメータが含まれている場合、指定された圧縮アルゴリズムを使用して復号化された平文を解凍します。
-
すべての復号化ステップが成功した受信者がいない場合、JWEは無効と見なされなければなりません (MUST)。それ以外の場合、平文を出力します。JWE JSON Serializationの場合、復号化が成功および失敗した受信者を示す結果もアプリケーションに返します。
最後に、特定のコンテキストでどのアルゴリズムを使用できるかはアプリケーションの決定であることに注意してください。JWEを正常に復号化できる場合でも、JWEで使用されているアルゴリズムがアプリケーションに受け入れられない限り、JWEを無効と見なすべきです (SHOULD)。
5.3 String Comparison Rules (文字列比較ルール)
本仕様の文字列比較ルールは、[JWS]のセクション5.3で定義されたものと同じです。