5.1 Creating the Encryption Context (暗号化コンテキストの作成)
5.1 Creating the Encryption Context (暗号化コンテキストの作成)
この文書で定義されている HPKE のバリアントは, プロトコル入力を暗号化コンテキストに変換する共通の鍵スケジュール (key schedule) を共有します。鍵スケジュールの入力は以下の通りです:
-
mode: 表1で定義された HPKE モードを示す1バイト値。 -
shared_secret: このトランザクション用に生成された KEM 共有秘密。 -
info: アプリケーションが提供する情報 (オプション; デフォルト値は "")。 -
psk: 送信者と受信者の両方が保持する事前共有鍵 (PSK) (オプション; デフォルト値は "")。 -
psk_id: PSK の識別子 (オプション; デフォルト値は "")。
送信者と受信者は, 7.1節で説明されているように KEM の入力と出力を検証しなければなりません。
psk と psk_id フィールドは一緒に出現するか, まったく出現しないかのいずれかでなければなりません。つまり, いずれか一方に非デフォルト値が提供される場合, もう一方も非デフォルト値に設定されなければなりません。この要件は以下の VerifyPSKInputs() にエンコードされています。
psk, psk_id, info フィールドには最大長があり, これらは KDF 自体, LabeledExtract() の定義, およびそれらと共に使用される定数ラベルに依存します。これらの長さの正確な制限については7.2.1節を参照してください。
鍵スケジュールによって計算される key, base_nonce, exporter_secret は, 受信者秘密鍵の保持者と KEM を使用して shared_secret と enc を生成したエンティティのみが知っているという特性を持ちます。
Auth および AuthPSK モードでは, 受信者は送信者が秘密鍵 skS を保持していたことを保証されます。4.1節と9.1節で説明されているように, 鍵侵害なりすまし (key-compromise impersonation) のため, この文書で定義されている DHKEM バリアントではこの保証は制限されます。PSK および AuthPSK モードで psk と psk_id 引数が要求通りに提供される場合, 受信者は送信者が対応する事前共有鍵を保持していたことを保証されます。詳細については9.1節を参照してください。
HPKE アルゴリズム識別子, すなわち KEM kem_id, KDF kdf_id, AEAD aead_id の2バイトコードポイントは, それぞれ表2, 3, 5で定義されており, 実装から暗黙的に想定され, パラメータとして渡されません。LabeledExtract と LabeledExpand 内で使用される暗黙の suite_id 値は, 次のようにそれらに基づいて定義されます:
suite_id = concat(
"HPKE",
I2OSP(kem_id, 2),
I2OSP(kdf_id, 2),
I2OSP(aead_id, 2)
)
default_psk = ""
default_psk_id = ""
def VerifyPSKInputs(mode, psk, psk_id):
got_psk = (psk != default_psk)
got_psk_id = (psk_id != default_psk_id)
if got_psk != got_psk_id:
raise Exception("Inconsistent PSK inputs")
if got_psk and (mode in [mode_base, mode_auth]):
raise Exception("PSK input provided when not needed")
if (not got_psk) and (mode in [mode_psk, mode_auth_psk]):
raise Exception("Missing required PSK input")
def KeySchedule<ROLE>(mode, shared_secret, info, psk, psk_id):
VerifyPSKInputs(mode, psk, psk_id)
psk_id_hash = LabeledExtract("", "psk_id_hash", psk_id)
info_hash = LabeledExtract("", "info_hash", info)
key_schedule_context = concat(mode, psk_id_hash, info_hash)
secret = LabeledExtract(shared_secret, "secret", psk)
key = LabeledExpand(secret, "key", key_schedule_context, Nk)
base_nonce = LabeledExpand(secret, "base_nonce",
key_schedule_context, Nn)
exporter_secret = LabeledExpand(secret, "exp",
key_schedule_context, Nh)
return Context<ROLE>(key, base_nonce, 0, exporter_secret)
ROLE テンプレートパラメータは, 送信者または受信者の役割に応じて, それぞれ S または R です。鍵スケジュール出力 (役割固有の Context 構造とその API を含む) の議論については, 5.2節 を参照してください。
KeySchedule() における key_schedule_context 構造は, TLS 表現構文で以下の形式の構造をシリアライズすることと等価であることに注意してください:
struct {
uint8 mode;
opaque psk_id_hash[Nh];
opaque info_hash[Nh];
} KeyScheduleContext;