メッセージ署名、バージョン 1
ステータス: 安定。任意のデータをオフチェーンで署名するためのものです(Keplr 互換
ウォレットの signArbitrary リクエスト)。たとえば、サービスに対してアカウントの
制御を証明する場合などに使います。ソース:
spec/message-signing-v1.md。
署名
{
"signatureType": "ml-dsa-87-hybrid",
"classical": { "keyType": "secp256k1", "publicKey": "<base64>", "signature": "<base64>" },
"pq": { "algorithmId": 1, "signature": "<base64>" }
}
- 従来型の部分: ADR-36。アカウントの secp256k1 鍵が
MsgSignData { signer, data }の amino JSON 署名ドキュメントに署名します。 Sign In With QoreChain v1 とまったく同じ です(secp256k1アカウントは SHA-256 ダイジェスト、eth_secp256k1は KECCAK-256。64 バイトのr || s、low-S)。 - 耐量子の部分:
pq.signature = ML-DSA-87.Sign(sk, UTF-8("qorechain-msg-v1|" + chain_id + "|") || data, ctx = "")
data は生のメッセージバイト列です。chain_id には英字、数字、.、_、- のみが
含まれます。
ドメイン分離
QoreChain 上でアカウントが行うすべての ML-DSA-87 署名は、それぞれ固有のドメインで 始まります。そのため、ある目的のために生成された署名を別の目的で再利用(リプレイ) することはできません。ウォレットは、これらのプレフィックスのいずれかなしに、生の バイト列を ML-DSA-87 鍵で署名してはならず、また、メッセージが別の用途のために予約 されたプレフィックスで始まることを許してはなりません。
| プレフィックス | 用途 |
|---|---|
qorechain-pqc-hybrid-v2 | トランザクションの sign-bytes(ハイブリッドトランザクション署名 v1) |
qorechain-pqc-pop-v1| | 鍵登録時の所有証明 |
qorechain:pqc:recovery:v1 | アカウントリカバリー |
qorechain-svm-auth-v2 | SVM レーンの認可 |
qorechain-siwq-v1| | Sign In With QoreChain(Sign In With QoreChain v1) |
qorechain-msg-v1| | この仕様 |
検証
- 従来型の公開鍵が
keyTypeのもとでsignerに導出され、ADR-36 署名が検証される。 - ML-DSA-87 署名が、
signerに対してチェーン上に登録されている鍵 (/qorechain/pqc/v1/account/{address})のもとで、期待されるチェーン ID を用いた 上記のバイト列に対して検証される。
テストベクター
vectors/qoresign-v1.json の message フィールドです。
テストベクターを参照してください。