Merge pull request #2188

a5031a7d core: forbid duplicate ring members from v6 (moneromooo-monero)
This commit is contained in:
Riccardo Spagni 2017-08-07 15:07:15 +02:00
commit cf308cfb20
No known key found for this signature in database
GPG Key ID: 55432DF31CCD4FCD
2 changed files with 31 additions and 0 deletions

View File

@ -660,6 +660,12 @@ namespace cryptonote
return false; return false;
} }
if (!check_tx_inputs_ring_members_diff(tx))
{
MERROR_VER("tx uses duplicate ring members");
return false;
}
if (!check_tx_inputs_keyimages_domain(tx)) if (!check_tx_inputs_keyimages_domain(tx))
{ {
MERROR_VER("tx uses key image not in the valid domain"); MERROR_VER("tx uses key image not in the valid domain");
@ -752,6 +758,22 @@ namespace cryptonote
return true; return true;
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::check_tx_inputs_ring_members_diff(const transaction& tx) const
{
const uint8_t version = m_blockchain_storage.get_current_hard_fork_version();
if (version >= 6)
{
for(const auto& in: tx.vin)
{
CHECKED_GET_SPECIFIC_VARIANT(in, const txin_to_key, tokey_in, false);
for (size_t n = 1; n < tokey_in.key_offsets.size(); ++n)
if (tokey_in.key_offsets[n] == 0)
return false;
}
}
return true;
}
//-----------------------------------------------------------------------------------------------
bool core::check_tx_inputs_keyimages_domain(const transaction& tx) const bool core::check_tx_inputs_keyimages_domain(const transaction& tx) const
{ {
std::unordered_set<crypto::key_image> ki; std::unordered_set<crypto::key_image> ki;

View File

@ -780,6 +780,15 @@ namespace cryptonote
*/ */
bool check_tx_inputs_keyimages_diff(const transaction& tx) const; bool check_tx_inputs_keyimages_diff(const transaction& tx) const;
/**
* @brief verify that each ring uses distinct members
*
* @param tx the transaction to check
*
* @return false if any ring uses duplicate members, true otherwise
*/
bool check_tx_inputs_ring_members_diff(const transaction& tx) const;
/** /**
* @brief verify that each input key image in a transaction is in * @brief verify that each input key image in a transaction is in
* the valid domain * the valid domain