diff options
| author | selsta <selsta@sent.at> | 2026-04-28 01:25:31 +0200 |
|---|---|---|
| committer | selsta <selsta@sent.at> | 2026-04-29 15:25:42 +0200 |
| commit | 2827d7fe84ad4102dd9f3284eb98da8f0d66266d (patch) | |
| tree | 7414d82b62c78a13c96aac7b02f9e4df8c567f08 /src/wallet/wallet2.cpp | |
| parent | 31fbbc11bdc5b78223a98b12a523ff0b10ecc5d5 (diff) | |
| download | monzero-core-2827d7fe84ad4102dd9f3284eb98da8f0d66266d.tar.gz monzero-core-2827d7fe84ad4102dd9f3284eb98da8f0d66266d.tar.xz monzero-core-2827d7fe84ad4102dd9f3284eb98da8f0d66266d.zip | |
wallet2: reject duplicate outputs in reserve proofs
Diffstat (limited to 'src/wallet/wallet2.cpp')
| -rw-r--r-- | src/wallet/wallet2.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index e8170131c..723635481 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -13400,6 +13400,15 @@ bool wallet2::check_reserve_proof(const cryptonote::account_public_address &addr catch(...) {} THROW_WALLET_EXCEPTION_IF(!loaded, error::wallet_internal_error, "Failed to parse reserve proof signature data"); + + std::unordered_set<crypto::key_image> seen_key_images; + std::set<std::pair<crypto::hash, uint64_t>> seen_outputs; + for (const reserve_proof_entry &proof : proofs) + { + THROW_WALLET_EXCEPTION_IF(!seen_key_images.insert(proof.key_image).second, error::wallet_internal_error, "Duplicate key image in reserve proof"); + THROW_WALLET_EXCEPTION_IF(!seen_outputs.emplace(proof.txid, proof.index_in_tx).second, error::wallet_internal_error, "Duplicate output in reserve proof"); + } + THROW_WALLET_EXCEPTION_IF(subaddr_spendkeys.count(address.m_spend_public_key) == 0, error::wallet_internal_error, "The given address isn't found in the proof"); |
