Passa al contenuto principale

7.1.3. DeriveKeyPair (Derivazione di coppie di chiavi)

7.1.3. DeriveKeyPair (Derivazione di coppie di chiavi)

Le chiavi che DeriveKeyPair() produce hanno solo tanta entropia quanto il materiale di chiave di input fornito. Per un dato KEM, il parametro ikm fornito a DeriveKeyPair() DOVREBBE avere lunghezza almeno Nsk e DOVREBBE avere almeno Nsk byte di entropia.

Tutte le invocazioni di funzioni KDF (come LabeledExtract o LabeledExpand) nella funzione DeriveKeyPair() di qualsiasi DHKEM utilizzano il KDF associato del DHKEM (in contrapposizione al KDF della cipher suite).

Per P-256, P-384 e P-521, la funzione DeriveKeyPair() del KEM esegue il campionamento per rifiuto sugli elementi di campo:

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 è l'ordine della curva utilizzata (vedere la sezione D.1.2 di [NISTCurves]) ed è elencato di seguito per completezza.

P-256:

0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551

P-384:

0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf
581a0db248b0a77aecec196accc52973

P-521:

0x01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409

bitmask è definito come 0xFF per P-256 e P-384 e 0x01 per P-521. La probabilità precisa che DeriveKeyPair() fallisca con DeriveKeyPairError dipende dal gruppo utilizzato, ma è trascurabile in tutti i casi. Vedere la sezione 8.2 per informazioni sulla gestione di tali fallimenti.

Per X25519 e X448, la funzione DeriveKeyPair() applica un KDF all'input:

def DeriveKeyPair(ikm):
dkp_prk = LabeledExtract("", "dkp_prk", ikm)
sk = LabeledExpand(dkp_prk, "sk", "", Nsk)
return (sk, pk(sk))