[5] 
[DFN[JWE]] ([DFN[JSON Web Encryption]])
は、
[[暗号化]]したデータを交換できる
[[JSON応用]]です。

[6] 
[[JWS]] 等で構成される [[JOSE]] 規格シリーズの1つです。

* 仕様書

[REFS[
-
[1] [CITE@en[[[RFC 7516]] - JSON Web Encryption (JWE)]]
([TIME[2015-05-20 09:55:47 +09:00]] 版)
<https://tools.ietf.org/html/rfc7516>
-- [3] 移転確認 [TIME[2022-11-23T02:40:26.800Z]]
-- [4] [CITE@en[[[RFC 7516]] - JSON Web Encryption (JWE)]], [TIME[2022-11-23T02:40:19.000Z]] <https://datatracker.ietf.org/doc/html/rfc7516>
--- [7] 
[CITE@en[[[RFC 7516]] - JSON Web Encryption (JWE)]], [TIME[2022-11-23T02:52:15.000Z]] <https://datatracker.ietf.org/doc/html/rfc7516#section-2>
--- [17] 
[CITE@en[[[RFC 7516]] - JSON Web Encryption (JWE)]], [TIME[2022-11-23T05:48:17.000Z]] <https://datatracker.ietf.org/doc/html/rfc7516#section-3>
--- [33] 
[CITE@en[[[RFC 7516]] - JSON Web Encryption (JWE)]], [TIME[2022-11-23T09:33:56.000Z]] <https://datatracker.ietf.org/doc/html/rfc7516#section-5>
--- [123] 
[CITE@en[[[RFC 7516]] - JSON Web Encryption (JWE)]], [TIME[2022-11-23T13:27:42.000Z]] <https://datatracker.ietf.org/doc/html/rfc7516#section-7>
--- [140] 
[CITE@en[[[RFC 7516]] - JSON Web Encryption (JWE)]], [TIME[2022-11-24T09:38:05.000Z]] <https://datatracker.ietf.org/doc/html/rfc7516#section-11.5>




]REFS]

* 暗号化

[16] [[JWA]] を使います。

[FIG(short list)[ [9] [[JWE]] の[[暗号化]]用語
- [[JWE]]
- [[AEAD]]
- [[AAD]]
- [[認証タグ]]
- [[CEK]]
- [[JWE被暗号化鍵]]
- [[JWE初期化ベクトル]]
- [[JWE AAD]]
- [[JWE暗号文]]
- [[JWE認証タグ]]
- [[鍵管理モード]]
]FIG]

* データモデル


[8] 
[DFN[JSON Web Encryption]] ([DFN[JWE]])
は、
[[暗号化]]され[[一貫性保護]]された[[メッセージ]]を表現する[[データ構造]]です。
[SRC[>>7]]

[18] 
1つの [[JWE]] は、
次により構成されます。
[SRC[>>17]]

[FIG(list members)[ [19] [[JWE]]

: [[JOSEヘッダー]] : 
次の[[合同]]です。
[FIG(list members)[

: [DFN[[RUBYB[JWE被保護ヘッダー][JWE Protected Header]]]] :
[[被認証暗号化]]操作によって[[一貫性保護]]された[[ヘッダー引数]]群を含む
[[JSONオブジェクト]]です。
当該[[ヘッダー引数]]群は、 [[JWE]] のすべての[[受信者]]に適用されます。
[[JWE簡潔直列化]]においては、
[[JOSEヘッダー]]全体で構成されます。
[[JWE JSON直列化]]においては、
[[JOSEヘッダー]]の構成要素の1つです。
[SRC[>>7]]
: [DFN[[RUBYN[JWE被共有非被保護ヘッダー][JWE Shared Unprotected Header]]]] :
[[JWE]] のすべての[[受信者]]に適用される[[ヘッダー引数]]群であって[[一貫性保護]]されないものを含む
[[JSONオブジェクト]]です。
[[JWE JSON直列化]]にのみ出現できます。
[SRC[>>7]]
: [DFN[[RUBYB[JWE受信者毎非被保護ヘッダー][JWE Per-Recipient Unprotected Header]]]] :
[[JWE]] の単独の[[受信者]]に適用される[[ヘッダー引数]]群を含む
[[JSONオブジェクト]]です。
当該[[ヘッダー引数]]群は[[一貫性保護]]されません。
[[JWE JSON直列化]]にのみ出現できます。
[SRC[>>7]]


]FIG]
: [[JWE被暗号化鍵]] :
: [[JWE初期化ベクトル]] :
: [[JWE AAD]] :
: [[JWE暗号文]] :
: [[JWE認証タグ]] :

]FIG]


