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))