7.1.3. DeriveKeyPair (Schlüsselpaar-Ableitung)
7.1.3. DeriveKeyPair (Schlüsselpaar-Ableitung)
Die Schlüssel, die DeriveKeyPair() erzeugt, haben nur so viel Entropie wie das bereitgestellte Eingabe-Schlüsselmaterial. Für einen gegebenen KEM SOLLTE der ikm-Parameter, der an DeriveKeyPair() übergeben wird, mindestens die Länge Nsk haben und SOLLTE mindestens Nsk Bytes an Entropie haben.
Alle Aufrufe von KDF-Funktionen (wie LabeledExtract oder LabeledExpand) in der DeriveKeyPair()-Funktion eines beliebigen DHKEM verwenden den zugeordneten KDF des DHKEM (im Gegensatz zum KDF der Cipher-Suite).
Für P-256, P-384 und P-521 führt die DeriveKeyPair()-Funktion des KEM Rejection Sampling über Feldelemente durch:
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 ist die Ordnung der verwendeten Kurve (siehe Abschnitt D.1.2 von [NISTCurves]) und wird unten zur Vollständigkeit aufgelistet.
P-256:
0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551
P-384:
0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf
581a0db248b0a77aecec196accc52973
P-521:
0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409
bitmask ist für P-256 und P-384 als 0xFF definiert und für P-521 als 0x01. Die genaue Wahrscheinlichkeit, dass DeriveKeyPair() mit DeriveKeyPairError fehlschlägt, hängt von der verwendeten Gruppe ab, ist aber in allen Fällen vernachlässigbar klein. Siehe Abschnitt 8.2 für Informationen zum Umgang mit solchen Fehlern.
Für X25519 und X448 wendet die DeriveKeyPair()-Funktion einen KDF auf die Eingabe an:
def DeriveKeyPair(ikm):
dkp_prk = LabeledExtract("", "dkp_prk", ikm)
sk = LabeledExpand(dkp_prk, "sk", "", Nsk)
return (sk, pk(sk))