[10] 
[[平文]]の[[機密性]]と[[一貫性]]、
並びに[[JWE被保護ヘッダー]]と [[JWE AAD]] の[[一貫性]]を保証するため、
[[被認証暗号化]]を使います。
[SRC[>>17]]

-*-*-


[145] 
[DFN[[RUBYB[追加被認証データ][Additional Authenticated Data]]]] ([DFN[AAD]])
は、
[[AEAD]] 操作への入力であって、
[[整合性保護]]されるものの、
[[暗号化]]はされないものです。
[SRC[>>7]]

[146] 
[DFN[JWE AAD]]
は、
[[被認証暗号化]]操作で[[一貫性保護]]される追加の値です。
[[JWE JSON直列化]]でのみ出現し得ます。
[SRC[>>7]]

[147] 
[[JWE]] には[[応用]]データとして[[平文]]を[[暗号化]]した[[暗号文]]の他に、
[[AAD]] を含めることができます。
[[平文]]の方は[[暗号化]]されているので傍受しても[[解読]]できませんが、
[[AAD]] は [[base64url]] [[符号化]]されているだけなので、
傍受すると読まれてしまいます。
しかし[[一貫性保護]]の対称になっていますから、
[[AAD]] を改竄すると検知できます。

[148] 
従って漏洩しても構わない、
[[解読]]前でも確認したいような、
しかし改竄されるとまずいデータを入れる場所として使うことができます。
[[JWE被保護ヘッダー]]も同条件ですが、
そちらは [[JWE]] としての[[プロトコル要素]]です。
対して [[AAD]] は完全に[[応用]]が好きに使える場所となっているようです。

;; [149] というような説明がなぜか [[JWE]] の [[RFC]] で明確には行われていないのですが。


[143] 
[CITE@en[[[RFC 7520]] - Examples of Protecting Content Using JSON Object Signing and Encryption (JOSE)]], [TIME[2022-11-24T13:20:26.000Z]] <https://datatracker.ietf.org/doc/html/rfc7520#section-5.10>

[144] >>143
[[AAD]] として [[vCard]] を入れた例が示されています。
どういう利用形態を想定して [[vCard]] を使った事例なのかは書かれていません。




* 直列化


[124] 
[[JWE]] には3種類の[[直列化]]があります。
[[応用]]はそのいずれを使うか、
そのどの機能を使うかを指定する必要があります。
[[JWE]]
の実装は、その対象とする[[応用]]が必要とする機能のみ対応する必要があります。
[SRC[>>123]]

;; [125] つまり「[[JWE]] を使う」というだけでは意味が通じません。
「[[JWE]] を実装した」とするものが [[JWE]] のすべての機能を使えるとも限りません。

[20] [[JWE]] は、 [[RFC 7159]] [[JSON]] データや [[base64url]]
を使って記述されます。 [[JSON]] は、その定めるところにより、
値の前後に[[空白]]を挿入できます。 [SEE[ [[JSON]] ]]
[SRC[>>17]]

[139] 
[[JWS]] との区別は [[JOSE]] 参照。

** JWE 簡潔直列化

[14] 
[DFN[[RUBYB[JWE簡潔直列化][JWE Compact Serialization]]]]は、
[[JWE]]
の簡潔で [[URL安全]]な文字列としての表現です。
[SRC[>>7]]



