diff --git a/alethzero/CMakeLists.txt b/alethzero/CMakeLists.txt index c5d1aa0be..4ad06f7a6 100644 --- a/alethzero/CMakeLists.txt +++ b/alethzero/CMakeLists.txt @@ -25,6 +25,7 @@ find_package(Qt5WebKitWidgets REQUIRED) qt5_wrap_ui(ui_Main.h Main.ui) # Set name of binary and add_executable() +file(GLOB HEADERS "*.h") if (APPLE) set(EXECUTEABLE AlethZero) set(BIN_INSTALL_DIR ".") @@ -41,14 +42,14 @@ if (APPLE) set(MACOSX_BUNDLE_ICON_FILE alethzero) include(BundleUtilities) - add_executable(${EXECUTEABLE} MACOSX_BUNDLE alethzero.icns Main.ui ${SRC_LIST}) + add_executable(${EXECUTEABLE} MACOSX_BUNDLE alethzero.icns Main.ui ${SRC_LIST} ${HEADERS}) set_target_properties(${EXECUTEABLE} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/EthereumMacOSXBundleInfo.plist.in") SET_SOURCE_FILES_PROPERTIES(${EXECUTEABLE} PROPERTIES MACOSX_PACKAGE_LOCATION MacOS) SET_SOURCE_FILES_PROPERTIES(${MACOSX_BUNDLE_ICON_FILE}.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") else () set(EXECUTEABLE alethzero) - add_executable(${EXECUTEABLE} Main.ui ${SRC_LIST}) + add_executable(${EXECUTEABLE} Main.ui ${SRC_LIST} ${HEADERS}) endif () qt5_use_modules(${EXECUTEABLE} Core)# Gui Widgets Network WebKit WebKitWidgets) diff --git a/eth/CMakeLists.txt b/eth/CMakeLists.txt index eee1d258b..087c5314a 100644 --- a/eth/CMakeLists.txt +++ b/eth/CMakeLists.txt @@ -8,7 +8,8 @@ link_directories(../libwebthree) set(EXECUTABLE eth) -add_executable(${EXECUTABLE} ${SRC_LIST}) +file(GLOB HEADERS "*.h") +add_executable(${EXECUTABLE} ${SRC_LIST} ${HEADERS}) target_link_libraries(${EXECUTABLE} webthree) target_link_libraries(${EXECUTABLE} secp256k1) diff --git a/libdevcore/CMakeLists.txt b/libdevcore/CMakeLists.txt index 3f3ecb619..81e210cad 100644 --- a/libdevcore/CMakeLists.txt +++ b/libdevcore/CMakeLists.txt @@ -10,13 +10,12 @@ aux_source_directory(. SRC_LIST) set(EXECUTABLE devcore) -# set(CMAKE_INSTALL_PREFIX ../lib) +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) endif() -file(GLOB HEADERS "*.h") include_directories(..) diff --git a/libdevcore/Common.cpp b/libdevcore/Common.cpp index 41b75f5ec..335e2b387 100644 --- a/libdevcore/Common.cpp +++ b/libdevcore/Common.cpp @@ -27,7 +27,7 @@ using namespace dev; namespace dev { -char const* Version = "0.7.3"; +char const* Version = "0.7.4"; } diff --git a/libdevcore/Common.h b/libdevcore/Common.h index cbac82b40..87cc069b3 100644 --- a/libdevcore/Common.h +++ b/libdevcore/Common.h @@ -117,9 +117,6 @@ inline unsigned int toLog2(u256 _x) #define asserts(A) ::dev::assertAux(A, #A, __LINE__, __FILE__, ETH_FUNC) #define assertsEqual(A, B) ::dev::assertEqualAux(A, B, #A, #B, __LINE__, __FILE__, ETH_FUNC) -#if defined(__GNUC__) -__attribute__((gnu_inline, always_inline)) -#endif inline bool assertAux(bool _a, char const* _aStr, unsigned _line, char const* _file, char const* _func) { bool ret = _a; @@ -134,9 +131,6 @@ inline bool assertAux(bool _a, char const* _aStr, unsigned _line, char const* _f } template -#if defined(__GNUC__) -__attribute__((gnu_inline, always_inline)) -#endif inline bool assertEqualAux(A const& _a, B const& _b, char const* _aStr, char const* _bStr, unsigned _line, char const* _file, char const* _func) { bool ret = _a == _b; diff --git a/libdevcrypto/CMakeLists.txt b/libdevcrypto/CMakeLists.txt index e7f112f95..cee7d130d 100644 --- a/libdevcrypto/CMakeLists.txt +++ b/libdevcrypto/CMakeLists.txt @@ -4,15 +4,13 @@ aux_source_directory(. SRC_LIST) set(EXECUTABLE devcrypto) -# set(CMAKE_INSTALL_PREFIX ../lib) +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) endif() -file(GLOB HEADERS "*.h") - include_directories(..) target_link_libraries(${EXECUTABLE} devcore) diff --git a/libethcore/CMakeLists.txt b/libethcore/CMakeLists.txt index 6aba644f1..f5cf00b57 100644 --- a/libethcore/CMakeLists.txt +++ b/libethcore/CMakeLists.txt @@ -4,15 +4,13 @@ aux_source_directory(. SRC_LIST) set(EXECUTABLE ethcore) -# set(CMAKE_INSTALL_PREFIX ../lib) +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) endif() -file(GLOB HEADERS "*.h") - include_directories(..) target_link_libraries(${EXECUTABLE} devcrypto) diff --git a/libethereum/CMakeLists.txt b/libethereum/CMakeLists.txt index 128dd5999..cb2049886 100644 --- a/libethereum/CMakeLists.txt +++ b/libethereum/CMakeLists.txt @@ -6,15 +6,13 @@ aux_source_directory(. SRC_LIST) set(EXECUTABLE ethereum) -# set(CMAKE_INSTALL_PREFIX ../lib) +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) endif() -file(GLOB HEADERS "*.h") - include_directories(..) target_link_libraries(${EXECUTABLE} evm) diff --git a/libethereum/EthereumHost.cpp b/libethereum/EthereumHost.cpp index ee5105cd6..5daf67fb9 100644 --- a/libethereum/EthereumHost.cpp +++ b/libethereum/EthereumHost.cpp @@ -148,17 +148,19 @@ void EthereumHost::doWork() { bool netChange = ensureInitialised(); auto h = m_chain.currentHash(); - maintainTransactions(h); - maintainBlocks(h); + // If we've finished our initial sync (including getting all the blocks into the chain so as to reduce invalid transactions), start trading transactions & blocks + if (!isSyncing() && m_chain.isKnown(m_latestBlockSent)) + { + maintainTransactions(); + maintainBlocks(h); + } // return netChange; // TODO: Figure out what to do with netChange. (void)netChange; } -void EthereumHost::maintainTransactions(h256 _currentHash) +void EthereumHost::maintainTransactions() { - bool resendAll = (!isSyncing() && m_chain.isKnown(m_latestBlockSent) && _currentHash != m_latestBlockSent); - // Send any new transactions. for (auto const& p: peers()) if (auto ep = p->cap()) @@ -166,14 +168,14 @@ void EthereumHost::maintainTransactions(h256 _currentHash) bytes b; unsigned n = 0; for (auto const& i: m_tq.transactions()) - if ((!m_transactionsSent.count(i.first) && !ep->m_knownTransactions.count(i.first)) || ep->m_requireTransactions || resendAll) + if (ep->m_requireTransactions || (!m_transactionsSent.count(i.first) && !ep->m_knownTransactions.count(i.first))) { b += i.second; ++n; m_transactionsSent.insert(i.first); } ep->clearKnownTransactions(); - + if (n || ep->m_requireTransactions) { RLPStream ts; @@ -186,8 +188,8 @@ void EthereumHost::maintainTransactions(h256 _currentHash) void EthereumHost::maintainBlocks(h256 _currentHash) { - // If we've finished our initial sync send any new blocks. - if (!isSyncing() && m_chain.isKnown(m_latestBlockSent) && m_chain.details(m_latestBlockSent).totalDifficulty < m_chain.details(_currentHash).totalDifficulty) + // Send any new blocks. + if (m_chain.details(m_latestBlockSent).totalDifficulty < m_chain.details(_currentHash).totalDifficulty) { clog(NetMessageSummary) << "Sending a new block (current is" << _currentHash << ", was" << m_latestBlockSent << ")"; diff --git a/libethereum/EthereumHost.h b/libethereum/EthereumHost.h index 2add925c6..18ba765aa 100644 --- a/libethereum/EthereumHost.h +++ b/libethereum/EthereumHost.h @@ -84,7 +84,7 @@ private: /// Sync with the BlockChain. It might contain one of our mined blocks, we might have new candidates from the network. void doWork(); - void maintainTransactions(h256 _currentBlock); + void maintainTransactions(); void maintainBlocks(h256 _currentBlock); /// Get a bunch of needed blocks. diff --git a/libethereum/EthereumPeer.cpp b/libethereum/EthereumPeer.cpp index 6c10524ca..24b400c1d 100644 --- a/libethereum/EthereumPeer.cpp +++ b/libethereum/EthereumPeer.cpp @@ -82,7 +82,11 @@ void EthereumPeer::transition(Asking _a, bool _force) { clogS(NetMessageSummary) << "Transition!" << ::toString(_a) << "from" << ::toString(m_asking) << ", " << (isSyncing() ? "syncing" : "holding") << (needsSyncing() ? "& needed" : ""); + if (m_asking == Asking::State && _a != Asking::State) + m_requireTransactions = true; + RLPStream s; + if (_a == Asking::State) { if (m_asking == Asking::Nothing) @@ -324,11 +328,7 @@ bool EthereumPeer::interpret(unsigned _id, RLP const& _r) } break; } - case GetTransactionsPacket: - { - m_requireTransactions = true; - break; - } + case GetTransactionsPacket: break; // DEPRECATED. case TransactionsPacket: { clogS(NetMessageSummary) << "Transactions (" << dec << (_r.itemCount() - 1) << "entries)"; diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index a4e844d88..f31683be0 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -54,14 +54,14 @@ bool Executive::setup(bytesConstRef _rlp) auto nonceReq = m_s.transactionsFrom(m_sender); if (m_t.nonce != nonceReq) { - clog(StateChat) << "Invalid Nonce: Require" << nonceReq << " Got" << m_t.nonce; + clog(StateDetail) << "Invalid Nonce: Require" << nonceReq << " Got" << m_t.nonce; BOOST_THROW_EXCEPTION(InvalidNonce(nonceReq, m_t.nonce)); } // Don't like transactions whose gas price is too low. NOTE: this won't stay here forever - it's just until we get a proper gas price discovery protocol going. if (m_t.gasPrice < m_s.m_currentBlock.minGasPrice) { - clog(StateChat) << "Offered gas-price is too low: Require >" << m_s.m_currentBlock.minGasPrice << " Got" << m_t.gasPrice; + clog(StateDetail) << "Offered gas-price is too low: Require >" << m_s.m_currentBlock.minGasPrice << " Got" << m_t.gasPrice; BOOST_THROW_EXCEPTION(GasPriceTooLow()); } @@ -70,7 +70,7 @@ bool Executive::setup(bytesConstRef _rlp) if (m_t.gas < gasCost) { - clog(StateChat) << "Not enough gas to pay for the transaction: Require >" << gasCost << " Got" << m_t.gas; + clog(StateDetail) << "Not enough gas to pay for the transaction: Require >" << gasCost << " Got" << m_t.gas; BOOST_THROW_EXCEPTION(OutOfGas()); } @@ -79,14 +79,14 @@ bool Executive::setup(bytesConstRef _rlp) // Avoid unaffordable transactions. if (m_s.balance(m_sender) < cost) { - clog(StateChat) << "Not enough cash: Require >" << cost << " Got" << m_s.balance(m_sender); + clog(StateDetail) << "Not enough cash: Require >" << cost << " Got" << m_s.balance(m_sender); BOOST_THROW_EXCEPTION(NotEnoughCash()); } u256 startGasUsed = m_s.gasUsed(); if (startGasUsed + m_t.gas > m_s.m_currentBlock.gasLimit) { - clog(StateChat) << "Too much gas used in this block: Require <" << (m_s.m_currentBlock.gasLimit - startGasUsed) << " Got" << m_t.gas; + clog(StateDetail) << "Too much gas used in this block: Require <" << (m_s.m_currentBlock.gasLimit - startGasUsed) << " Got" << m_t.gas; BOOST_THROW_EXCEPTION(BlockGasLimitReached()); } @@ -94,7 +94,7 @@ bool Executive::setup(bytesConstRef _rlp) m_s.noteSending(m_sender); // Pay... -// cnote << "Paying" << formatBalance(cost) << "from sender (includes" << m_t.gas << "gas at" << formatBalance(m_t.gasPrice) << ")"; + clog(StateDetail) << "Paying" << formatBalance(cost) << "from sender (includes" << m_t.gas << "gas at" << formatBalance(m_t.gasPrice) << ")"; m_s.subBalance(m_sender, cost); if (m_ms) diff --git a/libethereum/State.h b/libethereum/State.h index 6914b9f5e..5552ba454 100644 --- a/libethereum/State.h +++ b/libethereum/State.h @@ -47,8 +47,9 @@ namespace eth class BlockChain; -struct StateChat: public LogChannel { static const char* name() { return "=S="; } static const int verbosity = 4; }; +struct StateChat: public LogChannel { static const char* name() { return "-S-"; } static const int verbosity = 4; }; struct StateTrace: public LogChannel { static const char* name() { return "=S="; } static const int verbosity = 7; }; +struct StateDetail: public LogChannel { static const char* name() { return "/S/"; } static const int verbosity = 14; }; struct TransactionReceipt { diff --git a/libevm/CMakeLists.txt b/libevm/CMakeLists.txt index f19119f83..0c31a9fc3 100644 --- a/libevm/CMakeLists.txt +++ b/libevm/CMakeLists.txt @@ -6,15 +6,13 @@ aux_source_directory(. SRC_LIST) set(EXECUTABLE evm) -# set(CMAKE_INSTALL_PREFIX ../lib) +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) endif() -file(GLOB HEADERS "*.h") - include_directories(..) target_link_libraries(${EXECUTABLE} ethcore) diff --git a/libevmface/CMakeLists.txt b/libevmface/CMakeLists.txt index 212ce825d..874b9e397 100644 --- a/libevmface/CMakeLists.txt +++ b/libevmface/CMakeLists.txt @@ -6,15 +6,13 @@ aux_source_directory(. SRC_LIST) set(EXECUTABLE evmface) -# set(CMAKE_INSTALL_PREFIX ../lib) +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) endif() -file(GLOB HEADERS "*.h") - include_directories(..) target_link_libraries(${EXECUTABLE} devcore) diff --git a/liblll/CMakeLists.txt b/liblll/CMakeLists.txt index 7746613ec..cb50cc36e 100644 --- a/liblll/CMakeLists.txt +++ b/liblll/CMakeLists.txt @@ -6,15 +6,13 @@ aux_source_directory(. SRC_LIST) set(EXECUTABLE lll) -# set(CMAKE_INSTALL_PREFIX ../lib) +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) endif() -file(GLOB HEADERS "*.h") - include_directories(..) target_link_libraries(${EXECUTABLE} evmface) diff --git a/libp2p/CMakeLists.txt b/libp2p/CMakeLists.txt index c3cdc70b9..9e20fd99f 100644 --- a/libp2p/CMakeLists.txt +++ b/libp2p/CMakeLists.txt @@ -6,15 +6,13 @@ aux_source_directory(. SRC_LIST) set(EXECUTABLE p2p) -# set(CMAKE_INSTALL_PREFIX ../lib) +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) endif() -file(GLOB HEADERS "*.h") - include_directories(..) target_link_libraries(${EXECUTABLE} devcrypto) diff --git a/libqethereum/CMakeLists.txt b/libqethereum/CMakeLists.txt index 68ee1bb9d..4fb7d1a21 100644 --- a/libqethereum/CMakeLists.txt +++ b/libqethereum/CMakeLists.txt @@ -51,10 +51,11 @@ if (APPLE) include(BundleUtilities) endif () +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${RESOURCE_ADDED} ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${RESOURCE_ADDED} ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${RESOURCE_ADDED} ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${RESOURCE_ADDED} ${SRC_LIST} ${HEADERS}) endif() include_directories(/) diff --git a/libserpent/CMakeLists.txt b/libserpent/CMakeLists.txt index 0d66393b2..0090b5dc3 100644 --- a/libserpent/CMakeLists.txt +++ b/libserpent/CMakeLists.txt @@ -6,15 +6,13 @@ aux_source_directory(. SRC_LIST) set(EXECUTABLE serpent) -# set(CMAKE_INSTALL_PREFIX ../lib) +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) endif() -file(GLOB HEADERS "*.h") - include_directories(..) target_link_libraries(${EXECUTABLE} lll) diff --git a/libwebthree/CMakeLists.txt b/libwebthree/CMakeLists.txt index d3332d8b0..cc1b290f5 100644 --- a/libwebthree/CMakeLists.txt +++ b/libwebthree/CMakeLists.txt @@ -6,15 +6,13 @@ aux_source_directory(. SRC_LIST) set(EXECUTABLE webthree) -# set(CMAKE_INSTALL_PREFIX ../lib) +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) endif() -file(GLOB HEADERS "*.h") - include_directories(..) target_link_libraries(${EXECUTABLE} ethereum) diff --git a/libwhisper/CMakeLists.txt b/libwhisper/CMakeLists.txt index 49857d16a..364d9759a 100644 --- a/libwhisper/CMakeLists.txt +++ b/libwhisper/CMakeLists.txt @@ -6,15 +6,13 @@ aux_source_directory(. SRC_LIST) set(EXECUTABLE whisper) -# set(CMAKE_INSTALL_PREFIX ../lib) +file(GLOB HEADERS "*.h") if(ETH_STATIC) - add_library(${EXECUTABLE} STATIC ${SRC_LIST}) + add_library(${EXECUTABLE} STATIC ${SRC_LIST} ${HEADERS}) else() - add_library(${EXECUTABLE} SHARED ${SRC_LIST}) + add_library(${EXECUTABLE} SHARED ${SRC_LIST} ${HEADERS}) endif() -file(GLOB HEADERS "*.h") - include_directories(..) target_link_libraries(${EXECUTABLE} ethcore) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 6936addb3..2e5366079 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -6,7 +6,8 @@ include_directories(..) link_directories(../libethcore) link_directories(../libethereum) -add_executable(testeth ${SRC_LIST}) +file(GLOB HEADERS "*.h") +add_executable(testeth ${SRC_LIST} ${HEADERS}) target_link_libraries(testeth ethereum) target_link_libraries(testeth ethcore) diff --git a/test/TestHelperCrypto.h b/test/TestHelperCrypto.h new file mode 100644 index 000000000..6feeeb97f --- /dev/null +++ b/test/TestHelperCrypto.h @@ -0,0 +1,56 @@ +/* + This file is part of cpp-ethereum. + + cpp-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + cpp-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with cpp-ethereum. If not, see . + */ +/** @file TestHelperCrypto.h + * @author Alex Leverington + * @date 2014 + */ + +#pragma once + +//#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace CryptoPP; + +void SavePrivateKey(const PrivateKey& key, const string& file = "ecies.private.key") +{ + FileSink sink(file.c_str()); + key.Save(sink); +} + +void SavePublicKey(const PublicKey& key, const string& file = "ecies.public.key") +{ + FileSink sink(file.c_str()); + key.Save(sink); +} + +void LoadPrivateKey(PrivateKey& key, const string& file = "ecies.private.key") +{ + FileSource source(file.c_str(), true); + key.Load(source); +} + +void LoadPublicKey(PublicKey& key, const string& file = "ecies.public.key") +{ + FileSource source(file.c_str(), true); + key.Load(source); +} diff --git a/test/crypto.cpp b/test/crypto.cpp index 55feb1a54..25106a77f 100644 --- a/test/crypto.cpp +++ b/test/crypto.cpp @@ -27,13 +27,170 @@ #include #include #include +#include "TestHelperCrypto.h" using namespace std; using namespace dev; -using namespace dev::eth; +namespace dev +{ +namespace crypto +{ + +inline CryptoPP::AutoSeededRandomPool& PRNG() { + static CryptoPP::AutoSeededRandomPool prng; + return prng; +} + +} +} + +using namespace CryptoPP; + +BOOST_AUTO_TEST_SUITE(crypto) + +BOOST_AUTO_TEST_CASE(cryptopp_ecies_message) +{ + cnote << "Testing cryptopp_ecies_message..."; + + string const message("Now is the time for all good men to come to the aide of humanity."); + + AutoSeededRandomPool prng; + + ECIES::Decryptor localDecryptor(prng, ASN1::secp256r1()); + SavePrivateKey(localDecryptor.GetPrivateKey()); + + ECIES::Encryptor localEncryptor(localDecryptor); + SavePublicKey(localEncryptor.GetPublicKey()); -BOOST_AUTO_TEST_CASE(crypto_tests) + ECIES::Decryptor futureDecryptor; + LoadPrivateKey(futureDecryptor.AccessPrivateKey()); + futureDecryptor.GetPrivateKey().ThrowIfInvalid(prng, 3); + + ECIES::Encryptor futureEncryptor; + LoadPublicKey(futureEncryptor.AccessPublicKey()); + futureEncryptor.GetPublicKey().ThrowIfInvalid(prng, 3); + + // encrypt/decrypt with local + string cipherLocal; + StringSource ss1 (message, true, new PK_EncryptorFilter(prng, localEncryptor, new StringSink(cipherLocal) ) ); + string plainLocal; + StringSource ss2 (cipherLocal, true, new PK_DecryptorFilter(prng, localDecryptor, new StringSink(plainLocal) ) ); + + // encrypt/decrypt with future + string cipherFuture; + StringSource ss3 (message, true, new PK_EncryptorFilter(prng, futureEncryptor, new StringSink(cipherFuture) ) ); + string plainFuture; + StringSource ss4 (cipherFuture, true, new PK_DecryptorFilter(prng, futureDecryptor, new StringSink(plainFuture) ) ); + + // decrypt local w/future + string plainFutureFromLocal; + StringSource ss5 (cipherLocal, true, new PK_DecryptorFilter(prng, futureDecryptor, new StringSink(plainFutureFromLocal) ) ); + + // decrypt future w/local + string plainLocalFromFuture; + StringSource ss6 (cipherFuture, true, new PK_DecryptorFilter(prng, localDecryptor, new StringSink(plainLocalFromFuture) ) ); + + + assert(plainLocal == message); + assert(plainFuture == plainLocal); + assert(plainFutureFromLocal == plainLocal); + assert(plainLocalFromFuture == plainLocal); +} + +BOOST_AUTO_TEST_CASE(cryptopp_ecdh_prime) +{ + cnote << "Testing cryptopp_ecdh_prime..."; + + using namespace CryptoPP; + OID curve = ASN1::secp256r1(); + + ECDH::Domain dhLocal(curve); + SecByteBlock privLocal(dhLocal.PrivateKeyLength()); + SecByteBlock pubLocal(dhLocal.PublicKeyLength()); + dhLocal.GenerateKeyPair(dev::crypto::PRNG(), privLocal, pubLocal); + + ECDH::Domain dhRemote(curve); + SecByteBlock privRemote(dhRemote.PrivateKeyLength()); + SecByteBlock pubRemote(dhRemote.PublicKeyLength()); + dhRemote.GenerateKeyPair(dev::crypto::PRNG(), privRemote, pubRemote); + + assert(dhLocal.AgreedValueLength() == dhRemote.AgreedValueLength()); + + // local: send public to remote; remote: send public to local + + // Local + SecByteBlock sharedLocal(dhLocal.AgreedValueLength()); + assert(dhLocal.Agree(sharedLocal, privLocal, pubRemote)); + + // Remote + SecByteBlock sharedRemote(dhRemote.AgreedValueLength()); + assert(dhRemote.Agree(sharedRemote, privRemote, pubLocal)); + + // Test + Integer ssLocal, ssRemote; + ssLocal.Decode(sharedLocal.BytePtr(), sharedLocal.SizeInBytes()); + ssRemote.Decode(sharedRemote.BytePtr(), sharedRemote.SizeInBytes()); + + assert(ssLocal != 0); + assert(ssLocal == ssRemote); +} + +BOOST_AUTO_TEST_CASE(cryptopp_ecdh_aes128_cbc_noauth) +{ + // ECDH gives 256-bit shared while aes uses 128-bits + // Use first 128-bits of shared secret as symmetric key + // IV is 0 + // New connections require new ECDH keypairs + + +} + +BOOST_AUTO_TEST_CASE(cryptopp_eth_fbba) +{ + // Initial Authentication: + // + // New/Known Peer: + // pubkeyL = knownR? ? myKnown : myECDH + // pubkeyR = knownR? ? theirKnown : theirECDH + // + // Initial message = hmac(k=sha3(shared-secret[128..255]), address(pubkeyL)) || ECIES encrypt(pubkeyR, pubkeyL) + // + // Key Exchange (this could occur after handshake messages): + // If peers do not know each other they will need to exchange public keys. + // + // Drop ECDH (this could occur after handshake messages): + // After authentication and/or key exchange, both sides generate shared key + // from their 'known' keys and use this to encrypt all future messages. + // + // v2: If one side doesn't trust the other then a single-use key maybe sent. + // This will need to be tracked for future connections; when non-trusting peer + // wants to trust the other, it can request that it's old, 'new', public key be + // accepted. And, if the peer *really* doesn't trust the other side, it can request + // that a new, 'new', public key be accepted. + // + // Handshake (all or nothing, padded): + // All Peers (except blacklisted): + // + // + // New Peer: + // + // + // Known Untrusted Peer: + // + // + // Known Trusted Peer: + // + // + // Blacklisted Peeer: + // Already dropped by now. + // + // + // MAC: + // ... +} + +BOOST_AUTO_TEST_CASE(eth_keypairs) { cnote << "Testing Crypto..."; secp256k1_start(); @@ -42,7 +199,7 @@ BOOST_AUTO_TEST_CASE(crypto_tests) BOOST_REQUIRE(p.pub() == Public(fromHex("97466f2b32bc3bb76d4741ae51cd1d8578b48d3f1e68da206d47321aec267ce78549b514e4453d74ef11b0cd5e4e4c364effddac8b51bcfc8de80682f952896f"))); BOOST_REQUIRE(p.address() == Address(fromHex("8a40bfaa73256b60764c1bf40675a99083efb075"))); { - Transaction t; + eth::Transaction t; t.nonce = 0; t.receiveAddress = h160(fromHex("944400f4b88ac9589a0f17ed4671da26bddb668b")); t.value = 1000; @@ -70,7 +227,7 @@ int cryptoTest() assert(p.pub() == Public(fromHex("97466f2b32bc3bb76d4741ae51cd1d8578b48d3f1e68da206d47321aec267ce78549b514e4453d74ef11b0cd5e4e4c364effddac8b51bcfc8de80682f952896f"))); assert(p.address() == Address(fromHex("8a40bfaa73256b60764c1bf40675a99083efb075"))); { - Transaction t; + eth::Transaction t; t.nonce = 0; t.receiveAddress = h160(fromHex("944400f4b88ac9589a0f17ed4671da26bddb668b")); t.value = 1000; @@ -156,3 +313,5 @@ int cryptoTest() return 0; } +BOOST_AUTO_TEST_SUITE_END() + diff --git a/third/CMakeLists.txt b/third/CMakeLists.txt index 77b2bb496..9221ad045 100644 --- a/third/CMakeLists.txt +++ b/third/CMakeLists.txt @@ -25,6 +25,7 @@ find_package(Qt5WebKitWidgets REQUIRED) qt5_wrap_ui(ui_Main.h Main.ui) # Set name of binary and add_executable() +file(GLOB HEADERS "*.h") if (APPLE) set(EXECUTEABLE Third) set(BIN_INSTALL_DIR ".") @@ -41,14 +42,14 @@ if (APPLE) set(MACOSX_BUNDLE_ICON_FILE third) include(BundleUtilities) - add_executable(${EXECUTEABLE} MACOSX_BUNDLE third.icns Main.ui ${SRC_LIST}) + add_executable(${EXECUTEABLE} MACOSX_BUNDLE third.icns Main.ui ${SRC_LIST} ${HEADERS}) set_target_properties(${EXECUTEABLE} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/EthereumMacOSXBundleInfo.plist.in") SET_SOURCE_FILES_PROPERTIES(${EXECUTEABLE} PROPERTIES MACOSX_PACKAGE_LOCATION MacOS) SET_SOURCE_FILES_PROPERTIES(${MACOSX_BUNDLE_ICON_FILE}.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") else () set(EXECUTEABLE third) - add_executable(${EXECUTEABLE} Main.ui ${SRC_LIST}) + add_executable(${EXECUTEABLE} Main.ui ${SRC_LIST} ${HEADERS}) endif () qt5_use_modules(${EXECUTEABLE} Core)# Gui Widgets Network WebKit WebKitWidgets)