7. Serializations (直列化)
JWEは2つの直列化のいずれかを使用します:JWE Compact Serialization (JWE Compact直列化) またはJWE JSON Serialization (JWE JSON直列化)。本仕様を使用するアプリケーションは、そのアプリケーションで使用される直列化と直列化機能を指定する必要があります。たとえば、アプリケーションは、JWE JSON Serializationのみを使用すること、単一受信者に対するJWE JSON Serializationサポートのみを使用すること、または複数受信者のサポートを使用することを指定する場合があります。JWE実装は、サポートするように設計されたアプリケーションに必要な機能のみを実装する必要があります。
7.1 JWE Compact Serialization (JWE Compact直列化)
JWE Compact Serializationは、暗号化されたコンテンツをコンパクトでURL安全な文字列として表します。この文字列は次のとおりです:
BASE64URL(UTF8(JWE Protected Header)) || '.' ||
BASE64URL(JWE Encrypted Key) || '.' ||
BASE64URL(JWE Initialization Vector) || '.' ||
BASE64URL(JWE Ciphertext) || '.' ||
BASE64URL(JWE Authentication Tag)
JWE Compact Serializationでは1つの受信者のみがサポートされ、JWE Shared Unprotected Header、JWE Per-Recipient Unprotected Header、またはJWE AAD値を表す構文は提供されません。
7.2 JWE JSON Serialization (JWE JSON直列化)
JWE JSON Serializationは、暗号化されたコンテンツをJSONオブジェクトとして表します。この表現は、コンパクト性に最適化されておらず、URL安全でもありません。
JWE JSON Serializationには、密接に関連する2つの構文が定義されています:複数の受信者にコンテンツを暗号化できる完全に汎用的な構文と、単一受信者の場合に最適化されたフラット化された構文です。
7.2.1 General JWE JSON Serialization Syntax (一般JWE JSON直列化構文)
完全に汎用的なJWE JSON Serialization構文に使用されるトップレベルJSONオブジェクトで使用するために、以下のメンバーが定義されています:
protected : JWE Protected Header値が空でない場合、"protected"メンバーは存在しなければならず (MUST)、値BASE64URL(UTF8(JWE Protected Header))を含まなければなりません (MUST)。それ以外の場合、存在してはなりません (MUST)。これらのHeader Parameter値は完全性保護されています。
unprotected : JWE Shared Unprotected Header値が空でない場合、"unprotected"メンバーは存在しなければならず (MUST)、値JWE Shared Unprotected Headerを含まなければなりません (MUST)。それ以外の場合、存在してはなりません (MUST)。この値は、文字列ではなく、エンコードされていないJSONオブジェクトとして表されます。これらのHeader Parameter値は完全性保護されていません。
iv : JWE Initialization Vector値が空でない場合、"iv"メンバーは存在しなければならず (MUST)、値BASE64URL(JWE Initialization Vector)を含まなければなりません (MUST)。それ以外の場合、存在してはなりません (MUST)。
aad : JWE AAD値が空でない場合、"aad"メンバーは存在しなければならず (MUST)、値BASE64URL(JWE AAD)を含まなければなりません (MUST)。それ以外の場合、存在してはなりません (MUST)。JWE AAD値を含めて、完全性保護されているが暗号化されていないbase64urlエンコード値を提供できます。
ciphertext : "ciphertext"メンバーは存在しなければならず (MUST)、値BASE64URL(JWE Ciphertext)を含まなければなりません (MUST)。
tag : JWE Authentication Tag値が空でない場合、"tag"メンバーは存在しなければならず (MUST)、値BASE64URL(JWE Authentication Tag)を含まなければなりません (MUST)。それ以外の場合、存在してはなりません (MUST)。
recipients : "recipients"メンバー値はJSONオブジェクトの配列でなければなりません (MUST)。各オブジェクトには、単一の受信者に固有の情報が含まれています。このメンバーは、すべてのHeader Parameter値がすべての受信者間で共有され、暗号化された鍵が使用されない場合(Direct Encryptionを実行する場合など)に発生する可能性がある、一部またはすべての配列要素値が空のJSONオブジェクト""である場合でも、受信者ごとに正確に1つの配列要素で存在しなければなりません (MUST)。
"recipients"配列の要素であるJSONオブジェクトで使用するために、以下のメンバーが定義されています:
header : JWE Per-Recipient Unprotected Header値が空でない場合、"header"メンバーは存在しなければならず (MUST)、値JWE Per-Recipient Unprotected Headerを含まなければなりません (MUST)。それ以外の場合、存在してはなりません (MUST)。この値は、文字列ではなく、エンコードされていないJSONオブジェクトとして表されます。これらのHeader Parameter値は完全性保護されていません。
encrypted_key : JWE Encrypted Key値が空でない場合、"encrypted_key"メンバーは存在しなければならず (MUST)、値BASE64URL(JWE Encrypted Key)を含まなければなりません (MUST)。それ以外の場合、存在してはなりません (MUST)。
各受信者の計算に対して"alg"と"enc" Header Parameter値が伝達されるように、"header"、"protected"、および"unprotected"メンバーの少なくとも1つが存在しなければなりません (MUST)。
上記で定義されたJSONオブジェクトの両方に追加のメンバーが存在する可能性があります。それらに遭遇した実装がそれらを理解しない場合、無視しなければなりません (MUST)。
"alg"パラメータを含む一部のHeader Parametersは、すべての受信者の計算間で共有できます。JWE Protected HeaderおよびJWE Shared Unprotected Header値のHeader Parameter値は、すべての受信者間で共有されます。
受信者ごとの暗号文とAuthentication Tag値を作成または検証するときに使用されるHeader Parameter値は、存在する可能性がある3つのHeader Parameter値のセットの和集合です:(1) "protected"メンバーで表されるJWE Protected Header、(2) "unprotected"メンバーで表されるJWE Shared Unprotected Header、および(3) 受信者の配列要素の"header"メンバーで表されるJWE Per-Recipient Unprotected Header。これらのHeader Parametersのセットの和集合がJOSE Headerを構成します。3つの場所のHeader Parameter名は互いに素でなければなりません (MUST)。
各JWE Encrypted Key値は、JWE Compact Serializationと同じ方法で、対応するJOSE Header値のパラメータを使用して計算されます。これには、"recipients"配列の各JWE Encrypted Key値が、JWE Compact Serializationで同じパラメータに対して計算された値と同一であるという望ましい特性があります。同様に、JWE CiphertextおよびJWE Authentication Tag値は、JWE Protected Header値(完全性保護されたHeader Parameter値を表す)がJWE Compact Serializationで使用されるものと一致する限り、JWE Compact Serializationに対して生成された値と一致します。
すべての受信者は、存在する場合、同じJWE Protected Header、JWE Initialization Vector、JWE Ciphertext、およびJWE Authentication Tag値を使用し、メッセージが大きい場合、潜在的に大幅なスペースを節約できます。したがって、平文値の処理を指定するすべてのHeader Parametersは、すべての受信者に対して同じでなければなりません (MUST)。これは主に、各受信者のJOSE Headerの"enc"(encryption algorithm、暗号化アルゴリズム) Header Parameter値とそのアルゴリズムのパラメータが同じでなければならないことを意味します (MUST)。
要約すると、一般JWE JSON Serializationを使用したJWEの構文は次のとおりです:
{
"protected":"<integrity-protected shared header contents>",
"unprotected":<non-integrity-protected shared header contents>,
"recipients":[
{"header":<per-recipient unprotected header 1 contents>,
"encrypted_key":"<encrypted key 1 contents>"},
...
{"header":<per-recipient unprotected header N contents>,
"encrypted_key":"<encrypted key N contents>"}],
"aad":"<additional authenticated data contents>",
"iv":"<initialization vector contents>",
"ciphertext":"<ciphertext contents>",
"tag":"<authentication tag contents>"
}
一般JWE JSON Serialization構文を使用したJWEの例については、付録A.4を参照してください。
7.2.2 Flattened JWE JSON Serialization Syntax (フラット化JWE JSON直列化構文)
フラット化JWE JSON Serialization構文は一般構文に基づいていますが、単一受信者の場合に最適化するためにフラット化されています。"recipients"メンバーを削除し、代わりに"recipients"配列で使用するために定義されたメンバー("header"と"encrypted_key"メンバー)をトップレベルJSONオブジェクト("ciphertext"メンバーと同じレベル)に配置することによってフラット化されます。
この構文を使用する場合、"recipients"メンバーは存在してはなりません (MUST NOT)。この構文の違いを除いて、フラット化構文を使用するJWE JSON Serializationオブジェクトは、一般構文を使用するものと同じように処理されます。
要約すると、フラット化JWE JSON Serializationを使用したJWEの構文は次のとおりです:
{
"protected":"<integrity-protected header contents>",
"unprotected":<non-integrity-protected header contents>,
"header":<more non-integrity-protected header contents>,
"encrypted_key":"<encrypted key contents>",
"aad":"<additional authenticated data contents>",
"iv":"<initialization vector contents>",
"ciphertext":"<ciphertext contents>",
"tag":"<authentication tag contents>"
}
フラット化構文を使用する場合、一般構文を使用する場合と同様に、保護されていないHeader Parameter値は"unprotected"メンバーまたは"header"メンバー、またはその両方に存在できることに注意してください。
フラット化JWE JSON Serialization構文を使用したJWEの例については、付録A.5を参照してください。