[13] 
[[JWE簡潔直列化]]は、 次のものを順に[[連結]]したものです。
[SRC[>>17, >>123]]

= [21] [[RFC 7515]] [CODE[BASE64URL]] ([[RFC 3629]] [CODE[UTF8]] ([[JWE被保護ヘッダー]]))
= [22] [CODE[.][FULL STOP]]
= [23] [[RFC 7515]] [CODE[BASE64URL]] ([[JWE被暗号化鍵]])
= [24] [CODE[.][FULL STOP]]
= [25] [[RFC 7515]] [CODE[BASE64URL]] ([[JWE初期化ベクトル]])
= [26] [CODE[.][FULL STOP]]
= [27] [[RFC 7515]] [CODE[BASE64URL]] ([[JWE暗号文]])
= [28] [CODE[.][FULL STOP]]
= [29] [[RFC 7515]] [CODE[BASE64URL]] ([[JWE認証タグ]])


[11] 
[[JWE簡潔直列化]]では、
[[JWE共有非被保護ヘッダー]]や
[[JWE受信者毎非被保護ヘッダー]]は、
利用できません。
[SRC[>>7, >>17, >>123]]

;; [12] 従って[[JOSEヘッダー]] = [[JWE被保護ヘッダー]]です。
[SRC[>>17]]

[126] 
[[JWE簡潔直列化]]では、 [[JWE AAD]] は使えません。 [SRC[>>123]]

[127] 
[[JWE簡潔直列化]]では、[[受信者]]は常に1つです。 [SRC[>>123]]


** JWE JSON 直列化

[15] 
[DFN[[RUBYB[JWE JSON直列化][JWE JSON Serialization]]]]は、
[[JWE]] の [[JSONオブジェクト]]としての[[直列化]]です。 
[[JWE JSON直列化]]では複数の[RUBYB[当事者][parties]]に対して同じ内容を暗号化できます。
[SRC[>>7]]



[30] 
[[JWE JSON直列化]]では、
[[JWE被保護ヘッダー]]、
[[JWE共有非被保護ヘッダー]]、
[[JWE受信者毎非被保護ヘッダー]]のうち
1つ[[以上]]は[MUST[必須]]です。
[SRC[>>17]]


[150] 
[[ヘッダー引数]]と違って明言されていませんが、
[[JSONオブジェクト]]の重複[[メンバー]]は
[[ヘッダー引数]]の重複と同様に処理するべきと思われます。
[SEE[ [[ヘッダー引数]] ]]

*** 一般構文

[128] 
[DFN[[RUBYB[(完全)一般JWE JSON直列化構文][(fully) general JWE JSON serialization syntax]]]]は、
次のような最上位の
[[JSONオブジェクト]]です。
[SRC[>>123]]

