Sign In With QoreChain (SIWQ), sürüm 1
Durum: mesaj biçiminin 1. sürümü için kararlı. Kaynak:
spec/siwq-v1.md.
SIWQ, bir QoreChain hesabının anahtarlarının denetimini zincir dışı bir hizmete
kanıtlamasını sağlar. Mesaj,
EIP-4361 ve Sign In With Solana
düzenini izler ve QoreChain adreslerine ve zincir kimliklerine uyarlanmıştır.
İmzanın iki parçası vardır: herhangi bir Keplr uyumlu cüzdanın signArbitrary
ile üretebildiği bir ADR-36 secp256k1 imzası ve hesabın kayıtlı kuantum sonrası
anahtarına ait bir ML-DSA-87 (FIPS 204) imzası.
Mesaj
${scheme://}${domain} wants you to sign in with your QoreChain account:
${address}
${statement}
URI: ${uri}
Version: 1
Chain ID: ${chain-id}
Nonce: ${nonce}
Issued At: ${issued-at}
Expiration Time: ${expiration-time}
Not Before: ${not-before}
Request ID: ${request-id}
Resources:
- ${resources[0]}
- ${resources[1]}
...
- Satırlar tek bir
\nile ayrılır; sonda yeni satır yoktur. scheme://isteğe bağlıdır.domain, isteği yapan sitenin RFC 3986 yetkilisidir (ana makine ve isteğe bağlı port).address, hesabınqor1bech32 biçimidir.- Statement satırı isteğe bağlıdır. Olmadığında, EIP-4361'de olduğu gibi adresi iki boş satır izler.
Versiondeğeri1'dir.Chain ID,qorechain-vladigibi bir QoreChain zincir kimliğidir.Nonce, sunucunun seçtiği en az 8 alfasayısal karakterdir ve tek kullanımlıktır.- Zaman damgaları RFC 3339 / ISO 8601 biçimindedir.
Expiration Time,Not Before,Request IDveResourcesisteğe bağlıdır ve bu sırayla görünür.
Bir doğrulayıcı, ayrıştırılan alanları yeniden oluşturmalı ve bayt bayt eşleşmeyen bir mesajı reddetmelidir.
İmzalar
{
"signatureType": "ml-dsa-87-hybrid",
"classical": { "keyType": "secp256k1", "publicKey": "<base64>", "signature": "<base64>" },
"pq": { "algorithmId": 1, "signature": "<base64>" }
}
Klasik kısım (ADR-36)
Hesabın secp256k1 anahtarı, sıralı anahtarlarla ve boşluksuz serileştirilmiş
aşağıdaki amino JSON imza belgesini imzalar; burada data, UTF-8 mesajın base64
karşılığı ve signer qor1 adresidir:
{"account_number":"0","chain_id":"","fee":{"amount":[],"gas":"0"},"memo":"","msgs":[{"type":"sign/MsgSignData","value":{"data":"...","signer":"qor1..."}}],"sequence":"0"}
Özet, secp256k1 hesapları için SHA-256, eth_secp256k1 hesapları için
KECCAK-256'dır; imza 64 bayt r || s, low-S'tir. publicKey, 33 baytlık
sıkıştırılmış anahtardır ve keyType altında address'e türemelidir.
Kuantum sonrası kısım
pq.signature = ML-DSA-87.Sign(sk, UTF-8("qorechain-siwq-v1|" + message))
Alan öneki, bir oturum açma imzasının işlem imzası olarak kullanılabilmesini ve tersini önler (bkz. Alan ayrımı).
pq kısmı yoksa signatureType değeri secp256k1'dir. Doğrulayıcılar,
yalnızca klasik hesapları açıkça kabul etmedikçe bu tür oturum açmaları
reddetmelidir.
Doğrulama
Bir doğrulayıcı şunları bu sırayla denetlemelidir:
- mesaj ayrıştırılır ve kanonik biçimdedir;
domain, isteğin geldiği alan adına eşittir;nonce, sunucunun bu oturum için ürettiği nonce'a eşittir ve nonce daha önce kullanılmamıştır;Chain IDbeklenen ağdır;Expiration Timegelecektedir;Not BeforeveIssued Atgelecekte değildir (küçük bir saat sapmasına izin verilir);- klasik açık anahtar
address'e türer ve ADR-36 imzası doğrulanır; - ML-DSA-87 imzası, istemcinin sağladığı bir anahtara karşı değil,
addressiçin zincirde kayıtlı açık anahtara (/qorechain/pqc/v1/account/{address}) karşı doğrulanır.
Test vektörleri
vectors/qoresign-v1.json, siwq alanı. Bkz. Test vektörleri.