fix: sign and export with each address's own derivation index (closes #510)
Sending, site transactions, site signatures and private key export derived the key at the address's position in the wallet's list. After an import whose scan passed over an unused index, or after removing an address that was not the last, that position named another address's key. Each HD and xprv address record now stores the index it was derived at (at wallet creation, by the import scan, by "+"). getSignerForAddress() derives at that index, refuses a record without one, and refuses any key whose address differs from the record's. The confirmation screen signs as the From address it shows, not the selected one. The export screen reports a refusal instead of calling the password wrong. Model: opus-5-5
This commit was merged in pull request #536.
This commit is contained in:
@@ -135,7 +135,18 @@ async function reveal() {
|
||||
// decrypt ran, the wipe has already happened, so the key is not
|
||||
// even derived, let alone written.
|
||||
if (!isCurrentReveal(generation)) return;
|
||||
const signer = getSignerForAddress(wallet, addressIndex, secret);
|
||||
let signer;
|
||||
try {
|
||||
signer = getSignerForAddress(
|
||||
wallet,
|
||||
wallet.addresses[addressIndex],
|
||||
secret,
|
||||
);
|
||||
} catch (e) {
|
||||
// The password was right; it is the key that was refused.
|
||||
showError("export-privkey-password-error", e.message);
|
||||
return;
|
||||
}
|
||||
$("export-privkey-password").value = "";
|
||||
$("export-privkey-password-section").classList.add("hidden");
|
||||
$("export-privkey-value").textContent = signer.privateKey;
|
||||
|
||||
Reference in New Issue
Block a user