Make it mandatory for the user to set the master fingerprint in the wallet settings for seed signing. Improve error messages.

This commit is contained in:
nicolas.dorier 2019-12-23 22:24:29 +09:00
parent a73d2db02a
commit aa459d0ff3
No known key found for this signature in database
GPG key ID: 6618763EF09186FE
2 changed files with 22 additions and 11 deletions

View file

@ -485,8 +485,6 @@ namespace BTCPayServer.Tests
} }
} }
SignWith(mnemonic); SignWith(mnemonic);
var accountKey = root.Derive(new KeyPath("m/84'/1'/0'")).GetWif(Network.RegTest).ToString();
SignWith(accountKey);
} }
} }
} }

View file

@ -584,28 +584,41 @@ namespace BTCPayServer.Controllers
signingKeySettings.RootFingerprint = extKey.GetPublicKey().GetHDFingerPrint(); signingKeySettings.RootFingerprint = extKey.GetPublicKey().GetHDFingerPrint();
RootedKeyPath rootedKeyPath = signingKeySettings.GetRootedKeyPath(); RootedKeyPath rootedKeyPath = signingKeySettings.GetRootedKeyPath();
if (rootedKeyPath == null)
{
ModelState.AddModelError(nameof(viewModel.SeedOrKey), "The master fingerprint and/or account key path of your seed are not set in the wallet settings.");
return View(viewModel);
}
// The user gave the root key, let's try to rebase the PSBT, and derive the account private key // The user gave the root key, let's try to rebase the PSBT, and derive the account private key
if (rootedKeyPath?.MasterFingerprint == extKey.GetPublicKey().GetHDFingerPrint()) if (rootedKeyPath.MasterFingerprint == extKey.GetPublicKey().GetHDFingerPrint())
{ {
psbt.RebaseKeyPaths(signingKeySettings.AccountKey, rootedKeyPath); psbt.RebaseKeyPaths(signingKeySettings.AccountKey, rootedKeyPath);
signingKey = extKey.Derive(rootedKeyPath.KeyPath); signingKey = extKey.Derive(rootedKeyPath.KeyPath);
} }
// The user maybe gave the account key, let's try to sign with it
else else
{ {
signingKey = extKey; ModelState.AddModelError(nameof(viewModel.SeedOrKey), "The master fingerprint does not match the one set in your wallet settings. Probable cause are: wrong seed, wrong passphrase or wrong fingerprint in your wallet settings.");
} return View(viewModel);
var balanceChange = psbt.GetBalance(settings.AccountDerivation, signingKey, rootedKeyPath); }
if (balanceChange == Money.Zero)
{ var changed = PSBTChanged(psbt, () => psbt.SignAll(settings.AccountDerivation, signingKey, rootedKeyPath));
ModelState.AddModelError(nameof(viewModel.SeedOrKey), "This seed is unable to sign this transaction. Either the seed is incorrect, or the account path has not been properly configured in the Wallet Settings."); if (!changed)
{
ModelState.AddModelError(nameof(viewModel.SeedOrKey), "Impossible to sign the transaction. Probable cause: Incorrect account key path in wallet settings, PSBT already signed.");
return View(viewModel); return View(viewModel);
} }
psbt.SignAll(settings.AccountDerivation, signingKey, rootedKeyPath);
ModelState.Remove(nameof(viewModel.PSBT)); ModelState.Remove(nameof(viewModel.PSBT));
return await WalletPSBTReady(walletId, psbt.ToBase64(), signingKey.GetWif(network.NBitcoinNetwork).ToString(), rootedKeyPath?.ToString()); return await WalletPSBTReady(walletId, psbt.ToBase64(), signingKey.GetWif(network.NBitcoinNetwork).ToString(), rootedKeyPath?.ToString());
} }
private bool PSBTChanged(PSBT psbt, Action act)
{
var before = psbt.ToBase64();
act();
var after = psbt.ToBase64();
return before != after;
}
private string ValueToString(Money v, BTCPayNetworkBase network) private string ValueToString(Money v, BTCPayNetworkBase network)
{ {
return v.ToString() + " " + network.CryptoCode; return v.ToString() + " " + network.CryptoCode;