Merge pull request #5 from j-berman/restore-msig-encrypted-seed
multisig: fix segfault restoring encrypted multisig seed
This commit is contained in:
commit
12e7c4188e
|
@ -4118,6 +4118,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
|
||||||
|
|
||||||
epee::wipeable_string multisig_keys;
|
epee::wipeable_string multisig_keys;
|
||||||
epee::wipeable_string password;
|
epee::wipeable_string password;
|
||||||
|
epee::wipeable_string seed_pass;
|
||||||
|
|
||||||
if (!handle_command_line(vm))
|
if (!handle_command_line(vm))
|
||||||
return false;
|
return false;
|
||||||
|
@ -4224,19 +4225,9 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
|
||||||
auto pwd_container = password_prompter(tr("Enter seed offset passphrase, empty if none"), false);
|
auto pwd_container = password_prompter(tr("Enter seed offset passphrase, empty if none"), false);
|
||||||
if (std::cin.eof() || !pwd_container)
|
if (std::cin.eof() || !pwd_container)
|
||||||
return false;
|
return false;
|
||||||
epee::wipeable_string seed_pass = pwd_container->password();
|
seed_pass = pwd_container->password();
|
||||||
if (!seed_pass.empty())
|
if (!seed_pass.empty() && !m_restore_multisig_wallet)
|
||||||
{
|
m_recovery_key = cryptonote::decrypt_key(m_recovery_key, seed_pass);
|
||||||
if (m_restore_multisig_wallet)
|
|
||||||
{
|
|
||||||
crypto::secret_key key;
|
|
||||||
crypto::cn_slow_hash(seed_pass.data(), seed_pass.size(), (crypto::hash&)key);
|
|
||||||
sc_reduce32((unsigned char*)key.data);
|
|
||||||
multisig_keys = m_wallet->decrypt<epee::wipeable_string>(std::string(multisig_keys.data(), multisig_keys.size()), key, true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
m_recovery_key = cryptonote::decrypt_key(m_recovery_key, seed_pass);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (!m_generate_from_view_key.empty())
|
if (!m_generate_from_view_key.empty())
|
||||||
{
|
{
|
||||||
|
@ -4579,7 +4570,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
|
||||||
m_wallet_file = m_generate_new;
|
m_wallet_file = m_generate_new;
|
||||||
boost::optional<epee::wipeable_string> r;
|
boost::optional<epee::wipeable_string> r;
|
||||||
if (m_restore_multisig_wallet)
|
if (m_restore_multisig_wallet)
|
||||||
r = new_wallet(vm, multisig_keys, old_language);
|
r = new_wallet(vm, multisig_keys, seed_pass, old_language);
|
||||||
else
|
else
|
||||||
r = new_wallet(vm, m_recovery_key, m_restore_deterministic_wallet, m_non_deterministic, old_language);
|
r = new_wallet(vm, m_recovery_key, m_restore_deterministic_wallet, m_non_deterministic, old_language);
|
||||||
CHECK_AND_ASSERT_MES(r, false, tr("account creation failed"));
|
CHECK_AND_ASSERT_MES(r, false, tr("account creation failed"));
|
||||||
|
@ -5070,7 +5061,7 @@ boost::optional<epee::wipeable_string> simple_wallet::new_wallet(const boost::pr
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
boost::optional<epee::wipeable_string> simple_wallet::new_wallet(const boost::program_options::variables_map& vm,
|
boost::optional<epee::wipeable_string> simple_wallet::new_wallet(const boost::program_options::variables_map& vm,
|
||||||
const epee::wipeable_string &multisig_keys, const std::string &old_language)
|
const epee::wipeable_string &multisig_keys, const epee::wipeable_string &seed_pass, const std::string &old_language)
|
||||||
{
|
{
|
||||||
std::pair<std::unique_ptr<tools::wallet2>, tools::password_container> rc;
|
std::pair<std::unique_ptr<tools::wallet2>, tools::password_container> rc;
|
||||||
try { rc = tools::wallet2::make_new(vm, false, password_prompter); }
|
try { rc = tools::wallet2::make_new(vm, false, password_prompter); }
|
||||||
|
@ -5104,7 +5095,16 @@ boost::optional<epee::wipeable_string> simple_wallet::new_wallet(const boost::pr
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_wallet->generate(m_wallet_file, std::move(rc.second).password(), multisig_keys, create_address_file);
|
if (seed_pass.empty())
|
||||||
|
m_wallet->generate(m_wallet_file, std::move(rc.second).password(), multisig_keys, create_address_file);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
crypto::secret_key key;
|
||||||
|
crypto::cn_slow_hash(seed_pass.data(), seed_pass.size(), (crypto::hash&)key);
|
||||||
|
sc_reduce32((unsigned char*)key.data);
|
||||||
|
const epee::wipeable_string &msig_keys = m_wallet->decrypt<epee::wipeable_string>(std::string(multisig_keys.data(), multisig_keys.size()), key, true);
|
||||||
|
m_wallet->generate(m_wallet_file, std::move(rc.second).password(), msig_keys, create_address_file);
|
||||||
|
}
|
||||||
bool ready;
|
bool ready;
|
||||||
uint32_t threshold, total;
|
uint32_t threshold, total;
|
||||||
if (!m_wallet->multisig(&ready, &threshold, &total) || !ready)
|
if (!m_wallet->multisig(&ready, &threshold, &total) || !ready)
|
||||||
|
|
|
@ -101,7 +101,7 @@ namespace cryptonote
|
||||||
boost::optional<epee::wipeable_string> new_wallet(const boost::program_options::variables_map& vm, const cryptonote::account_public_address& address,
|
boost::optional<epee::wipeable_string> new_wallet(const boost::program_options::variables_map& vm, const cryptonote::account_public_address& address,
|
||||||
const boost::optional<crypto::secret_key>& spendkey, const crypto::secret_key& viewkey);
|
const boost::optional<crypto::secret_key>& spendkey, const crypto::secret_key& viewkey);
|
||||||
boost::optional<epee::wipeable_string> new_wallet(const boost::program_options::variables_map& vm,
|
boost::optional<epee::wipeable_string> new_wallet(const boost::program_options::variables_map& vm,
|
||||||
const epee::wipeable_string &multisig_keys, const std::string &old_language);
|
const epee::wipeable_string &multisig_keys, const epee::wipeable_string &seed_pass, const std::string &old_language);
|
||||||
boost::optional<epee::wipeable_string> new_wallet(const boost::program_options::variables_map& vm);
|
boost::optional<epee::wipeable_string> new_wallet(const boost::program_options::variables_map& vm);
|
||||||
boost::optional<epee::wipeable_string> open_wallet(const boost::program_options::variables_map& vm);
|
boost::optional<epee::wipeable_string> open_wallet(const boost::program_options::variables_map& vm);
|
||||||
bool close_wallet();
|
bool close_wallet();
|
||||||
|
|
Loading…
Reference in New Issue