Derivazione delle chiavi ML-DSA-87
Stato: la derivazione canonica è stabile. La derivazione gerarchica è una
bozza: le implementazioni possono cambiare prima che diventi definitiva, e le
chiavi derivate con essa devono essere registrate on-chain come qualsiasi altra
chiave. Fonte:
spec/hd-derivation-draft.md.
Derivazione canonica (stabile)
I wallet QoreChain e il QoreChain SDK derivano una chiave ML-DSA-87 per account dalla mnemonica BIP-39 e dall'indirizzo dell'account:
seed = SHAKE256( UTF-8( "qorechain:pqc:v1|" + bech32_address + "|" + mnemonic ), 32 bytes )
(pk, sk) = ML-DSA-87.KeyGen_internal(seed)
bech32_addressè la formaqor1dell'account (un indirizzo0xviene prima convertito negli stessi 20 byte).mnemonicè la frase in forma canonica: parole inglesi minuscole separate da spazi singoli, senza nulla prima o dopo. Le implementazioni devono rifiutare qualsiasi altra grafia invece di normalizzarla in silenzio, perché una stringa diversa produce una chiave diversa.- La chiave è legata all'indirizzo: la stessa mnemonica produce una chiave diversa per ogni account.
Un wallet che usa questa derivazione firma con la chiave già registrata per gli account creati dai wallet QoreChain.
Derivazione gerarchica (bozza)
Per i wallet che hanno bisogno di più chiavi post-quantistiche da un unico seed senza legarle a un indirizzo. ML-DSA non ha una derivazione pubblica dei figli, quindi ogni segmento del percorso è hardened.
La costruzione è SLIP-0010 con una propria stringa per la chiave master:
I = HMAC-SHA512(key = "qorechain-mldsa87-seed", data = seed)
k = I[0..32], c = I[32..64]
for each index i (all >= 2^31):
I = HMAC-SHA512(key = c, data = 0x00 || k || ser32(i))
k = I[0..32], c = I[32..64]
(pk, sk) = ML-DSA-87.KeyGen_internal(k)
seedè il seed BIP-39 da 64 byte (mnemonica più passphrase facoltativa), o un qualsiasi seed da 16 a 64 byte.- Il percorso predefinito è
m/44'/118'/{account}'/0'/0'. - Un percorso con un qualsiasi segmento non hardened viene rifiutato.
Punti aperti prima che diventi definitiva: il coin type da usare nel percorso,
l'interazione con la rotazione delle chiavi on-chain (MsgRotatePQCKey) e
l'allineamento con altri ecosistemi che derivano chiavi post-quantistiche da un
seed.
Vettori di test
vectors/qoresign-v1.json, campi canonical, hd e hdRejected. Vedi
Vettori di test.