Util: added secure_zero_memory with type safety checks

This commit is contained in:
SChernykh
2025-10-07 12:53:20 +02:00
parent dd9d5b03aa
commit 2ce8ce65e2
4 changed files with 40 additions and 2 deletions

View File

@@ -32,6 +32,8 @@ option(DEV_DEBUG "[Developer only] Compile a debug build" OFF)
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT p2pool)
set(BUILD_TESTING OFF CACHE BOOL "CMake's CTest module")
if (CMAKE_CXX_COMPILER_ID MATCHES MSVC)
include(cmake/msvc_libs.cmake)
endif()

View File

@@ -806,6 +806,7 @@ void p2pool::send_aux_job_donation()
}
Params::AuthorKey key;
ON_SCOPE_LEAVE([&key](){ secure_zero_memory(key); });
if (f.tellg() != static_cast<std::streampos>(sizeof(key))) {
LOGERR(1, "send_aux_job_donation: " << m_params->m_authorKeyFile << " has an invalid size");
@@ -869,8 +870,6 @@ void p2pool::send_aux_job_donation()
return;
}
OPENSSL_cleanse(&key, sizeof(key));
job.insert(job.end(), signature, signature + sizeof(signature));
m_p2pServer->broadcast_aux_job_donation_async(job.data(), static_cast<uint32_t>(job.size()), timestamp);

View File

@@ -124,6 +124,32 @@ void fixup_path(std::string& path)
}
}
// Tell the compiler to not optimize secure_zero_memory and hope that it listens
#ifdef _MSC_VER
#pragma optimize("", off)
#endif
void
#if defined(__clang__)
__attribute__((optnone))
#elif defined(__GNUC__)
__attribute__((optimize("O0")))
#endif
secure_zero_memory(volatile void* data, size_t size)
{
volatile uint8_t* p = reinterpret_cast<volatile uint8_t*>(data);
volatile uint8_t* e = reinterpret_cast<volatile uint8_t*>(data) + size;
while (p < e) {
*(p++) = 0;
}
}
#ifdef _MSC_VER
#pragma optimize("", on)
#endif
const uint8_t ED25519_MASTER_PUBLIC_KEY[32] = {51,175,37,73,203,241,188,115,195,255,123,53,218,120,90,74,186,240,82,178,67,139,124,91,180,106,188,181,187,51,236,10};
std::string DATA_DIR;

View File

@@ -386,6 +386,17 @@ std::string p2pool_version();
void fixup_path(std::string& path);
void secure_zero_memory(volatile void* data, size_t size);
template<typename T>
FORCEINLINE void secure_zero_memory(T& value)
{
static_assert(!std::is_pointer_v<T>, "Trying to zero a pointer instead of data it points to");
static_assert(std::is_trivially_copyable_v<T>, "Trying to zero a complex data type");
secure_zero_memory(&value, sizeof(T));
}
} // namespace p2pool
void memory_tracking_start();