From b285ec550d05a3a13fb3771246d29feabda3a871 Mon Sep 17 00:00:00 2001 From: Some Random Crypto Guy Date: Thu, 31 Oct 2024 18:37:41 +0000 Subject: [PATCH] fixed edge case where returning pre-HF2 transfer using HF2 CLI wallet _before_ HF2; bumped version --- README.md | 10 ++++----- src/version.cpp.in | 2 +- src/wallet/wallet2.cpp | 47 +++++++++++++++++++++++++----------------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 13d9fa9..1e2b9ce 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Salvium Zero v0.6.2 +# Salvium Zero v0.6.3 Copyright (c) 2023-2024, Salvium Portions Copyright (c) 2014-2023, The Monero Project @@ -172,7 +172,7 @@ invokes cmake commands as needed. ```bash cd salvium - git checkout v0.6.2 + git checkout v0.6.3 make ``` @@ -251,7 +251,7 @@ Tested on a Raspberry Pi Zero with a clean install of minimal Raspbian Stretch ( ```bash git clone https://github.com/salvium/salvium cd salvium - git checkout v0.6.2 + git checkout v0.6.3 ``` * Build: @@ -370,10 +370,10 @@ application. cd salvium ``` -* If you would like a specific [version/tag](https://github.com/salvium/salvium/tags), do a git checkout for that version. eg. 'v0.6.2'. If you don't care about the version and just want binaries from master, skip this step: +* If you would like a specific [version/tag](https://github.com/salvium/salvium/tags), do a git checkout for that version. eg. 'v0.6.3'. If you don't care about the version and just want binaries from master, skip this step: ```bash - git checkout v0.6.2 + git checkout v0.6.3 ``` * If you are on a 64-bit system, run: diff --git a/src/version.cpp.in b/src/version.cpp.in index 344a3eb..ae661bb 100644 --- a/src/version.cpp.in +++ b/src/version.cpp.in @@ -1,5 +1,5 @@ #define DEF_SALVIUM_VERSION_TAG "@VERSIONTAG@" -#define DEF_SALVIUM_VERSION "0.6.2" +#define DEF_SALVIUM_VERSION "0.6.3" #define DEF_MONERO_VERSION_TAG "release" #define DEF_MONERO_VERSION "0.18.3.3" #define DEF_MONERO_RELEASE_NAME "Zero" diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 9b1e184..950c511 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -11363,8 +11363,8 @@ std::vector wallet2::create_transactions_return(std::vector crypto::public_key P_change = crypto::null_pkey; uint8_t change_index; uint32_t hf_version = get_current_hard_fork(); - if (hf_version >= HF_VERSION_ENABLE_N_OUTS && td_origin.m_tx.version >= TRANSACTION_VERSION_N_OUTS) { - + if (td_origin.m_tx.version >= TRANSACTION_VERSION_N_OUTS) { + // Calculate z_i (the shared secret between sender and ourselves for the original TX) crypto::public_key txkey_pub = null_pkey; // R const std::vector in_additional_tx_pub_keys = get_additional_tx_pub_keys_from_extra(td_origin.m_tx); @@ -11392,21 +11392,43 @@ std::vector wallet2::create_transactions_return(std::vector std::strncpy(buf.domain_separator, "RETURN", 7); buf.amount_key = rct::sk2rct(z_i); crypto::hash_to_scalar(&buf, sizeof(buf), y); - + // The change_index needs decoding too uint8_t eci_data = td_origin.m_tx.return_address_change_mask[td_origin.m_internal_output_index]; - + // Calculate the encrypted_change_index data for this output std::memset(buf.domain_separator, 0x0, sizeof(buf.domain_separator)); std::strncpy(buf.domain_separator, "CHG_IDX", 8); crypto::secret_key eci_out; keccak((uint8_t *)&buf, sizeof(buf), (uint8_t*)&eci_out, sizeof(eci_out)); change_index = eci_data ^ eci_out.data[0]; - + return_address = td_origin.m_tx.return_address_list[td_origin.m_internal_output_index]; - } else { + // Sanity check that we aren't attempting to return our own TX change output to ourselves + THROW_WALLET_EXCEPTION_IF(change_index == td_origin.m_internal_output_index, error::wallet_internal_error, tr("Attempting to return change to ourself")); + + // Sanity check that we can obtain the change output from the origin TX + THROW_WALLET_EXCEPTION_IF(!cryptonote::get_output_public_key(td_origin.m_tx.vout[change_index], P_change), + error::wallet_internal_error, + tr("Failed to identify change output")); + } else { + + // Change index is the one we didn't receive + change_index = (td_origin.m_internal_output_index == 0) ? 1 : 0; + + // Return address was provided + return_address = td_origin.m_tx.return_address; + + // Sanity check that we aren't attempting to return our own TX change output to ourselves + THROW_WALLET_EXCEPTION_IF(change_index == td_origin.m_internal_output_index, error::wallet_internal_error, tr("Attempting to return change to ourself")); + + // Sanity check that we can obtain the change output from the origin TX + THROW_WALLET_EXCEPTION_IF(!cryptonote::get_output_public_key(td_origin.m_tx.vout[change_index], P_change), + error::wallet_internal_error, + tr("Failed to identify change output")); + // Calculate y struct { char domain_separator[8]; @@ -11416,21 +11438,8 @@ std::vector wallet2::create_transactions_return(std::vector std::strncpy(buf.domain_separator, "RETURN", 6); buf.pubkey = P_change; crypto::hash_to_scalar(&buf, sizeof(buf), y); - - // Change index is the one we didn't receive - change_index = (td_origin.m_internal_output_index == 0) ? 1 : 0; - - return_address = td_origin.m_tx.return_address; } - // Sanity check that we aren't attempting to return our own TX change output to ourselves - THROW_WALLET_EXCEPTION_IF(change_index == td_origin.m_internal_output_index, error::wallet_internal_error, tr("Attempting to return change to ourself")); - - // Sanity check that we can obtain the change output from the origin TX - THROW_WALLET_EXCEPTION_IF(!cryptonote::get_output_public_key(td_origin.m_tx.vout[change_index], P_change), - error::wallet_internal_error, - tr("Failed to identify change output")); - // Calculate yF rct::key key_y = (rct::key&)(y); rct::key key_F = (rct::key&)(return_address);