5.1 Creating the Encryption Context (Création du contexte de chiffrement)
5.1 Creating the Encryption Context (Création du contexte de chiffrement)
Les variantes HPKE définies dans ce document partagent une planification de clés (key schedule) commune qui traduit les entrées du protocole en un contexte de chiffrement. Les entrées de la planification de clés sont les suivantes:
-
mode: Une valeur d'un octet indiquant le mode HPKE, défini dans le Tableau 1. -
shared_secret: Un secret partagé KEM généré pour cette transaction. -
info: Informations fournies par l'application (optionnel; valeur par défaut ""). -
psk: Une clé prépartagée (PSK) détenue à la fois par l'émetteur et le destinataire (optionnel; valeur par défaut ""). -
psk_id: Un identifiant pour la PSK (optionnel; valeur par défaut "").
Les émetteurs et les destinataires DOIVENT valider les entrées et sorties KEM comme décrit dans la Section 7.1.
Les champs psk et psk_id DOIVENT apparaître ensemble ou pas du tout. C'est-à-dire que si une valeur non par défaut est fournie pour l'un d'eux, alors l'autre DOIT être défini sur une valeur non par défaut. Cette exigence est encodée dans VerifyPSKInputs() ci-dessous.
Les champs psk, psk_id et info ont des longueurs maximales qui dépendent du KDF lui-même, de la définition de LabeledExtract(), et des étiquettes constantes utilisées avec eux. Voir la Section 7.2.1 pour les limites précises sur ces longueurs.
La clé (key), le base_nonce et l'exporter_secret calculés par la planification de clés ont la propriété qu'ils ne sont connus que du détenteur de la clé privée du destinataire et de l'entité qui a utilisé le KEM pour générer shared_secret et enc.
Dans les modes Auth et AuthPSK, le destinataire est assuré que l'émetteur détenait la clé privée skS. Cette assurance est limitée pour les variantes DHKEM définies dans ce document en raison de l'usurpation d'identité par compromission de clé (key-compromise impersonation), comme décrit dans les Sections 4.1 et 9.1. Si dans les modes PSK et AuthPSK, les arguments psk et psk_id sont fournis comme requis, alors le destinataire est assuré que l'émetteur détenait la clé prépartagée correspondante. Voir la Section 9.1 pour plus de détails.
Les identifiants d'algorithme HPKE, c'est-à-dire les points de code de 2 octets KEM kem_id, KDF kdf_id et AEAD aead_id, tels que définis dans les Tableaux 2, 3 et 5 respectivement, sont supposés implicites de l'implémentation et ne sont pas passés comme paramètres. La valeur suite_id implicite utilisée dans LabeledExtract et LabeledExpand est définie en fonction d'eux comme suit:
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)
Le paramètre de template ROLE est soit S soit R, selon le rôle d'émetteur ou de destinataire, respectivement. Voir la Section 5.2 pour une discussion sur la sortie de la planification de clés, y compris la structure Context spécifique au rôle et son API.
Notez que la construction key_schedule_context dans KeySchedule() est équivalente à la sérialisation d'une structure de la forme suivante dans la syntaxe de présentation TLS:
struct {
uint8 mode;
opaque psk_id_hash[Nh];
opaque info_hash[Nh];
} KeyScheduleContext;