要約

  • RFC 3657はCMSにおけるCamelliaのコンテンツ暗号化と鍵ラップに別々の識別子を割り当てた。CBCのコンテンツ暗号化では16オクテットのIVが必須で、鍵ラップのアルゴリズム識別子ではパラメーターを省略する。
  • S/MIMEの能力通知には第三の形式があり、パラメーターはNULLとなる。鍵ラップOIDが示すのは鍵暗号化鍵(KEK)の長さで、ラップされるコンテンツ暗号化鍵(CEK)の長さとは限らない。

同じ名前でも同じ処理ではない

CMSのエンベロープを読むとき、「Camellia」という名前だけでは送信側の処理を特定できない。受信側は、そのアルゴリズムが本文を暗号化したのか、コンテンツ暗号化鍵(CEK)をラップしたのかを見分け、役割に応じて識別子を解釈する必要がある。2004年1月にStandards Trackとして刊行されたRFC 3657は、CamelliaをCMSで使うため、コンテンツCBC暗号化用と鍵ラップ用の二つのOID群を定めた。RFC 3657

違いはパラメーターに表れる。id-camellia128-cbc、id-camellia192-cbc、id-camellia256-cbcでは、AlgorithmIdentifierのパラメーター欄が存在し、16オクテットの初期化ベクトルを含まなければならない。IVはコンテンツ暗号化の記述の一部であり、暗号名から推測するものではない。平文のパディングにはCMSの規則が適用される。RFC 3657 RFC 5652

鍵ラップでは期待が逆になる。Camelliaの三つのラップOIDには鍵長を示す枝がある一方、AlgorithmIdentifierのパラメーター欄は存在してはならない。ラップ処理は内部の初期値の使い方を定義しているため、この欄にIVを入れない。OIDの鍵長が指すのは鍵暗号化鍵(KEK)で、ラップされるCEKの長さまで決めるものではない。実装はKEKとCEKが同じ長さの場合に対応しなければならず、異なる長さもサポートするならKEKはCEK以上の長さでなければならない。したがってRFC 3657が定めたのは符号化と相互運用の境界であり、封筒内のすべての鍵を同じ長さにする規則ではない。RFC 3657 RFC 3394

能力通知には第三の形式がある

RFC 3657は、S/MIMEクライアントがSMIMECapabilitiesでCamellia対応を知らせる方法も定義した。能力OIDにはNULLパラメーターを付ける。鍵ラップ識別子でパラメーターを省くこととは矛盾しない。役割の異なるASN.1構造を使っているからだ。また、伝送上NULLとパラメーターなしは同じ表現ではない。RFCには三つの鍵長についてDER符号化の例もあり、能力値をバイト単位で照合できる。RFC 3657 RFC 2633

能力リストは署名され、優先順に並ぶが、送信側が対応する機能を部分的に示すだけである。送信側の選択には、私的な合意、利用者の希望、法的制約なども関わる。これはその場で行われるネゴシエーションでも、受信側の現在の設定を試す仕組みでも、特定のメッセージでCamelliaが実際に使われた証拠でもない。実際の処理を知るには、過去の能力通知だけでなく、エンベロープ内のコンテンツ暗号化と鍵管理の各フィールドを確認する必要がある。RFC 3657

相互運用性は境界を分けて検査する

相互運用の検査では三つの文脈を別々に照合する。CBCのコンテンツ暗号化では識別子、鍵長、16オクテットのIVを確認する。鍵ラップではパラメーターが省略されているか、また実際のKEKとCEKの長さが実装の対応範囲を満たすかを確かめる。能力通知ではNULLを含む署名済みDER値と優先順位を比較する。同じ暗号に対応すると各機器が宣言していても、これらを混同すれば解析や選択の食い違いが起こりうる。

RFC 3657は、Camelliaの鍵ラップがRFC 3394の方式に従い、AESをCamelliaに置き換えると定めた。両者のブロック長は128ビットである。既定の完全性初期値は定数A6A6A6A6A6A6A6A6であり、アンラップ後にその値が得られなければ、受信側はエラーを返し鍵データを返してはならない。用途固有の完全性範囲に合わせた別の初期値も許される。この検査が対象にするのは規定方式でラップされた鍵データであり、送信者、CMS本文、復号後の利用者権限を認証するものではない。RFC 3657 RFC 3394

ここで行っているのは歴史的な符号化契約の再構成であり、現代の安全性を推奨したり普及度を数えたりするものではない。CMSのアルゴリズム一覧や後続プロファイルは背景にはなるが、どの製品がRFC 3657を実装したか、どれほど使われたかは示さない。教訓はより限定的だ。アルゴリズム識別子は型を持つプロトコルフィールドであり、OID、パラメーターの有無、外側の構造を合わせて読む必要がある。RFC 3370 RFC 8419

出典