[FIG(list  members)[ [129] [[JSONオブジェクト]]

: [DFN[[CODE[protected]] :
[[JWE被保護ヘッダー]]が[[空]]でない場合、
[[RFC 7515]] [CODE[BASE64URL]] ([[RFC 3629]] [CODE[UTF8]] ([[JWE被保護ヘッダー]]))
でなければ[MUST[なりません]]。
すべての[[受信者]]に共有されます。
そうでない場合、
指定しては[MUST[なりません]]。
[SRC[>>123]]
: [DFN[[CODE[unprotected]]]] : 
[[JWE共有非被保護ヘッダー]]が[[空]]でない場合、
[[JWE共有非被保護ヘッダー]]でなければ[MUST[なりません]]。
すべての[[受信者]]に共有されます。
そうでない場合、
指定しては[MUST[なりません]]。
[SRC[>>123]]
: [CODE[iv]] :
[[JWE初期化ベクトル]]が[[空]]でない場合、
[[RFC 7515]] [CODE[BASE64URL]] ([[JWE初期化ベクトル]])
でなければ[MUST[なりません]]。
そうでない場合、
指定しては[MUST[なりません]]。
[SRC[>>123]]
: [CODE[aad]] :
[[JWE AAD]] が[[空]]でない場合、
[[RFC 7515]] [CODE[BASE64URL]] ([[JWE AAD]])
でなければ[MUST[なりません]]。
そうでない場合、
指定しては[MUST[なりません]]。
[SRC[>>123]]
: [CODE[ciphertext]] :
[[RFC 7515]] [CODE[BASE64URL]] ([[JWE暗号文]])
でなければ[MUST[なりません]]。
[SRC[>>123]]
: [CODE[tag]] :
[[JWE認証タグ]]が[[空]]でない場合、
[[RFC 7515]] [CODE[BASE64URL]] ([[JWE認証タグ]])
でなければ[MUST[なりません]]。
そうでない場合、
指定しては[MUST[なりません]]。
[SRC[>>123]]
: [CODE[recipients]] :
[[JSON配列]]でなければ[MUST[なりません]]。
[SRC[>>123]]
[FIG(list members)[ [130] [[JSON配列]]

[131] 
各[[JSONオブジェクト]]は、
特定の[[受信者]]に固有の情報を表します。
[SRC[>>123]]

[FIG(list members)[ [132] [[JSONオブジェクト]]

: [CODE[header]] :
[[JWE受信者毎非被保護ヘッダー]]が[[空]]でない場合、
[[JWE受信者毎非被保護ヘッダー]]でなければ[MUST[なりません]]。
そうでない場合、
指定しては[MUST[なりません]]。
[SRC[>>123]]
: [CODE[encrypted_key]] :
[[JWE被暗号化鍵]]が[[空]]でない場合、
[[RFC 7515]] [CODE[BASE64URL]] ([[JWE被暗号化鍵]])
でなければ[MUST[なりません]]。
そうでない場合、
指定しては[MUST[なりません]]。
[SRC[>>123]]


]FIG]


]FIG]



]FIG]


[133] 
各[[受信者]]に対して[[ヘッダー引数]]
[CODE[alg]]
と
[CODE[enc]]
が[[必須]]であり、従って各[[受信者]]に対して
[CODE[header]],
[CODE[protected]],
[CODE[unprotected]]
の最低でも1つは[MUST[必須]]です。
[SRC[>>123]]

;; [134] [CODE[protected]] 以外は[[一貫性保護]]されないことには注意。

[136] 
[[平文]]値の取り扱いを指定するすべての[[ヘッダー引数]]は、
すべての[[受信者]]について同じでなければ[MUST[なりません]]。
主として [CODE[enc]] [[ヘッダー引数]]と、
その指定された[[算法]]に関する[[ヘッダー引数]]が該当します。
これは[[JWE暗号文]]等がすべての[[受信者]]に対して共通であることからの帰結とされます。
[SRC[>>123]]

;; [137] 
しかしそれを [CODE[protected]] に入れなければならないという制約はなく、
すべてを [CODE[header]] 内に入れても構わないようです。
しかし [CODE[recipients]] 内のオブジェクトすべてで同じ値でなければならないということです。

[135] 
内側、外側のどちらの[[JSONオブジェクト]]にも、
これ以外の追加の[[メンバー]]を指定できます。
実装は、理解できない[[メンバー]]を無視しなければ[MUST[なりません]]。
[SRC[>>123]]

*** 平坦化構文

[31] 
[DFN[[RUBYB[平滑化JWE JSON直列化構文][flattened JWE JSON serialization syntax]]]]は、
単一の[[受信者]]の場合に最適化したもので、
次のような最上位
[[JSONオブジェクト]]です。
[SRC[>>123, >>17]]

[FIG(list  members)[ [32] [[JSONオブジェクト]]

: [CODE[protected]] : 
[[RFC 7515]] [CODE[BASE64URL]] ([[RFC 3629]] [CODE[UTF8]] ([[JWE被保護ヘッダー]]))
: [CODE[unprotected]] : 
[[JWE共有非被保護ヘッダー]]
: [DFN[[CODE[header]]]] :
[[JWE受信者毎非被保護ヘッダー]]
: [CODE[encrypted_key]] :
[[RFC 7515]] [CODE[BASE64URL]] ([[JWE被暗号化鍵]])
: [CODE[iv]] :
[[RFC 7515]] [CODE[BASE64URL]] ([[JWE初期化ベクトル]])
: [CODE[ciphertext]] :
[[RFC 7515]] [CODE[BASE64URL]] ([[JWE暗号文]])
: [CODE[tag]] :
[[RFC 7515]] [CODE[BASE64URL]] ([[JWE認証タグ]])
: [CODE[aad]] :
[[RFC 7515]] [CODE[BASE64URL]] ([[JWE AAD]])


]FIG]

[138] 
[[平坦化JWE JSON直列化構文]]は、
[[一般JWE JSON直列化構文]]の 
[CODE[recipients]]
を展開したものという形で規定されています。
[SRC[>>123]]
明言されていませんが、
ここに規定されていない他の ([CODE[recipients]] 以外の)
[[メンバー]]を指定することもまた認められると思われます。


* 処理

** 暗号化

[34] 
[[メッセージ]]の[[暗号化]]は、次のようにします。
[SRC[>>33]]

- [60] 
[VAR[平文]]を、
[[平文]]とします。
- [52] 
[VAR[受信者リスト]]は、
1つ[[以上]]の[[メッセージ]]の[[受信者]]の[[リスト]]とします。
[[JWE簡潔直列化]]ではちょうど1つの[[受信者]]の[[リスト]]でなければなりません。

[FIG(steps)[

= [53] 
[VAR[受信者リスト]]中の各[[受信者]][VAR[受信者]]について、
[[順に][for each]]、
== [35] 
[VAR[算法]]を、 [CODE[alg]] で指定された[[算法]]
([[CEK]] 値の決定に使う[[算法]]) に設定します。
== [36] 
[VAR[鍵管理モード]]を、
[VAR[算法]]により[[鍵管理モード]]を決定した結果に設定します。
== [37] 
[VAR[鍵管理モード]]が[[鍵包み]]、
[[鍵暗号化]]、
[[鍵包み付き鍵合意]]の場合、
=== [38] 
[[無作為]]に [[CEK]] 値を生成します。
[[無作為]]値の生成については [[RFC 4086]] を参照。
[[CEK]] は、
[[内容暗号化算法]]が要求する長さと等しくなければ[MUST[なりません]]。
== [39] 
[VAR[鍵管理モード]]が[[直接鍵合意]]、
[[鍵包み付き鍵合意]]の場合、
=== [40] 
[RUBYB[合意された鍵][agreed upon key]]を計算すべく[[鍵合意算法]]を実行します。
=== [41] 
[VAR[鍵管理モード]]が[[直接鍵合意]]の場合、
==== [42] 
[[CEK]] を得られた値に設定します。
=== [43] 
[VAR[鍵管理モード]]が[[鍵包み付き鍵合意]]の場合、
==== [44] 
得られた値は [[CEK]] を包むのに使われます。
== [45] 
[VAR[鍵管理モード]]が[[鍵包み]]、
[[鍵暗号化]]、
[[鍵包み付き鍵合意]]の場合、
=== [46] 
[VAR[[[JWE被暗号化鍵]]]]を、
[[CEK]] を[VAR[受信者]]に対して[[暗号化]]した結果に設定します。
== [47] 
[VAR[鍵管理モード]]が[[直接鍵合意]],
[[直接暗号化]]の場合、
=== [48] 
[VAR[[[JWE被暗号化鍵]]]]を、
[[空オクテット列]]に設定します。
== [49] 
[VAR[鍵管理モード]]が[[直接暗号化]]の場合、
=== [50] 
[[CEK]] を共有[[対称鍵]]に設定します。
= [54] 
[VAR[[[JWE初期化ベクトル]]]]を、[[空オクテット列]]に設定します。
= [55] 
[[内容暗号化算法]]が[[初期化ベクトル]]を必要とする場合、
== [56] 
[VAR[[[JWE初期化ベクトル]]]]を、
[[内容暗号化算法]]で適切な大きさの[[無作為]]の
[[JWE初期化ベクトル]]を生成した結果に設定します。
= [58] 
[CODE[zip]] が指定されている場合、
== [59] [VAR[M]]を、[VAR[平文]]を [CODE[zip]] 
で指定された[[算法]]で[[圧縮]]した結果に設定します。
= [62] 
それ以外の場合、
== [63] 
[VAR[M]] を、[VAR[平文]]に設定します。
= [61] 
必要な場合、
== [69] 
[VAR[[[JWE被保護ヘッダー]]]]を、
適切な[[ヘッダー引数]]を含んだ[[JOSEヘッダー]]に設定します。
== [64] 
[VAR[符号化被保護ヘッダー]]の値を、
[[RFC 7515]] [CODE[BASE64URL]] ([[RFC 3629]] [CODE[UTF8]] ([[JWE被保護ヘッダー]]))
を計算した結果に設定します。
= [70] 
それ以外の場合、
== [71] 
[VAR[符号化被保護ヘッダー]]の値を、
[[空文字列]]に設定します。
= [65] 
必要な場合、
== [67] 
[VAR[[[JWE被共有非被保護ヘッダー]]]]を、
適切な[[ヘッダー引数]]を含んだ[[JOSEヘッダー]]に設定します。
= [66] 
必要な場合、
== [68] 
[VAR[[[JWE受信者毎非被保護ヘッダー]]]]を、
適切な[[ヘッダー引数]]を含んだ[[JOSEヘッダー]]に設定します。
= [72] 
[[JWE AAD]] がある場合、
== [75] 
[VAR[値]]を、
次の[[文字列を順に連結][文字列連結]]した結果に設定します。
--- [VAR[符号化被保護ヘッダー]]
--- [CODE[.][FULL STOP]]
--- [[RFC 7515]] [CODE[BASE64URL]] ([[JWE AAD]])
= [76] 
それ以外の場合、
== [77] 
[VAR[値]]を、
[VAR[符号化被保護ヘッダー]]に設定します。
= [73] 
[VAR[[[AAD]]暗号化引数]]を、
[VAR[値]]を
[[RFC 20]] [[ASCII]]
で[[符号化]]した結果に設定します。
= [74] 
[VAR[[[JWE暗号文]]]]と[VAR[[[JWE認証タグ]]]]を、
[VAR[M]],
[[CEK]],
[VAR[[[JWK初期化ベクトル]]]],
[VAR[[[AAD]]暗号化引数]]について、
指定された[[内容暗号化算法]]で[[暗号化]]した結果に設定します。
= [82] 
ここまでで得られた値を使って[[直列化]]します。

]FIG]

;; [83] 
仕様書には簡単な[[アルゴリズム]]の形で求められる挙動が書かれていますが、
現代的な [[Web標準]]の仕様書などで使われている記述方式に比べると曖昧で行間を読まなければならない前近代的なものです。


[122] [[JOSE鍵識別]]も参照。


** 解読


[51] 
[[メッセージ]]の[[解読]]は、次のようにします。
[SRC[>>33]]

[FIG(steps)[

= [79] 
直列化された
[[JWE]]
を構文解析します。
= [80] 
[[JWE被保護ヘッダー]],
[[JWE被暗号化鍵]],
[[JWE初期化ベクトル]],
[[JWE暗号文]],
[[JWE認証タグ]],
[[JWE AAD]]
を
[[base64url]]
[[改行]]・[[空白]]・その他追加文字なしで[[復号]]します。
= [81] 
[[JWE被保護ヘッダー]]が[[妥当]]な 
[[RFC 7159]] [[JSONオブジェクト]]を
[[UTF-8]]
[[符号化]]したものであることを検証します。
= [107] 
直列化された表現に含まれる各[[受信者]]について、
[[順に][for each]]、
== [84] 
直列化が [[JWE簡潔直列化]]の場合、
=== [85] 
[VAR[[[JOSEヘッダー]]]]を、
[[JWE被保護ヘッダー]]に設定します。
== [86] 
それ以外の場合、
=== [87] 
[VAR[[[JOSEヘッダー]]]]を、
[[JWE被保護ヘッダー]],
[[JWE被共有非被保護ヘッダー]],
[RUBYB[対応する][corresponding]][[JWE受信者毎非被保護ヘッダー]]の[[合同]]とします。
このとき、
---- [88] 
[[JWE被保護ヘッダー]],
[[JWE被共有非被保護ヘッダー]],
[[JWE受信者毎非被保護ヘッダー]]はそれぞれ
[[妥当]]な[[JSONオブジェクト]]でなければなりません。
---- [89] 
重複する[[ヘッダー引数]]が含まれないか検証します。
== [90] 
仕様書、[[算法]]、 [CODE[crit]] [[ヘッダー引数]]が要求するすべての欄を実装が理解、
処理できること、並びにそれら[[ヘッダー引数]]の値が理解でき対応できることを検証します。
== [91] 
[VAR[鍵管理モード]]を、
[CODE[alg]] [[ヘッダー引数]]に指定された[[算法]]により決定した[[鍵管理モード]]に設定します。
== [92] 
[[JWE]] が[[受信者]]の知っている[[鍵]]を使っていることを検証します。
== [93] 
[VAR[鍵管理モード]]が[[直接鍵合意]]、
[[鍵包み付き鍵合意]]の場合、
=== [94] 
[RUBYB[合意された鍵][agreed upon key]]を計算すべく[[鍵合意算法]]を実行します。
=== [95] 
[VAR[鍵管理モード]]が[[直接鍵合意]]の場合、
==== [96] 
[[CEK]] を得られた値に設定します。
=== [97] 
[VAR[鍵管理モード]]が[[鍵包み付き鍵合意]]の場合、
==== [98] 
得られた値は[[JWE被暗号化鍵]]の[[解読]]に使われます。
== [99] 
[VAR[鍵管理モード]]が[[鍵包み]]、
[[鍵暗号化]]、
[[鍵包み付き鍵合意]]の場合、
=== [100] 
[VAR[[[CEK]]]]
を、
[VAR[[[JWE被暗号化鍵]]]]を[[解読]]した結果に設定します。
[VAR[CEK]] は[[内容暗号化算法]]において必要な長さと等しくなければなりません。
== [101] 
[VAR[鍵管理モード]]が[[直接鍵合意]],
[[直接暗号化]]の場合、
=== [102] 
[[JWE被暗号化鍵]]が[[空オクテット列]]か検証します。
== [103] 
[VAR[鍵管理モード]]が[[直接暗号化]]の場合、
=== [104] 
[VAR[CEK]] を、共有された[[対称鍵]]に設定します。
== [105] 
[VAR[CEK]] がこの[[受信者]]に対して決定成功したかを記録します。
= [108] 
[[JWE非被保護ヘッダー]]がない場合、
== [109] 
[VAR[符号化被保護ヘッダー]]の値を、
[[空文字列]]に設定します。
= [110] 
それ以外の場合、
== [106] 
[VAR[符号化被保護ヘッダー]]の値を、
[[RFC 7515]] [CODE[BASE64URL]] ([[RFC 3629]] [CODE[UTF8]] ([[JWE被保護ヘッダー]]))
を計算した結果に設定します。
= [111] 
[[JWE AAD]] がある場合、
== [112]  
[VAR[値]]を、
次の[[文字列を順に連結][文字列連結]]した結果に設定します。
--- [VAR[符号化被保護ヘッダー]]
--- [CODE[.][FULL STOP]]
--- [[RFC 7515]] [CODE[BASE64URL]] ([[JWE AAD]])
= [113]  
それ以外の場合、
== [114]  
[VAR[値]]を、
[VAR[符号化被保護ヘッダー]]に設定します。
= [115]  
[VAR[[[AAD]]暗号化引数]]を、
[VAR[値]]を
[[RFC 20]] [[ASCII]]
で[[符号化]]した結果に設定します。
= [116] 
[VAR[平文]]を、
[[JWE暗号文]]を 
[VAR[CEK]],
[[JWK初期化ベクトル]],
[VAR[[[AAD]]暗号化引数]],
[[JWE認証タグ]]について[[内容暗号化算法]]を適用した結果に設定します。
[[内容暗号化算法]]に基づき[[JWE認証タグ]]を妥当性検証し、
不正確なら[[解読]]結果を返さずに拒絶します。
= [117] 
[CODE[zip]]
が指定された場合、
== [118] 
[VAR[平文]]を、[VAR[平文]]を指定された[[圧縮]]算法で[[解読]]した結果に設定します。
= [119] 
[VAR[平文]]とどの[[受信者]]であるかを返します。

]FIG]

;; [120] 
[[仕様書]]は[[アルゴリズム]]の形で記述していますが、
エラー処理をどうするべきかや複数の[[受信者]]をどう扱うのかをあまり明確には描き出していません。
常識的に行間を読むと、処理に失敗したらその[[受信者]]については解読失敗として次の受信者の処理に移る
(受信者の決定以前の失敗なら全体を失敗とする) ということのようです。

;; [142] 
なお >>141 のような重要な規定が仕様書本文中の[[アルゴリズム]]には組み込まれていなかったりします。
他の各段階も既知の[[セキュリティー]]問題に十分な配慮が必要です。
「本体」とセキュリティーを分けて考える [[RFC]] の悪習です。
[[RFC]] を読みながら実装するときは要注意。

-*-*-

[57] 
[[受信者]]が複数の場合、
すべての[[受信者]]に対して[[検証]]に成功しなければならないとしようが、
いずれか1つの[[受信者]]に対して[[検証]]に成功すれば良いとしようが、
[[応用]]の裁量で決められます。
どうするにせよ、
少なくても1つの[[受信者]]に対しては[[検証]]に成功していなければ[MUST[なりません]]。
そうでなければ[[非妥当]]としなければ[MUST[なりません]]。
[SRC[>>33]]

[78] 
特定の場面でどの[[算法]]を使うかは、
[[応用]]の裁量によります。
[[解読]]に成功したとしても、
[[応用]]が[[受理]]できる[[算法]]でなければ、
[[非妥当]]とする[SHOULD[べきです]]。
[SRC[>>33]]

-*-*-

[121] [[JOSE鍵識別]]も参照。


[141] 
[[RFC 3218]] [[timing attack]]
の対策のため、
[[被暗号化鍵]]の
[RUBYB[形式][format]]エラー, 
[RUBYB[詰め][padding]]エラー, 
[RUBYB[長さ][length]]エラーを区別しては[MUST[なりません]]。
[RUBYB[形式が不適切][improperly formatted]]な鍵を受信した際は、
[[timing attack]]
対策のため、
無作為に生成した [[CEK]] に置き換えて次段階に進むことが[RUBYB[強く推奨][strongly recommended]]されます。
[SRC[>>140]]

* MIME 型

[SEE[ [[JOSE]] ]]

* 応用

[FIG(short list)[ [151] [[JWE]] の[[応用]]
- [[暗号化JWK]]
- [[暗号化JWK集合]]
]FIG]

* 歴史

[2] 
[DFN[RFC 7516]]
は、
[TIME[西暦2015年5月][2015-05]]に
[[IETF]]
[[標準化過程RFC]] 
([[提案標準]])
として出版されました。
[SRC[>>1]]



* メモ