Aller au contenu principal

Signature de messages, version 1

Statut : stable. Sert à signer des données arbitraires hors chaîne (la requête signArbitrary des portefeuilles compatibles Keplr), par exemple pour prouver à un service le contrôle d'un compte. Source : spec/message-signing-v1.md.

Signature​

{
"signatureType": "ml-dsa-87-hybrid",
"classical": { "keyType": "secp256k1", "publicKey": "<base64>", "signature": "<base64>" },
"pq": { "algorithmId": 1, "signature": "<base64>" }
}
  • Partie classique : ADR-36. La clé secp256k1 du compte signe le document de signature amino JSON de MsgSignData { signer, data }, exactement comme dans Sign In With QoreChain v1 (condensat SHA-256 pour les comptes secp256k1, KECCAK-256 pour eth_secp256k1 ; 64 octets r || s, low-S).
  • Partie post-quantique :
pq.signature = ML-DSA-87.Sign(sk, UTF-8("qorechain-msg-v1|" + chain_id + "|") || data, ctx = "")

data correspond aux octets bruts du message. chain_id ne contient que des lettres, des chiffres, ., _ et -.

Séparation des domaines​

Chaque signature ML-DSA-87 qu'un compte produit sur QoreChain commence par un domaine qui lui est propre, de sorte qu'une signature produite pour un usage ne puisse pas être rejouée pour un autre. Un portefeuille ne doit jamais signer d'octets bruts avec la clé ML-DSA-87 sans l'un de ces préfixes, et ne doit jamais laisser un message commencer par un préfixe réservé à un autre usage.

PréfixeUsage
qorechain-pqc-hybrid-v2sign-bytes de transaction (Signature de transactions hybride v1)
qorechain-pqc-pop-v1|preuve de possession lors de l'enregistrement de la clé
qorechain:pqc:recovery:v1récupération de compte
qorechain-svm-auth-v2autorisation de la voie SVM
qorechain-siwq-v1|Sign In With QoreChain (Sign In With QoreChain v1)
qorechain-msg-v1|cette spécification

Vérification​

  1. La clé publique classique dérive vers signer sous keyType, et la signature ADR-36 se vérifie.
  2. La signature ML-DSA-87 se vérifie avec la clé enregistrée sur la chaîne pour signer (/qorechain/pqc/v1/account/{address}), sur les octets ci-dessus avec l'identifiant de chaîne attendu.

Vecteurs de test​

vectors/qoresign-v1.json, champ message. Voir Vecteurs de test.