serialization: avoid blob memcpy of secret_key vector

This commit is contained in:
selsta
2026-05-09 23:42:51 +02:00
parent cabeafa01a
commit 6460917cab
2 changed files with 26 additions and 1 deletions
@@ -32,6 +32,7 @@
#include <list>
#include <vector>
#include <deque>
#include <type_traits>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/contains_fwd.hpp>
@@ -114,6 +115,9 @@ namespace epee
template<class stl_container, class t_storage>
static bool serialize_stl_container_pod_val_as_blob(const stl_container& container, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname)
{
static_assert(std::is_trivially_copyable_v<typename stl_container::value_type>,
"serialize_stl_container_pod_val_as_blob requires trivially copyable value_type");
if(!container.size()) return true;
std::string mb;
mb.resize(sizeof(typename stl_container::value_type)*container.size());
@@ -129,6 +133,9 @@ namespace epee
template<class stl_container, class t_storage>
static bool unserialize_stl_container_pod_val_as_blob(stl_container& container, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname)
{
static_assert(std::is_trivially_copyable_v<typename stl_container::value_type>,
"unserialize_stl_container_pod_val_as_blob requires trivially copyable value_type");
container.clear();
std::string buff;
bool res = stg.get_value(pname, buff, hparent_section);
+19 -1
View File
@@ -50,7 +50,25 @@ namespace cryptonote
KV_SERIALIZE(m_account_address)
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE(m_spend_secret_key)
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE(m_view_secret_key)
KV_SERIALIZE_CONTAINER_POD_AS_BLOB(m_multisig_keys)
if constexpr (is_store)
{
std::vector<crypto::ec_scalar> multisig_keys;
multisig_keys.reserve(this_ref.m_multisig_keys.size());
for (const crypto::secret_key& key : this_ref.m_multisig_keys)
multisig_keys.push_back(unwrap(unwrap(key)));
epee::serialization::selector<is_store>::serialize_stl_container_pod_val_as_blob(
multisig_keys, stg, hparent_section, "m_multisig_keys");
}
else
{
std::vector<crypto::ec_scalar> multisig_keys;
epee::serialization::selector<is_store>::serialize_stl_container_pod_val_as_blob(
multisig_keys, stg, hparent_section, "m_multisig_keys");
this_ref.m_multisig_keys.clear();
this_ref.m_multisig_keys.reserve(multisig_keys.size());
for (const crypto::ec_scalar& key : multisig_keys)
this_ref.m_multisig_keys.emplace_back(tools::scrubbed<crypto::ec_scalar>{key});
}
const crypto::chacha_iv default_iv{{0, 0, 0, 0, 0, 0, 0, 0}};
KV_SERIALIZE_VAL_POD_AS_BLOB_OPT(m_encryption_iv, default_iv)
END_KV_SERIALIZE_MAP()