From 6ef586bfa9bc775a24a87a0b8513b6908a52ceed Mon Sep 17 00:00:00 2001 From: Wesley Shillingford Date: Wed, 27 Mar 2019 15:38:39 +0000 Subject: [PATCH] Remove ed25519 and lib library circular dependency (#1870) --- CMakeLists.txt | 1 + nano/core_test/block_store.cpp | 1 + nano/core_test/wallet.cpp | 1 + nano/core_test/websocket.cpp | 1 + nano/core_test/work_pool.cpp | 1 + nano/crypto_lib/CMakeLists.txt | 8 ++++++++ nano/crypto_lib/interface.cpp | 34 +++++++++++++++++++++++++++++++++ nano/crypto_lib/random_pool.cpp | 22 +++++++++++++++++++++ nano/crypto_lib/random_pool.hpp | 31 ++++++++++++++++++++++++++++++ nano/lib/CMakeLists.txt | 2 ++ nano/lib/blocks.cpp | 1 + nano/lib/interface.cpp | 33 +------------------------------- nano/lib/numbers.cpp | 25 +++--------------------- nano/lib/numbers.hpp | 24 ----------------------- nano/lib/work.cpp | 4 ++-- nano/nano_node/entry.cpp | 1 + nano/nano_wallet/entry.cpp | 1 + nano/node/bootstrap.cpp | 1 + nano/node/lmdb.cpp | 1 + nano/node/node.cpp | 1 + nano/node/nodeconfig.cpp | 1 + nano/node/openclwork.cpp | 1 + nano/node/testing.cpp | 1 + nano/node/transport/udp.cpp | 1 + nano/node/wallet.cpp | 3 ++- nano/qt_system/entry.cpp | 1 + nano/secure/CMakeLists.txt | 3 ++- nano/secure/common.cpp | 4 +++- nano/slow_test/node.cpp | 1 + 29 files changed, 127 insertions(+), 83 deletions(-) create mode 100644 nano/crypto_lib/CMakeLists.txt create mode 100644 nano/crypto_lib/interface.cpp create mode 100644 nano/crypto_lib/random_pool.cpp create mode 100644 nano/crypto_lib/random_pool.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e337ec5..db2b102c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -288,6 +288,7 @@ add_library (blake2 target_compile_definitions(blake2 PRIVATE -D__SSE2__) +add_subdirectory(nano/crypto_lib) add_subdirectory(nano/secure) add_subdirectory(nano/lib) add_subdirectory(nano/node) diff --git a/nano/core_test/block_store.cpp b/nano/core_test/block_store.cpp index 16eea197..fe4d9be2 100644 --- a/nano/core_test/block_store.cpp +++ b/nano/core_test/block_store.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include diff --git a/nano/core_test/wallet.cpp b/nano/core_test/wallet.cpp index 3b984018..297ce734 100644 --- a/nano/core_test/wallet.cpp +++ b/nano/core_test/wallet.cpp @@ -2,6 +2,7 @@ #include #include +#include #include using namespace std::chrono_literals; diff --git a/nano/core_test/websocket.cpp b/nano/core_test/websocket.cpp index baae00c8..7dc2c30f 100644 --- a/nano/core_test/websocket.cpp +++ b/nano/core_test/websocket.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/core_test/work_pool.cpp b/nano/core_test/work_pool.cpp index c73f9175..f7d6ae5e 100644 --- a/nano/core_test/work_pool.cpp +++ b/nano/core_test/work_pool.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include diff --git a/nano/crypto_lib/CMakeLists.txt b/nano/crypto_lib/CMakeLists.txt new file mode 100644 index 00000000..c2b509ae --- /dev/null +++ b/nano/crypto_lib/CMakeLists.txt @@ -0,0 +1,8 @@ +add_library (crypto_lib + interface.cpp + random_pool.cpp + random_pool.hpp) + + target_link_libraries (crypto_lib + blake2 + ${CRYPTOPP_LIBRARY}) diff --git a/nano/crypto_lib/interface.cpp b/nano/crypto_lib/interface.cpp new file mode 100644 index 00000000..87172158 --- /dev/null +++ b/nano/crypto_lib/interface.cpp @@ -0,0 +1,34 @@ +#include +#include + +extern "C" { +#include +void ed25519_randombytes_unsafe (void * out, size_t outlen) +{ + nano::random_pool::generate_block (reinterpret_cast (out), outlen); +} +void ed25519_hash_init (ed25519_hash_context * ctx) +{ + ctx->blake2 = new blake2b_state; + blake2b_init (reinterpret_cast (ctx->blake2), 64); +} + +void ed25519_hash_update (ed25519_hash_context * ctx, uint8_t const * in, size_t inlen) +{ + blake2b_update (reinterpret_cast (ctx->blake2), in, inlen); +} + +void ed25519_hash_final (ed25519_hash_context * ctx, uint8_t * out) +{ + blake2b_final (reinterpret_cast (ctx->blake2), out, 64); + delete reinterpret_cast (ctx->blake2); +} + +void ed25519_hash (uint8_t * out, uint8_t const * in, size_t inlen) +{ + ed25519_hash_context ctx; + ed25519_hash_init (&ctx); + ed25519_hash_update (&ctx, in, inlen); + ed25519_hash_final (&ctx, out); +} +} diff --git a/nano/crypto_lib/random_pool.cpp b/nano/crypto_lib/random_pool.cpp new file mode 100644 index 00000000..7f5e4432 --- /dev/null +++ b/nano/crypto_lib/random_pool.cpp @@ -0,0 +1,22 @@ +#include + +std::mutex nano::random_pool::mutex; +CryptoPP::AutoSeededRandomPool nano::random_pool::pool; + +void nano::random_pool::generate_block (unsigned char * output, size_t size) +{ + std::lock_guard lk (mutex); + pool.GenerateBlock (output, size); +} + +unsigned nano::random_pool::generate_word32 (unsigned min, unsigned max) +{ + std::lock_guard lk (mutex); + return pool.GenerateWord32 (min, max); +} + +unsigned char nano::random_pool::generate_byte () +{ + std::lock_guard lk (mutex); + return pool.GenerateByte (); +} diff --git a/nano/crypto_lib/random_pool.hpp b/nano/crypto_lib/random_pool.hpp new file mode 100644 index 00000000..5d4cbf47 --- /dev/null +++ b/nano/crypto_lib/random_pool.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +namespace nano +{ +/** While this uses CryptoPP do not call any of these functions from global scope, as they depend on global variables inside the CryptoPP library which may not have been initialized yet due to an undefined order for globals in different translation units. To make sure this is not an issue, there should be no ASAN warnings at startup on Mac/Clang in the CryptoPP files. */ +class random_pool +{ +public: + static void generate_block (unsigned char * output, size_t size); + static unsigned generate_word32 (unsigned min, unsigned max); + static unsigned char generate_byte (); + + template + static void shuffle (Iter begin, Iter end) + { + std::lock_guard lk (mutex); + pool.Shuffle (begin, end); + } + + random_pool () = delete; + random_pool (random_pool const &) = delete; + random_pool & operator= (random_pool const &) = delete; + +private: + static std::mutex mutex; + static CryptoPP::AutoSeededRandomPool pool; +}; +} \ No newline at end of file diff --git a/nano/lib/CMakeLists.txt b/nano/lib/CMakeLists.txt index 9798b120..d91f36c6 100644 --- a/nano/lib/CMakeLists.txt +++ b/nano/lib/CMakeLists.txt @@ -34,6 +34,8 @@ add_library (nano_lib target_link_libraries (nano_lib xxhash + ed25519 + crypto_lib blake2 ${CRYPTOPP_LIBRARY} Boost::boost) diff --git a/nano/lib/blocks.cpp b/nano/lib/blocks.cpp index c26ccba8..28eb2fa8 100644 --- a/nano/lib/blocks.cpp +++ b/nano/lib/blocks.cpp @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/nano/lib/interface.cpp b/nano/lib/interface.cpp index 8b080299..1d4864a4 100644 --- a/nano/lib/interface.cpp +++ b/nano/lib/interface.cpp @@ -4,10 +4,9 @@ #include -#include - #include +#include #include #include #include @@ -140,34 +139,4 @@ char * xrb_work_transaction (const char * transaction) } return result; } - -#include -void ed25519_randombytes_unsafe (void * out, size_t outlen) -{ - nano::random_pool::generate_block (reinterpret_cast (out), outlen); -} -void ed25519_hash_init (ed25519_hash_context * ctx) -{ - ctx->blake2 = new blake2b_state; - blake2b_init (reinterpret_cast (ctx->blake2), 64); -} - -void ed25519_hash_update (ed25519_hash_context * ctx, uint8_t const * in, size_t inlen) -{ - blake2b_update (reinterpret_cast (ctx->blake2), in, inlen); -} - -void ed25519_hash_final (ed25519_hash_context * ctx, uint8_t * out) -{ - blake2b_final (reinterpret_cast (ctx->blake2), out, 64); - delete reinterpret_cast (ctx->blake2); -} - -void ed25519_hash (uint8_t * out, uint8_t const * in, size_t inlen) -{ - ed25519_hash_context ctx; - ed25519_hash_init (&ctx); - ed25519_hash_update (&ctx, in, inlen); - ed25519_hash_final (&ctx, out); -} } diff --git a/nano/lib/numbers.cpp b/nano/lib/numbers.cpp index ae403363..11bc0e19 100644 --- a/nano/lib/numbers.cpp +++ b/nano/lib/numbers.cpp @@ -1,6 +1,8 @@ -#include #include +#include +#include + #include #include @@ -8,27 +10,6 @@ #include #include -std::mutex nano::random_pool::mutex; -CryptoPP::AutoSeededRandomPool nano::random_pool::pool; - -void nano::random_pool::generate_block (unsigned char * output, size_t size) -{ - std::lock_guard lk (mutex); - pool.GenerateBlock (output, size); -} - -unsigned nano::random_pool::generate_word32 (unsigned min, unsigned max) -{ - std::lock_guard lk (mutex); - return pool.GenerateWord32 (min, max); -} - -unsigned char nano::random_pool::generate_byte () -{ - std::lock_guard lk (mutex); - return pool.GenerateByte (); -} - namespace { char const * base58_reverse ("~012345678~~~~~~~9:;<=>?@~ABCDE~FGHIJKLMNOP~~~~~~QRSTUVWXYZ[~\\]^_`abcdefghi"); diff --git a/nano/lib/numbers.hpp b/nano/lib/numbers.hpp index d9958e05..051a0083 100644 --- a/nano/lib/numbers.hpp +++ b/nano/lib/numbers.hpp @@ -6,30 +6,6 @@ namespace nano { -/** While this uses CryptoPP do not call any of these functions from global scope, as they depend on global variables inside the CryptoPP library which may not have been initialized yet due to an undefined order for globals in different translation units. To make sure this is not an issue, there should be no ASAN warnings at startup on Mac/Clang in the CryptoPP files. */ -class random_pool -{ -public: - static void generate_block (unsigned char * output, size_t size); - static unsigned generate_word32 (unsigned min, unsigned max); - static unsigned char generate_byte (); - - template - static void shuffle (Iter begin, Iter end) - { - std::lock_guard lk (mutex); - pool.Shuffle (begin, end); - } - - random_pool () = delete; - random_pool (random_pool const &) = delete; - random_pool & operator= (random_pool const &) = delete; - -private: - static std::mutex mutex; - static CryptoPP::AutoSeededRandomPool pool; -}; - using uint128_t = boost::multiprecision::uint128_t; using uint256_t = boost::multiprecision::uint256_t; using uint512_t = boost::multiprecision::uint512_t; diff --git a/nano/lib/work.cpp b/nano/lib/work.cpp index b791ebb0..9abd4906 100644 --- a/nano/lib/work.cpp +++ b/nano/lib/work.cpp @@ -1,6 +1,6 @@ -#include - +#include #include +#include #include #include diff --git a/nano/nano_node/entry.cpp b/nano/nano_node/entry.cpp index ddab168a..0d70e520 100644 --- a/nano/nano_node/entry.cpp +++ b/nano/nano_node/entry.cpp @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/nano/nano_wallet/entry.cpp b/nano/nano_wallet/entry.cpp index d16d7452..f1c71b34 100644 --- a/nano/nano_wallet/entry.cpp +++ b/nano/nano_wallet/entry.cpp @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/nano/node/bootstrap.cpp b/nano/node/bootstrap.cpp index 47683e1c..a08f7bf5 100644 --- a/nano/node/bootstrap.cpp +++ b/nano/node/bootstrap.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include diff --git a/nano/node/lmdb.cpp b/nano/node/lmdb.cpp index f5e8ebc0..c16a8f51 100644 --- a/nano/node/lmdb.cpp +++ b/nano/node/lmdb.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include diff --git a/nano/node/node.cpp b/nano/node/node.cpp index 9e995eab..c0502496 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include diff --git a/nano/node/nodeconfig.cpp b/nano/node/nodeconfig.cpp index 5d449191..ce6abd58 100644 --- a/nano/node/nodeconfig.cpp +++ b/nano/node/nodeconfig.cpp @@ -1,3 +1,4 @@ +#include #include #include // NOTE: to reduce compile times, this include can be replaced by more narrow includes diff --git a/nano/node/openclwork.cpp b/nano/node/openclwork.cpp index 8534e1e3..18baa4de 100644 --- a/nano/node/openclwork.cpp +++ b/nano/node/openclwork.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include diff --git a/nano/node/testing.cpp b/nano/node/testing.cpp index dd03ad44..dd3b374a 100644 --- a/nano/node/testing.cpp +++ b/nano/node/testing.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/node/transport/udp.cpp b/nano/node/transport/udp.cpp index fef0b488..a08ff436 100644 --- a/nano/node/transport/udp.cpp +++ b/nano/node/transport/udp.cpp @@ -1,3 +1,4 @@ +#include #include #include diff --git a/nano/node/wallet.cpp b/nano/node/wallet.cpp index 57ed52e8..537f9b0c 100644 --- a/nano/node/wallet.cpp +++ b/nano/node/wallet.cpp @@ -1,6 +1,7 @@ -#include #include +#include +#include #include #include #include diff --git a/nano/qt_system/entry.cpp b/nano/qt_system/entry.cpp index 23475f38..703e4082 100644 --- a/nano/qt_system/entry.cpp +++ b/nano/qt_system/entry.cpp @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/nano/secure/CMakeLists.txt b/nano/secure/CMakeLists.txt index fcbfd8d8..ba2a777f 100644 --- a/nano/secure/CMakeLists.txt +++ b/nano/secure/CMakeLists.txt @@ -45,8 +45,9 @@ add_library (secure versioning.cpp) target_link_libraries(secure - ed25519 nano_lib + ed25519 + crypto_lib lmdb Boost::boost Boost::system diff --git a/nano/secure/common.cpp b/nano/secure/common.cpp index 930d7a29..92665d23 100644 --- a/nano/secure/common.cpp +++ b/nano/secure/common.cpp @@ -1,8 +1,10 @@ +#include + +#include #include #include #include #include -#include #include #include diff --git a/nano/slow_test/node.cpp b/nano/slow_test/node.cpp index 7c05b99c..30dd2c35 100644 --- a/nano/slow_test/node.cpp +++ b/nano/slow_test/node.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include