<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor> <dfn><code>aes128gcm</code></dfn>
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src>
は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor>で転送するデータを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>するものです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="182" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[182]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Push</anchor> で使われています。</p><section><h1>仕様書</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> <cite xml:lang="en">RFC 8188 - Encrypted Content-Encoding for HTTP</cite>, <time>2020-03-09 11:21:54 +09:00</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc8188">https://tools.ietf.org/html/rfc8188</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <cite>RFC Errata Report » RFC Editor</cite>, <time>2020-03-12 17:34:59 +09:00</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://www.rfc-editor.org/errata_search.php?rfc=8188">https://www.rfc-editor.org/errata_search.php?rfc=8188</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[137]</anchor-end> <cite xml:lang="en">RFC 8291 - Message Encryption for Web Push</cite>, <time>2020-03-09 11:30:01 +09:00</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc8291">https://tools.ietf.org/html/rfc8291</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="138" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[138]</anchor-end> <cite>RFC Errata Report » RFC Editor</cite>, <time>2020-03-13 15:40:46 +09:00</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://www.rfc-editor.org/errata_search.php?rfc=8291">https://www.rfc-editor.org/errata_search.php?rfc=8291</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="255" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[255]</anchor-end> <cite xml:lang="en-US">Push API</cite>, <time>2020-02-04 16:21:34 +09:00</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://w3c.github.io/push-api/#dfn-push-subscription">https://w3c.github.io/push-api/#dfn-push-subscription</anchor-external></li></ul></refs></section><section><h1>文脈</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP要求</anchor>、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP応答</anchor>)
の内容を暗号化し、適切な鍵を持つ者のみが閲覧可能とし、
ときに<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サーバー</anchor>すらその内容を閲覧できなくしたいようなとき、
使えるものです。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 1.</src></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>といえば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor>
があります。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サーバー</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クライアント</anchor>の間の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">通信路</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>するもので、
性質が異なります。
本手法では、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サーバー</anchor>すらデータを読むことができないべきかもしれませんし、
読めないデータを他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サーバー</anchor>に複製して配置したりすることもあって、
1対の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPサーバー</anchor>と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPクライアント</anchor>の間の通信で完結しないかもしれません。
<src><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 1.</src></comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="135" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[135]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Push</anchor> で使われます。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーションサーバー</anchor>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュサービス</anchor>へ、そして<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>へとデータが転送されるので、
本手法により<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末端対末端</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>が実現できます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="136" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[136]</anchor-end> 理論上他にもいろいろ用途はあり得ますが、実用例があるのか不明です。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="251" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[251]</anchor-end> 
既存手法を流用せず敢えて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストリーミング処理</anchor>に対応させながら
(<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;11</anchor-internal>)、
主要な <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Push</anchor> では単一<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>に制限しているので、
この設計が生きていません。
一体何を想定してこのような仕様にしたのでしょうか。
時代背景的には <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CDN</anchor> で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">動画</anchor>データを転送することも想定されていそうですが
(実利用事例は不明)、それとて <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HLS</anchor> 形式で分割してそれぞれ単一<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>の方が扱いやすそうです。</comment-p></section><section><h1>構文</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="65" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[65]</anchor-end> 
ある
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor>における
<code>aes128gcm</code>
で符号化されたデータは、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーブロック</anchor>と、
それに続く1個以上の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>で構成されます。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2., <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;2</anchor-internal>.1.</src></p><figure class="railroad"><ol><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーブロック</anchor></li><li>*<ol><li>途中の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor></li></ol></li><li>最終<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor></li></ol></figure><section><h1>ヘッダーブロック</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="45" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[45]</anchor-end> 
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーブロック<rt xmlns="http://www.w3.org/1999/xhtml">header block</rt></rubyb></dfn>
(<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化ヘッダー<rt xmlns="http://www.w3.org/1999/xhtml">content-coding header</rt></rubyb></dfn>、
<dfn>encrypted content coding header</dfn> <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 2.</src>)
は、
次の4つの<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>引数</anchor><rt xmlns="http://www.w3.org/1999/xhtml">parameter</rt></rubyb></dfn>を順に並べたものです。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src></p><figure class="list members"><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">salt</code></f></dfn></dt><dd>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容暗号化鍵</anchor>を決定するために使う<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>。
16バイト <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src>。</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">rs</code></f></dfn></dt><dd>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>単位の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">32ビット符号無し整数</anchor>としたもの。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src></dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">idlen</code></f></dfn></dt><dd>
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">keyid</code></f>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">引数</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号無し整数</anchor>で表したもの。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src></dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">keyid</code></f></dfn></dt><dd>
使用する <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor> を識別するために使える、
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">idlen</code></f>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">引数</anchor>で指定された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">テキスト</anchor>として<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レンダリング</anchor>する必要がある場合、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 3629</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> 符号化する<SHOULD xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">べきです</SHOULD>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src>
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">keyid</code></f>
が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号無し整数</anchor>なので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>は [0, 255] <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>です。</dd></dl></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="86" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[86]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーブロック</anchor>は、最短で21バイト、
最長で276バイトです。</p><history xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="64" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[64]</anchor-end> 
古い <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">I-D</anchor> では、この情報は <code>Encryption:</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPヘッダー</anchor>に入れることになっていました。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPヘッダー</anchor>ではなく<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">本体</anchor>の先頭に入れることに変更したせいで、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ランダムアクセス</anchor>できるという特徴が半分嘘になってしまっています。</p></history></section><section><h1>レコード</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="66" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[66]</anchor-end>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号文</anchor>、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">詰め区切子オクテット</anchor>、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">詰め</anchor>の順に構成されます。
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">詰め区切子オクテット<rt xmlns="http://www.w3.org/1999/xhtml">padding delimiter octet</rt></rubyb></dfn>は、
最終<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>では <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n>、
途中の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>では <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x01</n>
です。
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>詰め</anchor><rt xmlns="http://www.w3.org/1999/xhtml">padding</rt></rubyb></dfn>は、
0個<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以上</anchor>の
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>です。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src></p><figure class="railroad"><ol><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号文</anchor></li><li>|<ol><li><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x01</n></li><li><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n></li></ol></li><li>*<ol><li><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n></li></ol></li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor>ごとに、
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ<rt xmlns="http://www.w3.org/1999/xhtml">record size</rt></rubyb></dfn>は固定です。
途中の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト長</anchor>は、
必ず<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor>です。
最終<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト長</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以下</anchor>です。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">詰め</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor>に満たないデータを送るときに適宜挿入するものです。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[252]</anchor-end> この任意長の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">詰め</anchor>が任意の位置で挿入され得るという性質のせいで、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ランダムアクセス</anchor>できるという特徴は実効性が怪しくなっています。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> 
本手法は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JWE</anchor>
その他各種既存の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メッセージ</anchor>ベースの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化形式</anchor>を採用せず、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 5116</anchor> のより低レベルな構造に依っています。
既存の形式では<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストリーミング処理</anchor>に適しません。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 1.</src>
本手法は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>構造により、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">範囲要求</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ランダムアクセス</anchor>が、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor>粒度で可能となります。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="44" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[44]</anchor-end> 
適切な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor>は、状況により異なります。
小さくすると解読済み<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>を早めに解放できるので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答性</anchor>が重要な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応用</anchor>に適しています。
小さいほど<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ランダムアクセス</anchor>時に解読が必要な余分なデータが少なくて済みます。
逆に大きいほど処理やデータの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">オーバーヘッド</anchor>は小さくなるので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストリーミング処理</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ランダムアクセス</anchor>や任意の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">詰め</anchor>が不要な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応用</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor>を大きくできます。
極端な場合は全体を1レコードにできます。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="63" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[63]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor>を記述する
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">rs</code></f>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">引数</anchor>は32ビット<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号無し整数</anchor>なので、
<code>AEAD_AES_128_GCM</code> の<var>平文</var>の上限 2<sup>36</sup> - 31 は超え得ません。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src>
さらに、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IND-CPA</anchor> の 2<sup>-40</sup> の確率を防ぐため、
同じ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor> と <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">salt</code></f>
で暗号化される<var>平文</var>の総量は
16バイトの
2<sup>44.5</sup>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブロック</anchor><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">未満</anchor>でなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor>が
16バイトの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">倍数</anchor>のとき、
これはすなわち<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">詰め</anchor>とオーバーヘッドを含めて
398テラバイトまで安全に暗号化できることを表します。
16バイトの倍数でないときは更に少なくなり、
最悪ケースは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">高々</anchor>74テラバイトになります。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 4.4.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="59" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[59]</anchor-end> 
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードシーケンス番号<rt xmlns="http://www.w3.org/1999/xhtml">record sequence number</rt></rubyb></dfn>
(<dfn>SEQ</dfn>)
は、
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>
から始まる、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>の
96ビット<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号無し整数</anchor>です。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.3.</src>
最初の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> で、以後
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n>、<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">2</n>
と順に増やしていきます
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">仕様書になし</src>。
96ビット<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号無し整数</anchor>なので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>数は
2<sup>96</sup>
を超えられないことになります。</p></section></section><section><h1>暗号化と鍵</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> 
<code>aes128gcm</code>
は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 5116</anchor> 5.1 節
<code>AEAD_AES_128_GCM</code>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">AES</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GCM</anchor>、128ビット<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容暗号化鍵</anchor>利用)
で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>するものです。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src></p><note xmlns="urn:x-suika-fam-cx:markup:ietf:html:3:draft:00:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">primitive</anchor> はこの通り固定化されています。
他の手法への対応 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">cipher agility</anchor>)
は、別の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor>を定義することによって実現し、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">折衝</anchor>は <code>Accept-Encoding</code> を使うことになっています。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src></p><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> 
こういうとき、これまでの <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IETF</anchor> 
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコル</anchor>だともう1段階抽象化と折衝の仕組みを導入していたところでしょうが、
既存の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">折衝</anchor>を流用して統合することで、
仕組みが簡単になって、既存の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> の実装と統合しやすくなっているのは優れた設計です。</p></note><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> 
本手法では、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>時と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解読</anchor>時に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵</anchor>が必要となります。
両者で共有する
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">input-keying material</anchor>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">keying material</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor>)
と、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor>ごとの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容暗号化キー</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</anchor>)
の2段階となっています。
これは1つの <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor> を複数の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor>で再利用するためです
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.2.</src>。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="100" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[100]</anchor-end> 
送信時に
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor> を取得するには、
次のようにします。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="167" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[167]</anchor-end> <var>IKM</var>、<var>鍵識別子</var>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵</anchor>を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="170" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[170]</anchor-end> <var>IKM</var> と<var>鍵識別子</var>を返します。</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="72" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[72]</anchor-end> 
受信時に
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor> を取得するには、
<var>鍵識別子</var>について、
次のようにします。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src></p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="74" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[74]</anchor-end> <var>IKM</var> を、
<var>鍵識別子</var>について<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵</anchor>を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="219" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[219]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Assert</anchor>: <var>IKM</var> は適切な <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor> か、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="75" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[75]</anchor-end> <var>IKM</var> を返します。</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="76" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[76]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵</anchor>の取得の方法は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>では定義されていません <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src>。 
受信者はその方法を知っていることが期待されます <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src>。
取得のために<var>鍵識別子</var>を使うことができます <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src>
(が使わなければならないわけでもありません)。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵</anchor>の共通方法は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応用</anchor>ごとに別途定めておく必要があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="77" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[77]</anchor-end> 
<var>鍵識別子</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">テキスト</anchor>として<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レンダリング</anchor>する場合の規定がある (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="45" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;45</anchor-internal>)
ので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者</anchor>に提示して<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵</anchor>を入力させる方式も採り得るようです。
しかしそれも1つの方法に過ぎず、 <code>keyid</code>
が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">テキスト</anchor>であるとも保証されていません。一般には<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>として扱わなければなりません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="169" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[169]</anchor-end> 
具体的には <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Push</anchor> の場合が規定されています (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="142" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;142</anchor-internal>)。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="46" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[46]</anchor-end> 
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容暗号化鍵<rt xmlns="http://www.w3.org/1999/xhtml">content-encryption key</rt></rubyb></dfn> (<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</anchor></dfn>)
は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor> と <code>salt</code> から、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor>ごとに求めます。
その方法として、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 5869</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HKDF</anchor>
で
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SHA-256</anchor> 
を使ったものを用います。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.2.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="89" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[89]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</anchor> の取得は、
<var>PRK</var>
について次のようにします。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.2.</src></p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="50" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[50]</anchor-end> 
<var>cek_info</var>
を、
<code>Content-Encoding: aes128gcm</code>
に
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n>
を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に連結</anchor>した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="51" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[51]</anchor-end> 
<var>CEK</var>
を、
<code>HMAC-SHA-256</code> (<var>PRK</var>, <var>cek_info</var> に <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x01</n> を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に連結</anchor>した結果)
の結果に設定します。<note xmlns="urn:x-suika-fam-cx:markup:ietf:html:3:draft:00:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="53" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[53]</anchor-end> <var>L</var> = <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16</n>
なので、このように簡略化できます。</p></note></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="52" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[52]</anchor-end> 
<var>CEK</var>
を返します。</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="87" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[87]</anchor-end> 
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">疑似乱数鍵<rt xmlns="http://www.w3.org/1999/xhtml">pseudorandom key</rt></rubyb></dfn> (<dfn>PRK</dfn>)
の取得は、
<var>salt</var>、<var>IKM</var> について、
次のようにします。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.2.</src></p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="49" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[49]</anchor-end> 
<var>PRK</var> 
を、
<code>HMAC-SHA-256</code> (<var>salt</var>, <var>IKM</var>)
の結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="88" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[88]</anchor-end> 
<var>PRK</var> を返します。</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="90" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[90]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</anchor> は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">nonce</anchor> の取得に使います。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="82" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[82]</anchor-end> 
<code>salt</code>
は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>時に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor>ごとに準備し、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーブロック</anchor>に入れて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解読</anchor>者へと引き渡します。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解読</anchor>者は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーブロック</anchor>から取り出して使います。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="83" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[83]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">salt</anchor> の生成は、次のようにします。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="84" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[84]</anchor-end> <var>salt</var> を、16バイトの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>に設定します。<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="68" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[68]</anchor-end> 
同じ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor> を使う別の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor>で同じ 
<var>salt</var> を使っては<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1., 4.3.</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="69" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[69]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor>ごとに毎回
<var>salt</var>
を生成する<SHOULD xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">べきです</SHOULD>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 4.3.</src></li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="85" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[85]</anchor-end> <var>salt</var> を返します。</li></ol></figure><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="54" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[54]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">nonce</anchor>
の取得は、
<var>PRK</var>、
<var>SEQ</var>
について次のようにします。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.3.</src></p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="55" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[55]</anchor-end> <var>nonce_info</var> を、
<code>Content-Encoding: nonce</code>
に
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n>
を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に連結</anchor>した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="56" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[56]</anchor-end> <var>NONCE</var>
を、
<code>HMAC-SHA-256</code>
(<var>PRK</var>, <var>nonce_info</var> に <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x01</n> を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に連結</anchor>した結果)
の結果と
<var>SEQ</var>
を
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XOR</anchor>
した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="58" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[58]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Assert</anchor>:
<var>NONCE</var>
は96ビットです。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="57" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[57]</anchor-end> <var>NONCE</var> を返します。</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="60" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[60]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">nonce</anchor>
は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>の削除や順序入れ替えを防ぐものです。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.3.</src></p><section><h1>Web Push</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="146" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[146]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュ購読</anchor><var>プッシュ購読</var>の作成時に、
次のようにします。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="147" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[147]</anchor-end> <var>鍵ペア</var>を、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">P-256 curve</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ECDH</anchor> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵ペア</anchor>を生成した結果に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 2., 3.1., <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="255" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;255</anchor-internal></src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="159" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[159]</anchor-end> <var>authentication secret</var>
を、
16バイトの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 3.2.</src><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="140" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[140]</anchor-end> 推測し難いものでなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="160" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[160]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 4086</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号学的に強い乱数生成器</anchor>を使う<SHOULD xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">べきです</SHOULD>。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="148" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[148]</anchor-end>  
<var>プッシュ購読</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵ペア</f>を、<var>鍵ペア</var>に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="255" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;255</anchor-internal></src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="161" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[161]</anchor-end> <var>プッシュ購読</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">authentication secret</f>
を、 <var>authentication secret</var> に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="255" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;255</anchor-internal></src></li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="256" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[256]</anchor-end> <var>プッシュ購読</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵ペア</f>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">秘密鍵</f>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>に提供しては<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="255" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;255</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="257" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[257]</anchor-end> <var>プッシュ購読</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵ペア</f>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">公開鍵</f>は、
<code>getKey</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メソッド</anchor>を通じて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>から取得可能です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="158" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[158]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">symmetric authentication secret</anchor>
である
<var>プッシュ購読</var>の <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">authentication secret</f></dfn>
は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>が正しく<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">認証</anchor>されるようにするものです。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 3.2.</src>
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">authentication secret</f>
は、
<code>getKey</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メソッド</anchor>を通じて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>から取得可能です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="254" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[254]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュ購読の作成</anchor>から呼び出されます。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="141" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[141]</anchor-end> 
<var>プッシュ購読</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵ペア</f>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">公開鍵</f>と
<var>プッシュ購読</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">authentication secret</f>
は、
他の必要な情報と共に、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>に引き渡します
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 2.</src>。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>は、
これらを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーションサーバー</anchor>に引き渡します
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 2.1.</src>。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="144" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[144]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>は、
<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">認可された<rt xmlns="http://www.w3.org/1999/xhtml">authorized</rt></rubyb><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーションサーバー</anchor>に対して、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">認証</anchor>された秘密が保持される通信媒体を使って、
これらを引き渡さなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
これは <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 8030</anchor> に述べられた理由に加え、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">authentication secret</anchor>
が漏れると<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>を送れてしまうからです。
ほとんどの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>は予め決められた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーションサーバー</anchor>との関係を持っていて、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS</anchor> のような方法でこの条件を満たせます。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 2.1.</src></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="145" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[145]</anchor-end> 一昔前ならこれは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">保安通信路</anchor>という言葉で表されていました。
ここでの規定がややもってまわった形になっているのは、
登場するのが1対の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クライアント</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サーバー</anchor>の間だけで完結するものでないためでしょう。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="162" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[162]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor> の取得は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 5869</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HKDF</anchor>
で
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SHA-256</anchor> 
を使ったものを用います。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 3.3.</src>
このとき、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーションサーバー</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>送信者)
は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>から引き渡された<var>プッシュ購読</var>の情報を使い、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>受信者)
は生成して保持していた<var>プッシュ購読</var>の情報を使います。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="142" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[142]</anchor-end> 
<var>プッシュ購読</var>における
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor>
の取得は、
<var>鍵識別子</var>について、
次のようにします。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="149" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[149]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーションサーバー</anchor>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="150" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[150]</anchor-end> <var>鍵ペア</var>を、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">P-256 curve</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ECDH</anchor> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵ペア</anchor>を生成した結果に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 2., 3.1.</src><note xmlns="urn:x-suika-fam-cx:markup:ietf:html:3:draft:00:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="152" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[152]</anchor-end> 
<var>鍵ペア</var>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>後、
捨てて構いません。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 2.</src></p></note></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="151" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[151]</anchor-end> <var>鍵識別子</var>を、<var>鍵ペア</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">公開鍵</f>
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 2., 3.1., 4.</src>
を <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">X9.62</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">uncompressed point form</anchor>
(<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x04</n> で始まる65バイトの列)
と<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">します</MUST>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 4.</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="220" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[220]</anchor-end> 
<var>プッシュ購読</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵ペア</f>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">公開鍵</f>が適切な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵</anchor>でない場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="221" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[221]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="153" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[153]</anchor-end> 
<var>ecdh_secret</var>
(ECDH shared secret) を、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ECDH</anchor>
(<var>鍵ペア</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">秘密鍵</f>,
<var>プッシュ購読</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵ペア</f>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">公開鍵</f>)
の結果に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 3.1., 3.4.</src></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="143" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[143]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="156" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[156]</anchor-end> <var>公開鍵</var>を、<var>鍵識別子</var>を
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">X9.62</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">uncompressed point form</anchor>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">公開鍵</anchor>として解釈した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="222" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[222]</anchor-end> 
<var>公開鍵</var>が適切な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵</anchor>でない場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="223" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[223]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="155" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[155]</anchor-end> 
<var>ecdh_secret</var>
(ECDH shared secret) を、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ECDH</anchor>
(<var>プッシュ購読</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵ペア</f>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">秘密鍵</f>,
<var>公開鍵</var>)
の結果に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 3.1., 3.4.</src></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="166" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[166]</anchor-end> 
<var>auth_secret</var> を、
<var>プッシュ購読</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">authentication secret</f> 
に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 2., 3.4.</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="224" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[224]</anchor-end> 
<var>auth_secret</var> 
が16バイトの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>でない場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="225" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[225]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="168" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[168]</anchor-end> 
<var>key_info</var>
を、
&quot;WebPush: info&quot;
に、
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n>、
<var>プッシュ購読</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">公開鍵</f>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">X9.62</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">uncompressed point form</anchor>、
<var>鍵ペア</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">公開鍵</f>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">X9.62</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">uncompressed point form</anchor>、
を順に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に追加</anchor>した結果に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 3.3., 3.4.</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="164" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[164]</anchor-end> 
<var>PRK_key</var> を、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HMAC-SHA-256</anchor> (<var>auth_secret</var>, <var>ecdh_secret</var>)
の結果に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 3.3., 3.4.</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="163" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[163]</anchor-end> 
<var>IKM</var> を、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HMAC-SHA-256</anchor> (<var>PRK_key</var>, <var>key_info</var> に <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x01</n>
を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に追加</anchor>した結果)
の結果に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 3.3., 3.4.</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="165" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[165]</anchor-end> 
<var>IKM</var>
と<var>鍵識別子</var>を返します。</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="181" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[181]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーションサーバー</anchor>は、
受信した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">公開鍵</anchor>が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">P-256 curve</anchor>
上にあることを検証しなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 7.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="250" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[250]</anchor-end> それ以前の大前提として、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">公開鍵</anchor>や
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">authentication secret</anchor>
として与えられたものが適切な入力の形であるかも検証しなければなりません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="258" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[258]</anchor-end> この検査は
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webブラウザー</anchor>側では <code>subscribe</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メソッド</anchor>時点で行われます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="253" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[253]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーションサーバー</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">VAPID</anchor> で使う<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵</anchor>と別の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵</anchor>を使わなければなりません。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>VAPID</anchor> </sw-see></p></section></section><section><h1>符号化</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="97" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[97]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">平文</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>を入力とし、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>を出力とする操作です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>の処理たる<var>符号化器</var>は、
次の状態を保持します。</p><figure class="list members"><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非負整数</anchor>。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SEQ</f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非負整数</anchor>。</dd></dl></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="95" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[95]</anchor-end> 
<var>符号化器</var>による<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>の開始時には、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非負整数</anchor><var>レコードサイズ</var>について、
次のようにします。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src></p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="67" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[67]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Assert</anchor>: <var>レコードサイズ</var>は [18, 2<sup>32</sup> - 1]</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="70" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[70]</anchor-end> <var>salt</var> を、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">salt</anchor> を生成した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="71" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[71]</anchor-end> <var>符号化器</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</f>を、
<var>レコードサイズ</var>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="47" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[47]</anchor-end> <var>IKM</var>、<var>鍵識別子</var>を、
送信時の
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor>
を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="248" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[248]</anchor-end> <var>IKM</var> が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="249" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[249]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">例外</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">投げ</anchor>、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="81" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[81]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Assert</anchor>: <var>鍵識別子</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>は [0, 255]
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">仕様書に明記は無し</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="43" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[43]</anchor-end> 
<var>符号化器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</f>
を、
<var>salt</var>、<var>IKM</var> について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</anchor>
を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="92" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[92]</anchor-end> <var>符号化器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</f>
を、
<var>符号化器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</f>
について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</anchor> を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="48" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[48]</anchor-end> <var>符号化器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SEQ</f> を、 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="73" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[73]</anchor-end> <var>ヘッダーブロック</var>を、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空バイト列</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="98" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[98]</anchor-end> <var>ヘッダーブロック</var>に、
<var>salt</var> を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に追加</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="99" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[99]</anchor-end> <var>ヘッダーブロック</var>に、
<var>符号化器</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</f>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">32ビット符号無し整数</anchor>としたものを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に追加</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="79" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[79]</anchor-end> <var>ヘッダーブロック</var>に、
<var>鍵識別子</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号無し整数</anchor>としたものを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に追加</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="80" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[80]</anchor-end> <var>ヘッダーブロック</var>に、
<var>鍵識別子</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に追加</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="101" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[101]</anchor-end> <var>ヘッダーブロック</var>を送信します。</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="102" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[102]</anchor-end> 
<var>符号化器</var>による<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>の過程、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor><var>データ</var>を、
これが<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>全体の末尾に当たるかどうかを表す<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真偽値</anchor><var>最後</var>について送信するには、
次のようにします。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src></p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="103" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[103]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Assert</anchor>: <var>データ</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>は
[0, <var>符号化器</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</f> - 17]</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="78" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[78]</anchor-end> 
<var>nonce</var>
を、
<var>符号化器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</f> 
と<var>符号化器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SEQ</f>
について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">nonce</anchor> を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="27" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[27]</anchor-end> 
<var><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号文<rt xmlns="http://www.w3.org/1999/xhtml">ciphertext</rt></rubyb></var>を、
<code>AEAD_AES_128_GCM</code>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>を実行した結果に設定します。<figure class="list members"><dl><dt><var>鍵</var></dt><dd><var>符号化器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</f></dd><dt><var>nonce</var></dt><dd><var>nonce</var></dd><dt><var>平文</var></dt><dd><var>データ</var></dd><dt><var>関連付けされたデータ</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空バイト列</anchor><note xmlns="urn:x-suika-fam-cx:markup:ietf:html:3:draft:00:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[25]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 8188</anchor> では「additional data」と呼ばれています。</p></note></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="29" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[29]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Assert</anchor>:
<var>暗号文</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">byte length</title></anchor> = <var>平文</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">byte length</title></anchor> + <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16</n></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> <var>詰め区切子オクテット</var>を、
<var>最後</var>なら 
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n>、
それ以外なら
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x01</n>
に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> <var>符号化器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SEQ</f> を、<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インクリメント</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> <var>レコード</var>を、
<var>暗号文</var>に<var>詰め区切子オクテット</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に連結</anchor>した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="105" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[105]</anchor-end> <var>レコード</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>が<var>レコードサイズ</var><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">未満</anchor>の間、繰り返し、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[22]</anchor-end> <var>最後</var>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[23]</anchor-end> ここで繰り返しを脱出して構いません。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="106" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[106]</anchor-end> <var>レコード</var>に、 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n> を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に追加</anchor>します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end> <var>レコード</var>を送信します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="243" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[243]</anchor-end> <var>最後</var>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="244" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[244]</anchor-end> 送信バイト列を閉じます。</li></ol></li></ol></figure><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="171" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[171]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Push</anchor>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーションサーバー</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュメッセージ</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>
1つで<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>しなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor>は、
入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor> + <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">17</n>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以上</anchor>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>では <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">greater than</anchor>)
の値としなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 4.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="172" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[172]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プッシュサービス</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 8030</anchor> 7.2節により、
4096バイトを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">超える</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">payload body</anchor>
に対応する必要はありません。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>プッシュ資源</anchor> </sw-see>
この上限を満たすためには、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーブロック</anchor>が86バイト、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">詰め区切子オクテット</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">詰め</anchor>が1バイト<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以上</anchor>、
<code>AEAD_AES_128_GCM</code> の追加が16バイトなので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">平文</anchor>に使えるのは高々3993バイトです。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 4.</src></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="175" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[175]</anchor-end> 対応する必要はない、ということは対応されている可能性があるわけなので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">相互運用性</anchor>の問題が生じるおそれがあります。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="173" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[173]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Push</anchor>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーションサーバー</anchor>は、
<code>aes128gcm</code>
以外の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor>を使っては<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<code>aes128gcm</code> を複数回適用することはできません。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 4.</src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="227" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[227]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Push</anchor> 用に簡略化された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor><var>データ</var>を次のようにします。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="228" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[228]</anchor-end> <var>データ</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>が 3933
より大きい場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="229" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[229]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">例外</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">投げ</anchor>、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="230" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[230]</anchor-end> <var>salt</var> を、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">salt</anchor> を生成した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="231" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[231]</anchor-end> <var>レコードサイズ</var>を、
<var>データ</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor> + <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">17</n>
に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="232" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[232]</anchor-end> <var>IKM</var>、<var>鍵識別子</var>を、
送信時の
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor>
を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="246" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[246]</anchor-end> <var>IKM</var> が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="247" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[247]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">例外</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">投げ</anchor>、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="237" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[237]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Assert</anchor>: <var>鍵識別子</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>は <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">65</n>。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="233" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[233]</anchor-end> <var>PRK</var>
を、
<var>salt</var>、<var>IKM</var> について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</anchor>
を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="234" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[234]</anchor-end> <var>CEK</var>
を、
<var>PRK</var>
について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</anchor> を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="235" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[235]</anchor-end> <var>送信バイト列</var>を、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空バイト列</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="236" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[236]</anchor-end> <var>送信バイト列</var>に、
<var>salt</var>、
<var>レコードサイズ</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">32ビット符号無し整数</anchor>としたもの、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号無し整数</anchor> <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">65</n>、
<var>鍵識別子</var>、
を順に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に追加</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="238" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[238]</anchor-end>  
<var>nonce</var>
を、
<var>PRK</var> 
と <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>
について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">nonce</anchor> を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="239" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[239]</anchor-end> 
<var>暗号文</var>を、
<code>AEAD_AES_128_GCM</code>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>を実行した結果に設定します。<figure class="list members"><dl><dt><var>鍵</var></dt><dd><var>CEK</var></dd><dt><var>nonce</var></dt><dd><var>nonce</var></dd><dt><var>平文</var></dt><dd><var>データ</var></dd><dt><var>関連付けされたデータ</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空バイト列</anchor></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="240" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[240]</anchor-end> <var>送信バイト列</var>に、
<var>暗号文</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に追加</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="241" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[241]</anchor-end> <var>送信バイト列</var>に、 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n> を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に追加</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="242" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[242]</anchor-end> <var>送信バイト列</var>を送信します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="245" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[245]</anchor-end> 送信バイト列を閉じます。</li></ol></figure></section><section><h1>復号</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="28" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[28]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>を入力とし、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解読</anchor>された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>を出力とする操作です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>の処理たる<var>復号器</var>は、
次の状態を保持します。</p><figure class="list members"><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非負整数</anchor>。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SEQ</f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非負整数</anchor>。</dd></dl></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[26]</anchor-end> 
<var>復号器</var>による<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真偽値</anchor><var>単一レコード</var>について、
次のようにします。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="130" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[130]</anchor-end> <var>結果バイト列</var>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空バイト列</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="110" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[110]</anchor-end> 21バイト受信するのを待ちます。
完了前に入力が終了した場合、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返してここで停止します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">仕様書になし</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="30" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[30]</anchor-end> <var>ヘッダーブロック</var>を、受信した21バイトの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="31" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[31]</anchor-end> <var>salt</var>
を、<var>ヘッダーブロック</var>の先頭16バイトに設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="104" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[104]</anchor-end> <var>復号器</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</f>を、
<var>ヘッダーブロック</var>の第17バイトから第20バイトを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">32ビット符号無し整数</anchor>として解釈した結果に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="112" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[112]</anchor-end> <var>復号器</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</f>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">18</n> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">未満</anchor>の場合 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src>、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="113" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[113]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">仕様書になし</src></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="107" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[107]</anchor-end> <var>識別子長</var>を、
<var>ヘッダーブロック</var>の最終バイトを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号無し整数</anchor>として解釈した結果に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.1.</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="108" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[108]</anchor-end> <var>識別子長</var>バイト受信するのを待ちます。
完了前に入力が終了した場合、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返してここで停止します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">仕様書になし</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="109" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[109]</anchor-end> <var>鍵識別子</var>を、
受信した<var>識別子長</var>バイトの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="154" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[154]</anchor-end> <var>IKM</var> を、
<var>鍵識別子</var>について受信時の
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor>
を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="215" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[215]</anchor-end> <var>IKM</var> が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="216" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[216]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="91" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[91]</anchor-end> <var>復号器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</f> を、
<var>salt</var>、
<var>IKM</var> について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</anchor> を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="93" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[93]</anchor-end> <var>復号器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</f> を、
<var>復号器</var> の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</f>
について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</anchor> を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="111" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[111]</anchor-end> <var>復号器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SEQ</f> を、
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>
に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="114" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[114]</anchor-end> 繰り返し、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="115" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[115]</anchor-end> 
<var>レコード</var>を、受信した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>に設定します。
<var>レコード</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>が<var>復号器</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</f>に等しくなるか、
受信<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>の末尾に到達するまでとします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="120" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[120]</anchor-end> 
<var>詰め区切子オクテット</var>を、
<var>レコード</var>の末尾から順に <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n> でない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>を探した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="121" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[121]</anchor-end> 
<var>詰め区切子オクテット</var>が <code>null</code> の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="122" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[122]</anchor-end> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</MUST>を返し、ここで停止します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="33" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[33]</anchor-end> 
<var>詰め区切子オクテット</var>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x01</n> でも <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n> でもない場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="34" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[34]</anchor-end> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</MUST>を返し、ここで停止します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="123" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[123]</anchor-end> 
<var>詰め区切子オクテット</var>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x01</n> で<var>レコード</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>が<var>復号器</var>の<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</f>で<em>ない</em>場合、<ol><li><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="35" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[35]</anchor-end> この条件は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>に明記されていませんが、
最終レコードが <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n> でなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</MUST>という要件が適用されます。</comment-p></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="124" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[124]</anchor-end> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</MUST>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="179" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[179]</anchor-end> <var>単一レコード</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor>で、
<var>詰め区切子オクテット</var>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x01</n> の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="180" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[180]</anchor-end> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</MUST>を返し、ここで停止します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 4.</src></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="125" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[125]</anchor-end> 
<var>暗号文</var>を、
<var>レコード</var>から末尾の <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>とその直前の<var>詰め区切子オクテット</var>を除去した結果に設定します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="116" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[116]</anchor-end> 
<var>nonce</var>
を、
<var>復号器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</f> 
と<var>復号器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SEQ</f>
について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">nonce</anchor> を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="94" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[94]</anchor-end> 
<var>平文</var>を、
<code>AEAD_AES_128_GCM</code>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解読</anchor>を実行した結果に設定します。<figure class="list members"><dl><dt><var>鍵</var></dt><dd><var>復号器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</f></dd><dt><var>nonce</var></dt><dd><var>nonce</var></dd><dt><var>暗号文</var></dt><dd><var>暗号文</var></dd><dt><var>関連付けされたデータ</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空バイト列</anchor><note xmlns="urn:x-suika-fam-cx:markup:ietf:html:3:draft:00:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="40" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[40]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 8188</anchor> では「additional data」と呼ばれています。</p></note></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="212" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[212]</anchor-end> <var>平文</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="214" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[214]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">仕様書になし</src></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="29" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[29]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Assert</anchor>:
<var>暗号文</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">byte length</title></anchor> = <var>平文</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">byte length</title></anchor> + <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16</n></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="42" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[42]</anchor-end> <var>結果バイト列</var>に、<var>平文</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">末尾に追加</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="39" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[39]</anchor-end> <var>復号器</var>の <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SEQ</f> を、 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インクリメント</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="37" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[37]</anchor-end> <var>詰め区切子オクテット</var>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n> の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="126" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[126]</anchor-end> 次のバイトを受信するか、受信<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>の終端に到達するのを待ちます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="127" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[127]</anchor-end> バイトを受信した場合、<ol><li><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="41" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[41]</anchor-end> 最終レコードを受信しましたが、まだ次のレコードがあります。</comment-p></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="128" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[128]</anchor-end> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</MUST>を返し、ここで停止します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="38" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[38]</anchor-end> ここで停止します。</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="117" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[117]</anchor-end><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="129" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[129]</anchor-end> 最終レコードを受信していませんが、もう次のレコードがありません。</comment-p></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="119" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[119]</anchor-end> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</MUST>を返し、ここで停止します。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src></li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="131" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[131]</anchor-end> 
<var>結果バイト列</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>した結果になります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="118" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[118]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>はエラー処理をほとんど曖昧に濁しています。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>とみなすべき条件がいくつか定められていますが、
そのときまでに得られた<var>結果バイト列</var>をそのまま使って良いのかどうか、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>から得られた情報を<var>結果バイト列</var>に含めて良いのか、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>からは読み取れません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="132" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[132]</anchor-end> 特に問題なのは、<var>詰め区切子オクテット</var>が最終レコードなら <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n>、
それ以外なら <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x01</n> でなければ<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>失敗</anchor><rt xmlns="http://www.w3.org/1999/xhtml">fail</rt></rubyb>としなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ならない</MUST>
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 2.</src> との条件です。<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストリーミング処理</anchor>でこの要件を満たすためには、
次のレコード (または入力の末端) まで処理を進める必要があります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>がどうとでも解釈できるので、
実装によって、あるいは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワーク</anchor>からの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の到着タイミング次第で、
挙動が変わってくるおそれがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="62" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[62]</anchor-end> 
途中で途切れたメッセージでも本手法は処理できますが、
完全なメッセージであるものとして処理しては<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
途中までのメッセージでも処理する受信者は、
攻撃者によりメッセージが途中で切られた可能性も考慮する必要があります。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 4.2.</src>
この規定の存在が、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>の扱いの解釈を難しくします。
途切れた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メッセージ</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ランダムアクセス</anchor>の処理では、
入力中最後の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>の<var>詰め区切子オクテット</var>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n>
でなくても認めなければなりません。
このような実装方針次第でいかようにもなりそうな曖昧な規定方法は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セキュリティー</anchor>問題の温床でしかありません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="157" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[157]</anchor-end> 途中の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>で解読に失敗した場合、
無視して次の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>に進むべきなのか、停止するべきなのか不明です。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="61" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[61]</anchor-end> 
本手法を使って内容の起源を認証する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">受信者</anchor>は、
<code>aes128gcm</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor>を含まない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPメッセージ</anchor>を拒絶しなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor>が自動的に除去されて、最終的な受信者がそれに気づかないおそれがあります。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> 4.1.</src></p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="174" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[174]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Push</anchor>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は、
複数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>に対応する必要はありません。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">rs</code></f>
を無視して<MAY xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">構いません</MAY>。
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor>を検査しなくても、
妥当な場合に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解読</anchor>は高い確率で失敗します。)
しかし<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">詰め区切子オクテット</anchor>は検査しなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n> 以外の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">詰め区切子オクテット</anchor>がある場合、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メッセージ</anchor>を捨てなければ<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">なりません</MUST>。
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal> 4.</src>
つまり<var>単一レコード</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor>として実行しなければなりません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="177" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[177]</anchor-end> 
とひどい規定があります。そんなことが許されるなら、
実際の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコードサイズ</anchor>と矛盾する
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">rs</code></f>
が指定されても受け入れられる可能性と拒絶される可能性があるわけで、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">相互運用性</anchor>のリスクでしかありません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="178" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[178]</anchor-end> 
しかも、複数<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>に対応する必要がないということは、
対応してもいいように聞こえますが、
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n> かどうか検査しなければならないということは、
複数<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">レコード</anchor>に対応してはいけないということです。
このような制限が認められることが
<code>aes128gcm</code>
の仕様書に一言も触れられていないのも問題です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="176" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[176]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Push</anchor>
では
<code>aes128gcm</code>
をちょうど1回だけ適用することが求められていますが、
受信者がどうするべきか定められていません。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor>が使われていない場合や、
他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor>が使われている場合にどう処理するべきかは不明です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="183" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[183]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Push</anchor> 専用に簡略化した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>は、
次のようにします。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="184" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[184]</anchor-end> <var>結果バイト列</var>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空バイト列</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="185" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[185]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">高々</anchor>4096バイト受信します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="186" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[186]</anchor-end> 次に受信したのが受信<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>の末尾でない場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="187" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[187]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="188" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[188]</anchor-end> <var>受信バイト列</var>を、受信<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="189" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[189]</anchor-end> <var>受信バイト列</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">バイト長</title></anchor>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">86</n>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">未満</anchor>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="190" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[190]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="191" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[191]</anchor-end> <var>salt</var>
を、<var>受信バイト列</var>の先頭16バイトに設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="192" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[192]</anchor-end> <var>レコードサイズ</var>を、
<var>受信バイト列</var>の第17バイトから第20バイトを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">32ビット符号無し整数</anchor>として解釈した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="193" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[193]</anchor-end> <var>レコードサイズ</var>が
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">18</n>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">未満</anchor>または<var>受信バイト列</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト長</anchor> - 86
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">未満</anchor>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="194" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[194]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="195" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[195]</anchor-end> <var>識別子長</var>を、
<var>受信バイト列</var>の第21バイトを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号無し整数</anchor>として解釈した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="196" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[196]</anchor-end> <var>識別子長</var>が <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">65</n> でない場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="197" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[197]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="198" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[198]</anchor-end> <var>鍵識別子</var>を、
<var>受信バイト列</var>の第22バイトから第86バイトの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="199" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[199]</anchor-end> <var>IKM</var> を、
<var>鍵識別子</var>について受信時の
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IKM</anchor>
を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="217" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[217]</anchor-end> <var>IKM</var> が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="218" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[218]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="200" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[200]</anchor-end> <var>PRK</var> を、
<var>salt</var>、
<var>IKM</var> について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PRK</anchor> を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="201" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[201]</anchor-end> <var>CEK</var> を、
<var>PRK</var>
について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CEK</anchor> を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="202" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[202]</anchor-end> 
<var>受信バイト列</var>のうち、
第1バイトから第86バイトを除去します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="203" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[203]</anchor-end> 
<var>受信バイト列</var>から、
末尾の
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n>
をすべて除去します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="204" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[204]</anchor-end> 
<var>受信バイト列</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空バイト列</anchor>の場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="205" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[205]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="206" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[206]</anchor-end> 
<var>受信バイト列</var>の最後のバイトが <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x02</n> で<em>ない</em>場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="207" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[207]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>を返し、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="208" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[208]</anchor-end> 
<var>受信バイト列</var>から最後のバイトを除去します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="209" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[209]</anchor-end> 
<var>nonce</var>
を、
<var>PRK</var> 
と
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>
について
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">nonce</anchor> を取得した結果に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="210" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[210]</anchor-end> 
<var>平文</var>を、
<code>AEAD_AES_128_GCM</code>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解読</anchor>を実行した結果に設定します。<figure class="list members"><dl><dt><var>鍵</var></dt><dd><var>CEK</var></dd><dt><var>nonce</var></dt><dd><var>nonce</var></dd><dt><var>暗号文</var></dt><dd><var>受信バイト列</var></dd><dt><var>関連付けされたデータ</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空バイト列</anchor></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="211" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[211]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Assert</anchor>: <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">平文</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>または<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor>。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="213" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[213]</anchor-end> <var>平文</var>を返します。</li></ol></figure><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="226" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[226]</anchor-end> こうしてみると、かなり簡略化できたものの実質的な意味のない検査がたくさん残ってしまって、
汎用的な複数レコード対応した手法を1レコードで使ったことの無駄さが感じられます。</comment-p></section><section><h1>歴史</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <cite xml:lang="en">Encrypted Content-Encoding for HTTP</cite>
(<time>2016-04-06 02:26:28 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://httpwg.org/http-extensions/draft-ietf-httpbis-encryption-encoding.html">http://httpwg.org/http-extensions/draft-ietf-httpbis-encryption-encoding.html</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <cite xml:lang="en">draft-ietf-webpush-encryption-08 - Message Encryption for Web Push</cite>
(<time>2017-04-16 18:28:05 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/draft-ietf-webpush-encryption-08">https://tools.ietf.org/html/draft-ietf-webpush-encryption-08</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IANA登録簿</anchor>に <code>aes128gcm</code> が登録されました。 <time>2017-04-21T03:50:50.600Z</time></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <cite xml:lang="en">Add PushManager.supportedContentEncodings (#252)</cite>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">beverloo</anchor>著, <time>2017-04-26 01:13:27 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/w3c/push-api/commit/813f9af75d59e3fa1522db9aeeaa2bd158ff10bf">https://github.com/w3c/push-api/commit/813f9af75d59e3fa1522db9aeeaa2bd158ff10bf</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <cite xml:lang="en">encrypted-content-encoding/ece.js at master · web-push-libs/encrypted-content-encoding</cite>
(<time>2019-01-04 13:12:20 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/web-push-libs/encrypted-content-encoding/blob/master/nodejs/ece.js">https://github.com/web-push-libs/encrypted-content-encoding/blob/master/nodejs/ece.js</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="134" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[134]</anchor-end> 古い案では<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor>
<dfn><code>aesgcm</code></dfn>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容符号化</anchor> <dfn><code>aesgcm128</code></dfn>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPヘッダー</anchor> <dfn><code class="HTTP" xml:lang="en">Encryption:</code></dfn>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPヘッダー</anchor> <dfn><code class="HTTP" xml:lang="en">Encryption-Key:</code></dfn>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPヘッダー</anchor> <dfn><code class="HTTP" xml:lang="en">Crypto-Key:</code></dfn>
が提案されていました。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> 
<time>平成29(2017)年6月<attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">2017-06</attrvalue></time>、
<code>aes128gcm</code>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>が
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IETF</anchor>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">提案標準</anchor>
<dfn>RFC 8188</dfn>
が出版されました
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal></src>。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="133" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[133]</anchor-end> それにしてもこの時代に出版されたとは思えない、古き悪しき時代を思わせる曖昧な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>です。
構文、生成側処理、解釈側処理のどれなのかはっきりしない曖昧な規定、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">事実の文</anchor>ベースで実装の要件がはっきりしない上に、
用語の表記がその場その場で少しずつ揺れていて意図的かどうかわかりにくい、
挙動が用語のイメージの暗黙の了解によって規定され明文化されていない、
といった <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IETF</anchor>
にありがちな空気を読まないといけない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>。
こんなもので<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">相互運用性</anchor>は維持できるのでしょうか。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="139" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[139]</anchor-end> 
<time>平成20(2017)年11月<attrvalue xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">2017-11</attrvalue></time>、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Push</anchor> での<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗号化</anchor>方式の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仕様書</anchor>が
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IETF</anchor> 
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">提案標準</anchor>
<dfn>RFC 8291</dfn>
として出版されました
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;137</anchor-internal></src>。</p></section></body></html>