mirror of
https://github.com/monero-project/monero.git
synced 2024-11-17 08:17:37 +00:00
Merge pull request #8340
08080df
unit_tests: add more sha256sum test cases (Jeffrey Ryan)a66a52d
common: update sha256sum to use OpenSSL 3.0 API (Jeffrey Ryan)
This commit is contained in:
commit
9750e1fa10
7 changed files with 68 additions and 13 deletions
|
@ -85,7 +85,7 @@ using namespace epee;
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
#include <openssl/sha.h>
|
#include <openssl/evp.h>
|
||||||
|
|
||||||
#undef MONERO_DEFAULT_LOG_CATEGORY
|
#undef MONERO_DEFAULT_LOG_CATEGORY
|
||||||
#define MONERO_DEFAULT_LOG_CATEGORY "util"
|
#define MONERO_DEFAULT_LOG_CATEGORY "util"
|
||||||
|
@ -941,14 +941,7 @@ std::string get_nix_version_display_string()
|
||||||
|
|
||||||
bool sha256sum(const uint8_t *data, size_t len, crypto::hash &hash)
|
bool sha256sum(const uint8_t *data, size_t len, crypto::hash &hash)
|
||||||
{
|
{
|
||||||
SHA256_CTX ctx;
|
return EVP_Digest(data, len, (unsigned char*) hash.data, NULL, EVP_sha256(), NULL) != 0;
|
||||||
if (!SHA256_Init(&ctx))
|
|
||||||
return false;
|
|
||||||
if (!SHA256_Update(&ctx, data, len))
|
|
||||||
return false;
|
|
||||||
if (!SHA256_Final((unsigned char*)hash.data, &ctx))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sha256sum(const std::string &filename, crypto::hash &hash)
|
bool sha256sum(const std::string &filename, crypto::hash &hash)
|
||||||
|
@ -961,8 +954,8 @@ std::string get_nix_version_display_string()
|
||||||
if (!f)
|
if (!f)
|
||||||
return false;
|
return false;
|
||||||
std::ifstream::pos_type file_size = f.tellg();
|
std::ifstream::pos_type file_size = f.tellg();
|
||||||
SHA256_CTX ctx;
|
std::unique_ptr<EVP_MD_CTX, decltype(&EVP_MD_CTX_free)> ctx(EVP_MD_CTX_new(), &EVP_MD_CTX_free);
|
||||||
if (!SHA256_Init(&ctx))
|
if (!EVP_DigestInit_ex(ctx.get(), EVP_sha256(), nullptr))
|
||||||
return false;
|
return false;
|
||||||
size_t size_left = file_size;
|
size_t size_left = file_size;
|
||||||
f.seekg(0, std::ios::beg);
|
f.seekg(0, std::ios::beg);
|
||||||
|
@ -973,12 +966,12 @@ std::string get_nix_version_display_string()
|
||||||
f.read(buf, read_size);
|
f.read(buf, read_size);
|
||||||
if (!f || !f.good())
|
if (!f || !f.good())
|
||||||
return false;
|
return false;
|
||||||
if (!SHA256_Update(&ctx, buf, read_size))
|
if (!EVP_DigestUpdate(ctx.get(), buf, read_size))
|
||||||
return false;
|
return false;
|
||||||
size_left -= read_size;
|
size_left -= read_size;
|
||||||
}
|
}
|
||||||
f.close();
|
f.close();
|
||||||
if (!SHA256_Final((unsigned char*)hash.data, &ctx))
|
if (!EVP_DigestFinal_ex(ctx.get(), (unsigned char*)hash.data, nullptr))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -231,7 +231,27 @@ namespace tools
|
||||||
bool is_privacy_preserving_network(const std::string &address);
|
bool is_privacy_preserving_network(const std::string &address);
|
||||||
int vercmp(const char *v0, const char *v1); // returns < 0, 0, > 0, similar to strcmp, but more human friendly than lexical - does not attempt to validate
|
int vercmp(const char *v0, const char *v1); // returns < 0, 0, > 0, similar to strcmp, but more human friendly than lexical - does not attempt to validate
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Creates a SHA-256 digest of a data buffer
|
||||||
|
*
|
||||||
|
* \param[in] data pointer to the buffer
|
||||||
|
* \param[in] len size of the buffer in bytes
|
||||||
|
* \param[out] hash where message digest will be written to
|
||||||
|
*
|
||||||
|
* \returns true if successful, false otherwise
|
||||||
|
*/
|
||||||
bool sha256sum(const uint8_t *data, size_t len, crypto::hash &hash);
|
bool sha256sum(const uint8_t *data, size_t len, crypto::hash &hash);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Creates a SHA-256 digest of a file's contents, equivalent to the sha256sum command in Linux
|
||||||
|
*
|
||||||
|
* \param[in] filename path to target file
|
||||||
|
* \param[out] hash where message digest will be written to
|
||||||
|
*
|
||||||
|
* \returns true if successful, false if the file can not be opened or there is an OpenSSL failure
|
||||||
|
*
|
||||||
|
* \throws ios_base::failure if after the file is successfully opened, an error occurs during reading
|
||||||
|
*/
|
||||||
bool sha256sum(const std::string &filename, crypto::hash &hash);
|
bool sha256sum(const std::string &filename, crypto::hash &hash);
|
||||||
|
|
||||||
boost::optional<bool> is_hdd(const char *path);
|
boost::optional<bool> is_hdd(const char *path);
|
||||||
|
|
|
@ -78,6 +78,7 @@ file(COPY
|
||||||
data/outputs
|
data/outputs
|
||||||
data/unsigned_monero_tx
|
data/unsigned_monero_tx
|
||||||
data/signed_monero_tx
|
data/signed_monero_tx
|
||||||
|
data/sha256sum
|
||||||
DESTINATION data)
|
DESTINATION data)
|
||||||
|
|
||||||
if (CMAKE_BUILD_TYPE STREQUAL "fuzz" OR OSSFUZZ)
|
if (CMAKE_BUILD_TYPE STREQUAL "fuzz" OR OSSFUZZ)
|
||||||
|
|
BIN
tests/data/sha256sum/CLSAG.pdf
Normal file
BIN
tests/data/sha256sum/CLSAG.pdf
Normal file
Binary file not shown.
0
tests/data/sha256sum/empty.txt
Normal file
0
tests/data/sha256sum/empty.txt
Normal file
19
tests/data/sha256sum/small_file.txt
Normal file
19
tests/data/sha256sum/small_file.txt
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
From: https://localmonero.co/knowledge/monero-circular-economies
|
||||||
|
|
||||||
|
How does Monero uniquely enable these circular economies?
|
||||||
|
|
||||||
|
While Monero shares some of the core attributes of Bitcoin that enable circular economies in a new way (censorship-resistant payments, p2p transactions, etc.), it brings an absolutely unique empowerment to those wishing to build and engage in circular economies.
|
||||||
|
|
||||||
|
1. Monero enables global p2p transactions without fear of surveillance or censorship
|
||||||
|
Monero users do not need to worry about mass surveillance or even targeted censorship of their transactions, enabling unique peace of mind and preventing any burdens on commerce. You can transact with anyone in the world, at any time, without any surveillance using the Monero wallet of your choice.
|
||||||
|
|
||||||
|
2. Fungibility removes the risk of tainted coins and ensures trust
|
||||||
|
As Monero is fungible (1 XMR equals 1 XMR, no matter what), participants in the circular economy don’t need to worry about the funds they are sending or receiving. Any Monero they send cannot be traced back to their other transactions and has no history and thus cannot be censored based on history, and Monero received will always be able to be spent freely at full market value. This fungibility adds to the peace of mind of participants, ensures that chain analysis firms cannot force their way into circular economies, and prevents a breakdown of trust in Monero as a method of exchange.
|
||||||
|
The current breakdown of trust in Bitcoin as a method of exchange is leading to it rapidly losing traction in circular economies where Monero is present. People don’t want to have to check funds for taint, worry about if they will be able to spend them freely, or feel the need to use any chain analysis tools to protect themselves from legal or regulatory issues.
|
||||||
|
|
||||||
|
3. Monero’s low fees ensure a free flow of commerce
|
||||||
|
One of the simplest points to grasp about Monero transactions is that transaction fees are incredibly low and will remain reasonable in the long-term thanks to the tail emission and dynamic block size.
|
||||||
|
These low fees make sure that commerce can flow freely no matter the amount of blockchain congestion, further reducing the mental burden and stress on participants to try and time their transactions or wait hours/days to confirm low-fee transactions. With fees around 1c today, you can transact freely with any size of transaction without worry about fees down the line.
|
||||||
|
|
||||||
|
Conclusion
|
||||||
|
Ultimately, Monero is digital cash as it should be. The peace of mind, fungibility, and privacy of transacting in cash but with all of the advantages of digital, global, and p2p transactions detached from the states control or surveillance. This ability to act as digital cash is uniquely enabling circular economies today and helping them to grow and prosper over time in ways that other cryptocurrencies like Bitcoin simply can’t.
|
|
@ -26,10 +26,13 @@
|
||||||
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#include <boost/filesystem.hpp>
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
#include "common/util.h"
|
#include "common/util.h"
|
||||||
#include "string_tools.h"
|
#include "string_tools.h"
|
||||||
|
#include "unit_tests_utils.h"
|
||||||
|
|
||||||
static bool check(const std::string &data, const char *expected_hash_hex)
|
static bool check(const std::string &data, const char *expected_hash_hex)
|
||||||
{
|
{
|
||||||
|
@ -39,7 +42,26 @@ static bool check(const std::string &data, const char *expected_hash_hex)
|
||||||
return tools::sha256sum((const uint8_t*)data.data(), data.size(), hash) && hash == expected_hash;
|
return tools::sha256sum((const uint8_t*)data.data(), data.size(), hash) && hash == expected_hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string file_to_hex_hash(const std::string& filename)
|
||||||
|
{
|
||||||
|
const boost::filesystem::path full_path = unit_test::data_dir / "sha256sum" / filename;
|
||||||
|
|
||||||
|
crypto::hash hash;
|
||||||
|
if (!tools::sha256sum(full_path.string(), hash)) {
|
||||||
|
throw std::runtime_error("sha256sum failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string data_cstr(hash.data, sizeof(hash.data));
|
||||||
|
const std::string hex_hash = epee::string_tools::buff_to_hex_nodelimer(data_cstr);
|
||||||
|
|
||||||
|
return hex_hash;
|
||||||
|
}
|
||||||
|
|
||||||
TEST(sha256, empty) { ASSERT_TRUE(check(std::string(), "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")); }
|
TEST(sha256, empty) { ASSERT_TRUE(check(std::string(), "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")); }
|
||||||
TEST(sha256, small) { ASSERT_TRUE(check("0123456789", "84d89877f0d4041efb6bf91a16f0248f2fd573e6af05c19f96bedb9f882f7882")); }
|
TEST(sha256, small) { ASSERT_TRUE(check("0123456789", "84d89877f0d4041efb6bf91a16f0248f2fd573e6af05c19f96bedb9f882f7882")); }
|
||||||
TEST(sha256, large) { ASSERT_TRUE(check(std::string(65536*256, 0), "080acf35a507ac9849cfcba47dc2ad83e01b75663a516279c8b9d243b719643e")); }
|
TEST(sha256, large) { ASSERT_TRUE(check(std::string(65536*256, 0), "080acf35a507ac9849cfcba47dc2ad83e01b75663a516279c8b9d243b719643e")); }
|
||||||
|
|
||||||
|
TEST(sha256, emptyfile) { EXPECT_EQ(file_to_hex_hash("empty.txt"), "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); }
|
||||||
|
TEST(sha256, smallfile) { EXPECT_EQ(file_to_hex_hash("small_file.txt"), "91c60f6d9ad0235306115913febccb93a5014bf4cea1ecd1fa33f3cf07ad9e8d"); }
|
||||||
|
TEST(sha256, largefile) { EXPECT_EQ(file_to_hex_hash("CLSAG.pdf"), "c38699c9a235a70285165ff8cce0bf3e48989de8092c15514116ca4c95d41e3f"); }
|
||||||
|
TEST(sha256, noexist) { crypto::hash hash; EXPECT_FALSE(tools::sha256sum("this_file_does_not_exist.exe", hash)); }
|
||||||
|
|
Loading…
Reference in a new issue