multisig: erase all copies of a nonce at the same time

(cherry picked from commit fe744ac3171fe26b7284d3ac3a275e624e852ec5)
This commit is contained in:
koe
2026-10-04 18:50:24 -04:00
committed by such-gitea
parent 65fa6f0648
commit 7951912289
+8 -1
View File
@@ -15373,8 +15373,9 @@ void wallet2::get_multisig_k(size_t idx, const std::unordered_set<rct::key> &use
{ {
CHECK_AND_ASSERT_THROW_MES(m_multisig, "Wallet is not multisig"); CHECK_AND_ASSERT_THROW_MES(m_multisig, "Wallet is not multisig");
CHECK_AND_ASSERT_THROW_MES(idx < m_transfers.size(), "idx out of range"); CHECK_AND_ASSERT_THROW_MES(idx < m_transfers.size(), "idx out of range");
for (auto &k: m_transfers[idx].m_multisig_k) for (size_t i = 0; i < m_transfers[idx].m_multisig_k.size(); ++i)
{ {
auto &k = m_transfers[idx].m_multisig_k[i];
if (k == rct::zero()) if (k == rct::zero())
continue; continue;
@@ -15385,6 +15386,12 @@ void wallet2::get_multisig_k(size_t idx, const std::unordered_set<rct::key> &use
{ {
nonce = k; nonce = k;
memwipe(static_cast<rct::key *>(&k), sizeof(rct::key)); //CRITICAL: a nonce may only be used once! memwipe(static_cast<rct::key *>(&k), sizeof(rct::key)); //CRITICAL: a nonce may only be used once!
if (idx < m_multisig_rescan_k.size() && i < m_multisig_rescan_k[idx].size())
{
memwipe(static_cast<rct::key *>(&m_multisig_rescan_k[idx][i]), sizeof(rct::key));
}
return; return;
} }
} }