7.1.3. DeriveKeyPair (Dérivation de paires de clés)
7.1.3. DeriveKeyPair (Dérivation de paires de clés)
Les clés que DeriveKeyPair() produit n'ont qu'autant d'entropie que le matériel de clé d'entrée fourni. Pour un KEM donné, le paramètre ikm donné à DeriveKeyPair() DEVRAIT avoir une longueur d'au moins Nsk, et DEVRAIT avoir au moins Nsk octets d'entropie.
Toutes les invocations de fonctions KDF (telles que LabeledExtract ou LabeledExpand) dans la fonction DeriveKeyPair() de tout DHKEM utilisent le KDF associé du DHKEM (par opposition au KDF de la suite cryptographique).
Pour P-256, P-384 et P-521, la fonction DeriveKeyPair() du KEM effectue un échantillonnage par rejet sur les éléments de champ:
def DeriveKeyPair(ikm):
dkp_prk = LabeledExtract("", "dkp_prk", ikm)
sk = 0
counter = 0
while sk == 0 or sk >= order:
if counter > 255:
raise DeriveKeyPairError
bytes = LabeledExpand(dkp_prk, "candidate",
I2OSP(counter, 1), Nsk)
bytes[0] = bytes[0] & bitmask
sk = OS2IP(bytes)
counter = counter + 1
return (sk, pk(sk))
order est l'ordre de la courbe utilisée (voir la section D.1.2 de [NISTCurves]), et est listé ci-dessous pour être complet.
P-256:
0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551
P-384:
0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf
581a0db248b0a77aecec196accc52973
P-521:
0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409
bitmask est défini comme étant 0xFF pour P-256 et P-384, et 0x01 pour P-521. La probabilité précise que DeriveKeyPair() échoue avec DeriveKeyPairError dépend du groupe utilisé, mais elle est négligeable dans tous les cas. Voir la section 8.2 pour des informations sur la gestion de tels échecs.
Pour X25519 et X448, la fonction DeriveKeyPair() applique un KDF à l'entrée:
def DeriveKeyPair(ikm):
dkp_prk = LabeledExtract("", "dkp_prk", ikm)
sk = LabeledExpand(dkp_prk, "sk", "", Nsk)
return (sk, pk(sk))