build: fix build with Boost 1.85 and remove instances of viewkey logging

1. Use `std::is_standard_layout` and `std::is_trivially_copyable` instead of `std::is_pod` for KV byte-wise serialization, which fixes compile issue for Boost UUIDs
2. Use `std::has_unique_object_representations` instead of `alignof(T) == 1` for epee byte spans and epee hex functions
3. Removed reimplementation of `std::hash` for `boost::uuids::uuid
4. Removed `<<` operator overload for `crypto::secret_key`
5. Removed instances in code where private view key was dumped to the log in plaintext
This commit is contained in:
jeffro256 2024-08-23 12:15:17 -05:00
parent a1dc85c537
commit ed955bf751
No known key found for this signature in database
GPG Key ID: 6F79797A6E392442
20 changed files with 65 additions and 60 deletions

View File

@ -1091,6 +1091,7 @@ endif()
find_package(Boost 1.58 QUIET REQUIRED COMPONENTS ${BOOST_COMPONENTS}) find_package(Boost 1.58 QUIET REQUIRED COMPONENTS ${BOOST_COMPONENTS})
add_definitions(-DBOOST_ASIO_ENABLE_SEQUENTIAL_STRAND_ALLOCATION) add_definitions(-DBOOST_ASIO_ENABLE_SEQUENTIAL_STRAND_ALLOCATION)
add_definitions(-DBOOST_NO_AUTO_PTR) add_definitions(-DBOOST_NO_AUTO_PTR)
add_definitions(-DBOOST_UUID_DISABLE_ALIGNMENT) # This restores UUID's std::has_unique_object_representations property
set(CMAKE_FIND_LIBRARY_SUFFIXES ${OLD_LIB_SUFFIXES}) set(CMAKE_FIND_LIBRARY_SUFFIXES ${OLD_LIB_SUFFIXES})
if(NOT Boost_FOUND) if(NOT Boost_FOUND)

View File

@ -98,16 +98,18 @@ public: \
#define KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, val_name) \ #define KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, val_name) \
epee::serialization::selector<is_store>::serialize_t_val_as_blob(this_ref.varialble, stg, hparent_section, val_name); epee::serialization::selector<is_store>::serialize_t_val_as_blob(this_ref.varialble, stg, hparent_section, val_name);
#define KV_SERIALIZE_VAL_POD_AS_BLOB_N(varialble, val_name) \ #define KV_SERIALIZE_VAL_POD_AS_BLOB_N(variable, val_name) \
static_assert(std::is_pod<decltype(this_ref.varialble)>::value, "t_type must be a POD type."); \ static_assert(std::is_trivially_copyable_v<decltype(this_ref.variable)>, "t_type must be a trivially copyable type."); \
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, val_name) static_assert(std::is_standard_layout_v<decltype(this_ref.variable)>, "t_type must be a standard layout type."); \
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(variable, val_name)
#define KV_SERIALIZE_VAL_POD_AS_BLOB_OPT_N(varialble, val_name, default_value) \ #define KV_SERIALIZE_VAL_POD_AS_BLOB_OPT_N(variable, val_name, default_value) \
do { \ do { \
static_assert(std::is_pod<decltype(this_ref.varialble)>::value, "t_type must be a POD type."); \ static_assert(std::is_trivially_copyable_v<decltype(this_ref.variable)>, "t_type must be a trivially copyable type."); \
bool ret = KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, val_name) \ static_assert(std::is_standard_layout_v<decltype(this_ref.variable)>, "t_type must be a standard layout type."); \
bool ret = KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(variable, val_name) \
if (!ret) \ if (!ret) \
epee::serialize_default(this_ref.varialble, default_value); \ epee::serialize_default(this_ref.variable, default_value); \
} while(0); } while(0);
#define KV_SERIALIZE_CONTAINER_POD_AS_BLOB_N(varialble, val_name) \ #define KV_SERIALIZE_CONTAINER_POD_AS_BLOB_N(varialble, val_name) \
@ -118,7 +120,7 @@ public: \
#define KV_SERIALIZE(varialble) KV_SERIALIZE_N(varialble, #varialble) #define KV_SERIALIZE(varialble) KV_SERIALIZE_N(varialble, #varialble)
#define KV_SERIALIZE_VAL_POD_AS_BLOB(varialble) KV_SERIALIZE_VAL_POD_AS_BLOB_N(varialble, #varialble) #define KV_SERIALIZE_VAL_POD_AS_BLOB(varialble) KV_SERIALIZE_VAL_POD_AS_BLOB_N(varialble, #varialble)
#define KV_SERIALIZE_VAL_POD_AS_BLOB_OPT(varialble, def) KV_SERIALIZE_VAL_POD_AS_BLOB_OPT_N(varialble, #varialble, def) #define KV_SERIALIZE_VAL_POD_AS_BLOB_OPT(varialble, def) KV_SERIALIZE_VAL_POD_AS_BLOB_OPT_N(varialble, #varialble, def)
#define KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE(varialble) KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, #varialble) //skip is_pod compile time check #define KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE(varialble) KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N(varialble, #varialble) //skip is_trivially_copyable and is_standard_layout compile time check
#define KV_SERIALIZE_CONTAINER_POD_AS_BLOB(varialble) KV_SERIALIZE_CONTAINER_POD_AS_BLOB_N(varialble, #varialble) #define KV_SERIALIZE_CONTAINER_POD_AS_BLOB(varialble) KV_SERIALIZE_CONTAINER_POD_AS_BLOB_N(varialble, #varialble)
#define KV_SERIALIZE_OPT(variable,default_value) KV_SERIALIZE_OPT_N(variable, #variable, default_value) #define KV_SERIALIZE_OPT(variable,default_value) KV_SERIALIZE_OPT_N(variable, #variable, default_value)

View File

@ -133,17 +133,13 @@ namespace epee
return {src.data(), src.size()}; return {src.data(), src.size()};
} }
template<typename T>
constexpr bool has_padding() noexcept
{
return !std::is_standard_layout<T>() || alignof(T) != 1;
}
//! \return Cast data from `src` as `span<const std::uint8_t>`. //! \return Cast data from `src` as `span<const std::uint8_t>`.
template<typename T> template<typename T>
span<const std::uint8_t> to_byte_span(const span<const T> src) noexcept span<const std::uint8_t> to_byte_span(const span<const T> src) noexcept
{ {
static_assert(!has_padding<T>(), "source type may have padding"); static_assert(!std::is_empty<T>(), "empty value types will not work -> sizeof == 1");
static_assert(std::is_standard_layout_v<T>, "type must have standard layout");
static_assert(std::has_unique_object_representations_v<T>, "type must be trivially copyable with no padding");
return {reinterpret_cast<const std::uint8_t*>(src.data()), src.size_bytes()}; return {reinterpret_cast<const std::uint8_t*>(src.data()), src.size_bytes()};
} }
@ -153,7 +149,8 @@ namespace epee
{ {
using value_type = typename T::value_type; using value_type = typename T::value_type;
static_assert(!std::is_empty<value_type>(), "empty value types will not work -> sizeof == 1"); static_assert(!std::is_empty<value_type>(), "empty value types will not work -> sizeof == 1");
static_assert(!has_padding<value_type>(), "source value type may have padding"); static_assert(std::is_standard_layout_v<value_type>, "value type must have standard layout");
static_assert(std::has_unique_object_representations_v<value_type>, "value type must be trivially copyable with no padding");
return {reinterpret_cast<std::uint8_t*>(src.data()), src.size() * sizeof(value_type)}; return {reinterpret_cast<std::uint8_t*>(src.data()), src.size() * sizeof(value_type)};
} }
@ -162,7 +159,8 @@ namespace epee
span<const std::uint8_t> as_byte_span(const T& src) noexcept span<const std::uint8_t> as_byte_span(const T& src) noexcept
{ {
static_assert(!std::is_empty<T>(), "empty types will not work -> sizeof == 1"); static_assert(!std::is_empty<T>(), "empty types will not work -> sizeof == 1");
static_assert(!has_padding<T>(), "source type may have padding"); static_assert(std::is_standard_layout_v<T>, "type must have standard layout");
static_assert(std::has_unique_object_representations_v<T>, "type must be trivially copyable with no padding");
return {reinterpret_cast<const std::uint8_t*>(std::addressof(src)), sizeof(T)}; return {reinterpret_cast<const std::uint8_t*>(std::addressof(src)), sizeof(T)};
} }
@ -171,7 +169,8 @@ namespace epee
span<std::uint8_t> as_mut_byte_span(T& src) noexcept span<std::uint8_t> as_mut_byte_span(T& src) noexcept
{ {
static_assert(!std::is_empty<T>(), "empty types will not work -> sizeof == 1"); static_assert(!std::is_empty<T>(), "empty types will not work -> sizeof == 1");
static_assert(!has_padding<T>(), "source type may have padding"); static_assert(std::is_standard_layout_v<T>, "type must have standard layout");
static_assert(std::has_unique_object_representations_v<T>, "type must be trivially copyable with no padding");
return {reinterpret_cast<std::uint8_t*>(std::addressof(src)), sizeof(T)}; return {reinterpret_cast<std::uint8_t*>(std::addressof(src)), sizeof(T)};
} }

View File

@ -89,6 +89,7 @@ namespace string_tools
std::string pod_to_hex(const t_pod_type& s) std::string pod_to_hex(const t_pod_type& s)
{ {
static_assert(std::is_standard_layout<t_pod_type>(), "expected standard layout type"); static_assert(std::is_standard_layout<t_pod_type>(), "expected standard layout type");
static_assert(std::has_unique_object_representations_v<t_pod_type>, "type may have padding");
return to_hex::string(as_byte_span(s)); return to_hex::string(as_byte_span(s));
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -96,6 +97,7 @@ namespace string_tools
bool hex_to_pod(const boost::string_ref hex_str, t_pod_type& s) bool hex_to_pod(const boost::string_ref hex_str, t_pod_type& s)
{ {
static_assert(std::is_standard_layout<t_pod_type>(), "expected standard layout type"); static_assert(std::is_standard_layout<t_pod_type>(), "expected standard layout type");
static_assert(std::has_unique_object_representations_v<t_pod_type>, "type may have padding");
return from_hex::to_buffer(as_mut_byte_span(s), hex_str); return from_hex::to_buffer(as_mut_byte_span(s), hex_str);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -171,7 +171,9 @@ namespace crypto {
/* Generate a value filled with random bytes. /* Generate a value filled with random bytes.
*/ */
template<typename T> template<typename T>
typename std::enable_if<std::is_pod<T>::value, T>::type rand() { T rand() {
static_assert(std::is_standard_layout_v<T>, "cannot write random bytes into non-standard layout type");
static_assert(std::is_trivially_copyable_v<T>, "cannot write random bytes into non-trivially copyable type");
typename std::remove_cv<T>::type res; typename std::remove_cv<T>::type res;
generate_random_bytes_thread_safe(sizeof(T), (uint8_t*)&res); generate_random_bytes_thread_safe(sizeof(T), (uint8_t*)&res);
return res; return res;
@ -314,8 +316,14 @@ namespace crypto {
inline std::ostream &operator <<(std::ostream &o, const crypto::public_key &v) { inline std::ostream &operator <<(std::ostream &o, const crypto::public_key &v) {
epee::to_hex::formatted(o, epee::as_byte_span(v)); return o; epee::to_hex::formatted(o, epee::as_byte_span(v)); return o;
} }
inline std::ostream &operator <<(std::ostream &o, const crypto::secret_key &v) { /* Do NOT overload the << operator for crypto::secret_key here. Use secret_key_explicit_print_ref
epee::to_hex::formatted(o, epee::as_byte_span(v)); return o; * instead to prevent accidental implicit dumping of secret key material to the logs (which has
* happened before). For the same reason, do not overload it for crypto::ec_scalar either since
* crypto::secret_key is a subclass. I'm not sorry that it's obtuse; that's the point, bozo.
*/
struct secret_key_explicit_print_ref { const crypto::secret_key &sk; };
inline std::ostream &operator <<(std::ostream &o, const secret_key_explicit_print_ref v) {
epee::to_hex::formatted(o, epee::as_byte_span(unwrap(unwrap(v.sk)))); return o;
} }
inline std::ostream &operator <<(std::ostream &o, const crypto::key_derivation &v) { inline std::ostream &operator <<(std::ostream &o, const crypto::key_derivation &v) {
epee::to_hex::formatted(o, epee::as_byte_span(v)); return o; epee::to_hex::formatted(o, epee::as_byte_span(v)); return o;

View File

@ -292,7 +292,7 @@ namespace cryptonote
bool r = hwdev.generate_key_derivation(tx_public_key, ack.m_view_secret_key, recv_derivation); bool r = hwdev.generate_key_derivation(tx_public_key, ack.m_view_secret_key, recv_derivation);
if (!r) if (!r)
{ {
MWARNING("key image helper: failed to generate_key_derivation(" << tx_public_key << ", " << ack.m_view_secret_key << ")"); MWARNING("key image helper: failed to generate_key_derivation(" << tx_public_key << ", <viewkey>)");
memcpy(&recv_derivation, rct::identity().bytes, sizeof(recv_derivation)); memcpy(&recv_derivation, rct::identity().bytes, sizeof(recv_derivation));
} }
@ -303,7 +303,7 @@ namespace cryptonote
r = hwdev.generate_key_derivation(additional_tx_public_keys[i], ack.m_view_secret_key, additional_recv_derivation); r = hwdev.generate_key_derivation(additional_tx_public_keys[i], ack.m_view_secret_key, additional_recv_derivation);
if (!r) if (!r)
{ {
MWARNING("key image helper: failed to generate_key_derivation(" << additional_tx_public_keys[i] << ", " << ack.m_view_secret_key << ")"); MWARNING("key image helper: failed to generate_key_derivation(" << additional_tx_public_keys[i] << ", <viewkey>)");
} }
else else
{ {

View File

@ -144,7 +144,7 @@ namespace cryptonote
crypto::key_derivation derivation = AUTO_VAL_INIT(derivation); crypto::key_derivation derivation = AUTO_VAL_INIT(derivation);
crypto::public_key out_eph_public_key = AUTO_VAL_INIT(out_eph_public_key); crypto::public_key out_eph_public_key = AUTO_VAL_INIT(out_eph_public_key);
bool r = crypto::generate_key_derivation(miner_address.m_view_public_key, txkey.sec, derivation); bool r = crypto::generate_key_derivation(miner_address.m_view_public_key, txkey.sec, derivation);
CHECK_AND_ASSERT_MES(r, false, "while creating outs: failed to generate_key_derivation(" << miner_address.m_view_public_key << ", " << txkey.sec << ")"); CHECK_AND_ASSERT_MES(r, false, "while creating outs: failed to generate_key_derivation(" << miner_address.m_view_public_key << ", " << crypto::secret_key_explicit_print_ref{txkey.sec} << ")");
r = crypto::derive_public_key(derivation, no, miner_address.m_spend_public_key, out_eph_public_key); r = crypto::derive_public_key(derivation, no, miner_address.m_spend_public_key, out_eph_public_key);
CHECK_AND_ASSERT_MES(r, false, "while creating outs: failed to derive_public_key(" << derivation << ", " << no << ", "<< miner_address.m_spend_public_key << ")"); CHECK_AND_ASSERT_MES(r, false, "while creating outs: failed to derive_public_key(" << derivation << ", " << no << ", "<< miner_address.m_spend_public_key << ")");
@ -484,7 +484,7 @@ namespace cryptonote
crypto::generate_ring_signature(tx_prefix_hash, boost::get<txin_to_key>(tx.vin[i]).k_image, keys_ptrs, in_contexts[i].in_ephemeral.sec, src_entr.real_output, sigs.data()); crypto::generate_ring_signature(tx_prefix_hash, boost::get<txin_to_key>(tx.vin[i]).k_image, keys_ptrs, in_contexts[i].in_ephemeral.sec, src_entr.real_output, sigs.data());
ss_ring_s << "signatures:" << ENDL; ss_ring_s << "signatures:" << ENDL;
std::for_each(sigs.begin(), sigs.end(), [&](const crypto::signature& s){ss_ring_s << s << ENDL;}); std::for_each(sigs.begin(), sigs.end(), [&](const crypto::signature& s){ss_ring_s << s << ENDL;});
ss_ring_s << "prefix_hash:" << tx_prefix_hash << ENDL << "in_ephemeral_key: " << in_contexts[i].in_ephemeral.sec << ENDL << "real_output: " << src_entr.real_output << ENDL; ss_ring_s << "prefix_hash:" << tx_prefix_hash << ENDL << "in_ephemeral_key: " << crypto::secret_key_explicit_print_ref{in_contexts[i].in_ephemeral.sec} << ENDL << "real_output: " << src_entr.real_output << ENDL;
i++; i++;
} }

View File

@ -40,15 +40,6 @@
#undef MONERO_DEFAULT_LOG_CATEGORY #undef MONERO_DEFAULT_LOG_CATEGORY
#define MONERO_DEFAULT_LOG_CATEGORY "cn.block_queue" #define MONERO_DEFAULT_LOG_CATEGORY "cn.block_queue"
namespace std {
static_assert(sizeof(size_t) <= sizeof(boost::uuids::uuid), "boost::uuids::uuid too small");
template<> struct hash<boost::uuids::uuid> {
std::size_t operator()(const boost::uuids::uuid &_v) const {
return reinterpret_cast<const std::size_t &>(_v);
}
};
}
namespace cryptonote namespace cryptonote
{ {
@ -472,7 +463,7 @@ bool block_queue::has_spans(const boost::uuids::uuid &connection_id) const
float block_queue::get_speed(const boost::uuids::uuid &connection_id) const float block_queue::get_speed(const boost::uuids::uuid &connection_id) const
{ {
boost::unique_lock<boost::recursive_mutex> lock(mutex); boost::unique_lock<boost::recursive_mutex> lock(mutex);
std::unordered_map<boost::uuids::uuid, float> speeds; std::unordered_map<boost::uuids::uuid, float, boost::hash<boost::uuids::uuid>> speeds;
for (const auto &span: blocks) for (const auto &span: blocks)
{ {
if (span.blocks.empty()) if (span.blocks.empty())
@ -480,7 +471,7 @@ float block_queue::get_speed(const boost::uuids::uuid &connection_id) const
// note that the average below does not average over the whole set, but over the // note that the average below does not average over the whole set, but over the
// previous pseudo average and the latest rate: this gives much more importance // previous pseudo average and the latest rate: this gives much more importance
// to the latest measurements, which is fine here // to the latest measurements, which is fine here
std::unordered_map<boost::uuids::uuid, float>::iterator i = speeds.find(span.connection_id); const auto i = speeds.find(span.connection_id);
if (i == speeds.end()) if (i == speeds.end())
speeds.insert(std::make_pair(span.connection_id, span.rate)); speeds.insert(std::make_pair(span.connection_id, span.rate));
else else

View File

@ -317,13 +317,15 @@ namespace hw {
{ {
// sending change to yourself; derivation = a*R // sending change to yourself; derivation = a*R
r = generate_key_derivation(txkey_pub, sender_account_keys.m_view_secret_key, derivation); r = generate_key_derivation(txkey_pub, sender_account_keys.m_view_secret_key, derivation);
CHECK_AND_ASSERT_MES(r, false, "at creation outs: failed to generate_key_derivation(" << txkey_pub << ", " << sender_account_keys.m_view_secret_key << ")"); CHECK_AND_ASSERT_MES(r, false, "at creation outs: failed to generate_key_derivation(" << txkey_pub << ", <viewkey>)");
} }
else else
{ {
// sending to the recipient; derivation = r*A (or s*C in the subaddress scheme) // sending to the recipient; derivation = r*A (or s*C in the subaddress scheme)
r = generate_key_derivation(dst_entr.addr.m_view_public_key, dst_entr.is_subaddress && need_additional_txkeys ? additional_txkey.sec : tx_key, derivation); const crypto::secret_key &tx_privkey{dst_entr.is_subaddress && need_additional_txkeys ? additional_txkey.sec : tx_key};
CHECK_AND_ASSERT_MES(r, false, "at creation outs: failed to generate_key_derivation(" << dst_entr.addr.m_view_public_key << ", " << (dst_entr.is_subaddress && need_additional_txkeys ? additional_txkey.sec : tx_key) << ")"); r = generate_key_derivation(dst_entr.addr.m_view_public_key, tx_privkey, derivation);
CHECK_AND_ASSERT_MES(r, false, "at creation outs: failed to generate_key_derivation("
<< dst_entr.addr.m_view_public_key << ", " << crypto::secret_key_explicit_print_ref{tx_privkey} << ")");
} }
if (need_additional_txkeys) if (need_additional_txkeys)

View File

@ -127,7 +127,7 @@ namespace lmdb
/*! /*!
A LMDB comparison function that uses `std::memcmp`. A LMDB comparison function that uses `std::memcmp`.
\toaram T is `!epee::has_padding` \toaram T has standard layout and an alignment of 1
\tparam offset to `T` within the value. \tparam offset to `T` within the value.
\return The result of `std::memcmp` over the value. \return The result of `std::memcmp` over the value.
@ -135,7 +135,7 @@ namespace lmdb
template<typename T, std::size_t offset = 0> template<typename T, std::size_t offset = 0>
inline int compare(MDB_val const* left, MDB_val const* right) noexcept inline int compare(MDB_val const* left, MDB_val const* right) noexcept
{ {
static_assert(!epee::has_padding<T>(), "memcmp will not work"); static_assert(std::is_standard_layout_v<T> && alignof(T) == 1, "memcmp will not work");
if (!left || !right || left->mv_size < sizeof(T) + offset || right->mv_size < sizeof(T) + offset) if (!left || !right || left->mv_size < sizeof(T) + offset || right->mv_size < sizeof(T) + offset)
{ {
assert("invalid use of custom comparison" == 0); assert("invalid use of custom comparison" == 0);

View File

@ -7872,9 +7872,9 @@ bool simple_wallet::submit_transfer(const std::vector<std::string> &args_)
std::string get_tx_key_stream(crypto::secret_key tx_key, std::vector<crypto::secret_key> additional_tx_keys) std::string get_tx_key_stream(crypto::secret_key tx_key, std::vector<crypto::secret_key> additional_tx_keys)
{ {
ostringstream oss; ostringstream oss;
oss << epee::string_tools::pod_to_hex(tx_key); oss << epee::string_tools::pod_to_hex(unwrap(unwrap(tx_key)));
for (size_t i = 0; i < additional_tx_keys.size(); ++i) for (size_t i = 0; i < additional_tx_keys.size(); ++i)
oss << epee::string_tools::pod_to_hex(additional_tx_keys[i]); oss << epee::string_tools::pod_to_hex(unwrap(unwrap(additional_tx_keys[i])));
return oss.str(); return oss.str();
} }

View File

@ -895,7 +895,7 @@ std::string WalletImpl::integratedAddress(const std::string &payment_id) const
std::string WalletImpl::secretViewKey() const std::string WalletImpl::secretViewKey() const
{ {
return epee::string_tools::pod_to_hex(m_wallet->get_account().get_keys().m_view_secret_key); return epee::string_tools::pod_to_hex(unwrap(unwrap(m_wallet->get_account().get_keys().m_view_secret_key)));
} }
std::string WalletImpl::publicViewKey() const std::string WalletImpl::publicViewKey() const
@ -905,7 +905,7 @@ std::string WalletImpl::publicViewKey() const
std::string WalletImpl::secretSpendKey() const std::string WalletImpl::secretSpendKey() const
{ {
return epee::string_tools::pod_to_hex(m_wallet->get_account().get_keys().m_spend_secret_key); return epee::string_tools::pod_to_hex(unwrap(unwrap(m_wallet->get_account().get_keys().m_spend_secret_key)));
} }
std::string WalletImpl::publicSpendKey() const std::string WalletImpl::publicSpendKey() const
@ -1999,9 +1999,9 @@ std::string WalletImpl::getTxKey(const std::string &txid_str) const
{ {
clearStatus(); clearStatus();
std::ostringstream oss; std::ostringstream oss;
oss << epee::string_tools::pod_to_hex(tx_key); oss << epee::string_tools::pod_to_hex(unwrap(unwrap(tx_key)));
for (size_t i = 0; i < additional_tx_keys.size(); ++i) for (size_t i = 0; i < additional_tx_keys.size(); ++i)
oss << epee::string_tools::pod_to_hex(additional_tx_keys[i]); oss << epee::string_tools::pod_to_hex(unwrap(unwrap(additional_tx_keys[i])));
return oss.str(); return oss.str();
} }
else else

View File

@ -4721,7 +4721,7 @@ boost::optional<wallet2::keys_file_data> wallet2::get_keys_file_data(const crypt
original_address = get_account_address_as_str(m_nettype, false, m_original_address); original_address = get_account_address_as_str(m_nettype, false, m_original_address);
value.SetString(original_address.c_str(), original_address.length()); value.SetString(original_address.c_str(), original_address.length());
json.AddMember("original_address", value, json.GetAllocator()); json.AddMember("original_address", value, json.GetAllocator());
original_view_secret_key = epee::string_tools::pod_to_hex(m_original_view_secret_key); original_view_secret_key = epee::string_tools::pod_to_hex(unwrap(unwrap(m_original_view_secret_key)));
value.SetString(original_view_secret_key.c_str(), original_view_secret_key.length()); value.SetString(original_view_secret_key.c_str(), original_view_secret_key.length());
json.AddMember("original_view_secret_key", value, json.GetAllocator()); json.AddMember("original_view_secret_key", value, json.GetAllocator());
} }

View File

@ -1311,9 +1311,9 @@ namespace tools
res.tx_hash_list.push_back(epee::string_tools::pod_to_hex(cryptonote::get_transaction_hash(ptx.tx))); res.tx_hash_list.push_back(epee::string_tools::pod_to_hex(cryptonote::get_transaction_hash(ptx.tx)));
if (req.get_tx_keys) if (req.get_tx_keys)
{ {
res.tx_key_list.push_back(epee::string_tools::pod_to_hex(ptx.tx_key)); res.tx_key_list.push_back(epee::string_tools::pod_to_hex(unwrap(unwrap(ptx.tx_key))));
for (const crypto::secret_key& additional_tx_key : ptx.additional_tx_keys) for (const crypto::secret_key& additional_tx_key : ptx.additional_tx_keys)
res.tx_key_list.back() += epee::string_tools::pod_to_hex(additional_tx_key); res.tx_key_list.back() += epee::string_tools::pod_to_hex(unwrap(unwrap(additional_tx_key)));
} }
} }

View File

@ -109,7 +109,7 @@ namespace
template<typename T> template<typename T>
bool compare(const T& lhs, const T& rhs) noexcept bool compare(const T& lhs, const T& rhs) noexcept
{ {
static_assert(!epee::has_padding<T>(), "type might have padding"); static_assert(std::is_standard_layout_v<T> && alignof(T) == 1, "type might have padding");
return std::memcmp(std::addressof(lhs), std::addressof(rhs), sizeof(T)) == 0; return std::memcmp(std::addressof(lhs), std::addressof(rhs), sizeof(T)) == 0;
} }

View File

@ -227,13 +227,13 @@ bool gen_multisig_tx_validation_base::generate_with(std::vector<test_event_entry
CHECK_AND_ASSERT_MES(r, false, "Failed to generate multisig export key image"); CHECK_AND_ASSERT_MES(r, false, "Failed to generate multisig export key image");
} }
MDEBUG("Party " << msidx << ":"); MDEBUG("Party " << msidx << ":");
MDEBUG("spend: sec " << miner_account[msidx].get_keys().m_spend_secret_key << ", pub " << miner_account[msidx].get_keys().m_account_address.m_spend_public_key); MDEBUG("spend: sec " << crypto::secret_key_explicit_print_ref{miner_account[msidx].get_keys().m_spend_secret_key} << ", pub " << miner_account[msidx].get_keys().m_account_address.m_spend_public_key);
MDEBUG("view: sec " << miner_account[msidx].get_keys().m_view_secret_key << ", pub " << miner_account[msidx].get_keys().m_account_address.m_view_public_key); MDEBUG("view: sec " << crypto::secret_key_explicit_print_ref{miner_account[msidx].get_keys().m_view_secret_key} << ", pub " << miner_account[msidx].get_keys().m_account_address.m_view_public_key);
for (const auto &k: miner_account[msidx].get_multisig_keys()) for (const auto &k: miner_account[msidx].get_multisig_keys())
MDEBUG("msk: " << k); MDEBUG("msk: " << crypto::secret_key_explicit_print_ref{k});
for (size_t n = 0; n < account_k[msidx][tdidx].size(); ++n) for (size_t n = 0; n < account_k[msidx][tdidx].size(); ++n)
{ {
MDEBUG("k: " << account_k[msidx][tdidx][n]); MDEBUG("k: " << crypto::secret_key_explicit_print_ref{account_k[msidx][tdidx][n]});
MDEBUG("L: " << account_L[msidx][tdidx][n]); MDEBUG("L: " << account_L[msidx][tdidx][n]);
MDEBUG("R: " << account_R[msidx][tdidx][n]); MDEBUG("R: " << account_R[msidx][tdidx][n]);
} }
@ -406,7 +406,7 @@ bool gen_multisig_tx_validation_base::generate_with(std::vector<test_event_entry
MDEBUG("signing with k " << k.back()[n]); MDEBUG("signing with k " << k.back()[n]);
MDEBUG("signing with sk " << skey); MDEBUG("signing with sk " << skey);
for (const auto &sk: used_keys) for (const auto &sk: used_keys)
MDEBUG(" created with sk " << sk); MDEBUG(" created with sk " << crypto::secret_key_explicit_print_ref{sk});
CHECK_AND_ASSERT_MES(signer_tx_builder.next_partial_sign(sig.total_alpha_G, sig.total_alpha_H, k, skey, sig.c_0, sig.s), false, "error: multisig::signing::tx_builder_ringct_t::next_partial_sign"); CHECK_AND_ASSERT_MES(signer_tx_builder.next_partial_sign(sig.total_alpha_G, sig.total_alpha_H, k, skey, sig.c_0, sig.s), false, "error: multisig::signing::tx_builder_ringct_t::next_partial_sign");
// in round-robin signing, the last signer finalizes the tx // in round-robin signing, the last signer finalizes the tx

View File

@ -48,7 +48,7 @@ int main(int argc, const char **argv)
crypto::public_key pkey; crypto::public_key pkey;
crypto::random32_unbiased((unsigned char*)skey.data); crypto::random32_unbiased((unsigned char*)skey.data);
crypto::secret_key_to_public_key(skey, pkey); crypto::secret_key_to_public_key(skey, pkey);
printf("%s %s\n", epee::string_tools::pod_to_hex(skey).c_str(), epee::string_tools::pod_to_hex(pkey).c_str()); printf("%s %s\n", epee::to_hex::string({to_bytes(skey), 32}).c_str(), epee::string_tools::pod_to_hex(pkey).c_str());
return 0; return 0;
} }

View File

@ -79,10 +79,10 @@ TEST(Crypto, Ostream)
EXPECT_TRUE(is_formatted<crypto::hash8>()); EXPECT_TRUE(is_formatted<crypto::hash8>());
EXPECT_TRUE(is_formatted<crypto::hash>()); EXPECT_TRUE(is_formatted<crypto::hash>());
EXPECT_TRUE(is_formatted<crypto::public_key>()); EXPECT_TRUE(is_formatted<crypto::public_key>());
EXPECT_TRUE(is_formatted<crypto::secret_key>());
EXPECT_TRUE(is_formatted<crypto::signature>()); EXPECT_TRUE(is_formatted<crypto::signature>());
EXPECT_TRUE(is_formatted<crypto::key_derivation>()); EXPECT_TRUE(is_formatted<crypto::key_derivation>());
EXPECT_TRUE(is_formatted<crypto::key_image>()); EXPECT_TRUE(is_formatted<crypto::key_image>());
EXPECT_TRUE(is_formatted<rct::key>());
} }
TEST(Crypto, null_keys) TEST(Crypto, null_keys)

View File

@ -80,7 +80,7 @@ static void make_wallet(unsigned int idx, tools::wallet2 &wallet)
wallet.generate("", "", spendkey, true, false); wallet.generate("", "", spendkey, true, false);
ASSERT_TRUE(test_addresses[idx].address == wallet.get_account().get_public_address_str(cryptonote::TESTNET)); ASSERT_TRUE(test_addresses[idx].address == wallet.get_account().get_public_address_str(cryptonote::TESTNET));
wallet.decrypt_keys(""); wallet.decrypt_keys("");
ASSERT_TRUE(test_addresses[idx].spendkey == epee::string_tools::pod_to_hex(wallet.get_account().get_keys().m_spend_secret_key)); ASSERT_TRUE(test_addresses[idx].spendkey == epee::string_tools::pod_to_hex(unwrap(unwrap(wallet.get_account().get_keys().m_spend_secret_key))));
wallet.encrypt_keys(""); wallet.encrypt_keys("");
} }
catch (const std::exception &e) catch (const std::exception &e)

View File

@ -1113,7 +1113,7 @@ TEST(Serialization, portability_signed_tx)
ASSERT_TRUE(ptx.selected_transfers.front() == 2); ASSERT_TRUE(ptx.selected_transfers.front() == 2);
// ptx.{key_images, tx_key} // ptx.{key_images, tx_key}
ASSERT_TRUE(ptx.key_images == "<6c3cd6af97c4070a7aef9b1344e7463e29c7cd245076fdb65da447a34da3ca76> "); ASSERT_TRUE(ptx.key_images == "<6c3cd6af97c4070a7aef9b1344e7463e29c7cd245076fdb65da447a34da3ca76> ");
ASSERT_TRUE(epee::string_tools::pod_to_hex(ptx.tx_key) == "0100000000000000000000000000000000000000000000000000000000000000"); ASSERT_TRUE(epee::string_tools::pod_to_hex(unwrap(unwrap(ptx.tx_key))) == "0100000000000000000000000000000000000000000000000000000000000000");
// ptx.dests // ptx.dests
ASSERT_TRUE(ptx.dests.size() == 1); ASSERT_TRUE(ptx.dests.size() == 1);
ASSERT_TRUE(ptx.dests[0].amount == 1400000000000); ASSERT_TRUE(ptx.dests[0].amount == 1400000000000);