From f0724694090925b89cab3ccce0c723538d5ff037 Mon Sep 17 00:00:00 2001 From: Nik Bougalis Date: Mon, 5 Oct 2020 01:45:27 -0700 Subject: [PATCH] Simplify & modernize code: - Simplify and consolidate code for parsing hex input. - Replace beast::endian::order with boost::endian::order. - Simplify CountedObject code. - Remove pre-C++17 workarounds in favor of C++17 based solutions. - Improve `base_uint` and simplify its hex-parsing interface by consolidating the `SexHex` and `SetHexExact` methods into one API: `parseHex` which forces callers to verify the result of the operation; as a result some public-facing API endpoints may now return errors when passed values that were previously accepted. - Remove the simple fallback implementations of SHA2 and RIPEMD introduced to reduce our dependency on OpenSSL. The code is slow and rarely, if ever, exercised and we rely on OpenSSL functionality for Boost.ASIO as well. --- Builds/CMake/RippledCore.cmake | 10 - Builds/CMake/RippledInterface.cmake | 3 - bin/ci/test.sh | 1 - bin/ci/ubuntu/build-and-test.sh | 1 - src/ripple/app/consensus/RCLCxPeerPos.h | 6 - src/ripple/app/ledger/AcceptedLedgerTx.cpp | 2 +- src/ripple/app/ledger/InboundLedger.h | 6 - src/ripple/app/ledger/Ledger.cpp | 25 +- src/ripple/app/ledger/Ledger.h | 6 - src/ripple/app/ledger/impl/InboundLedgers.cpp | 3 +- .../app/ledger/impl/TransactionAcquire.h | 7 - src/ripple/app/main/Application.cpp | 4 +- src/ripple/app/misc/HashRouter.h | 6 - src/ripple/app/misc/NetworkOPs.cpp | 6 +- src/ripple/app/misc/Transaction.h | 6 - src/ripple/app/misc/impl/AmendmentTable.cpp | 2 +- src/ripple/app/misc/impl/Manifest.cpp | 6 +- src/ripple/app/paths/PathRequest.h | 8 - src/ripple/basics/CountedObject.h | 85 ++-- src/ripple/basics/StringUtilities.h | 43 +- src/ripple/basics/base_uint.h | 140 ++---- src/ripple/basics/impl/CountedObject.cpp | 49 +- src/ripple/basics/impl/StringUtilities.cpp | 26 +- src/ripple/basics/impl/strHex.cpp | 39 +- src/ripple/basics/strHex.h | 31 -- src/ripple/beast/asio/io_latency_probe.h | 6 - src/ripple/beast/crypto/detail/mac_facade.h | 82 ---- .../beast/crypto/detail/ripemd_context.h | 449 ------------------ src/ripple/beast/crypto/detail/sha2_context.h | 419 ---------------- src/ripple/beast/crypto/ripemd.h | 35 -- src/ripple/beast/crypto/sha2.h | 40 -- src/ripple/beast/hash/endian.h | 54 --- src/ripple/beast/hash/hash_append.h | 13 +- src/ripple/beast/hash/xxhasher.h | 4 +- src/ripple/beast/rfc2616.h | 285 +---------- src/ripple/consensus/Consensus.h | 12 +- src/ripple/json/impl/json_value.cpp | 6 +- src/ripple/ledger/detail/ReadViewFwdRange.h | 4 - src/ripple/net/InfoSub.h | 6 - src/ripple/net/impl/HTTPClient.cpp | 2 +- src/ripple/net/impl/RPCCall.cpp | 4 +- src/ripple/nodestore/NodeObject.h | 6 - .../nodestore/backend/RocksDBFactory.cpp | 3 +- src/ripple/nodestore/impl/Shard.cpp | 4 +- src/ripple/overlay/impl/PeerImp.cpp | 2 +- src/ripple/protocol/AccountID.h | 23 - src/ripple/protocol/STArray.h | 6 - src/ripple/protocol/STBitString.h | 10 - src/ripple/protocol/STLedgerEntry.h | 6 - src/ripple/protocol/STObject.h | 6 - src/ripple/protocol/STTx.h | 6 - src/ripple/protocol/STValidation.h | 6 - src/ripple/protocol/Serializer.h | 9 +- src/ripple/protocol/digest.h | 37 +- src/ripple/protocol/impl/AccountID.cpp | 55 +-- src/ripple/protocol/impl/Indexes.cpp | 9 +- src/ripple/protocol/impl/PublicKey.cpp | 8 +- src/ripple/protocol/impl/STBase.cpp | 17 +- src/ripple/protocol/impl/STInteger.cpp | 15 +- src/ripple/protocol/impl/STLedgerEntry.cpp | 19 +- src/ripple/protocol/impl/STParsedJSON.cpp | 125 ++--- src/ripple/protocol/impl/STPathSet.cpp | 1 - src/ripple/protocol/impl/STTx.cpp | 2 +- src/ripple/protocol/impl/Seed.cpp | 2 +- src/ripple/protocol/impl/UintTypes.cpp | 9 +- src/ripple/protocol/tokens.h | 8 - src/ripple/rpc/handlers/AccountChannels.cpp | 2 +- src/ripple/rpc/handlers/AccountLines.cpp | 4 +- src/ripple/rpc/handlers/AccountObjects.cpp | 4 +- src/ripple/rpc/handlers/AccountOffers.cpp | 4 +- src/ripple/rpc/handlers/AccountTx.cpp | 2 +- src/ripple/rpc/handlers/CanDelete.cpp | 8 +- src/ripple/rpc/handlers/Feature1.cpp | 3 +- src/ripple/rpc/handlers/LedgerData.cpp | 2 +- src/ripple/rpc/handlers/LedgerEntry.cpp | 61 ++- src/ripple/rpc/handlers/LedgerRequest.cpp | 2 +- src/ripple/rpc/handlers/PayChanClaim.cpp | 4 +- src/ripple/rpc/handlers/TransactionEntry.cpp | 6 +- src/ripple/rpc/handlers/Tx.cpp | 22 +- src/ripple/rpc/impl/RPCHelpers.cpp | 4 +- src/ripple/shamap/impl/SHAMapTreeNode.cpp | 2 +- src/test/app/Manifest_test.cpp | 37 +- src/test/app/Path_test.cpp | 12 +- src/test/app/TrustAndBalance_test.cpp | 20 +- src/test/basics/base_uint_test.cpp | 81 ++-- src/test/conditions/PreimageSha256_test.cpp | 27 +- src/test/jtx/impl/Env.cpp | 4 +- src/test/ledger/Directory_test.cpp | 4 +- src/test/overlay/compression_test.cpp | 17 +- src/test/protocol/STAmount_test.cpp | 3 - src/test/protocol/digest_test.cpp | 160 ------- src/test/rpc/AccountObjects_test.cpp | 19 +- src/test/rpc/AccountSet_test.cpp | 15 +- src/test/rpc/Book_test.cpp | 8 +- src/test/rpc/Feature_test.cpp | 2 +- src/test/rpc/LedgerRPC_test.cpp | 9 +- src/test/rpc/Submit_test.cpp | 18 +- src/test/rpc/TransactionEntry_test.cpp | 2 +- src/test/shamap/SHAMap_test.cpp | 58 +-- 99 files changed, 534 insertions(+), 2428 deletions(-) delete mode 100644 src/ripple/beast/crypto/detail/mac_facade.h delete mode 100644 src/ripple/beast/crypto/detail/ripemd_context.h delete mode 100644 src/ripple/beast/crypto/detail/sha2_context.h delete mode 100644 src/ripple/beast/crypto/ripemd.h delete mode 100644 src/ripple/beast/crypto/sha2.h delete mode 100644 src/ripple/beast/hash/endian.h delete mode 100644 src/test/protocol/digest_test.cpp diff --git a/Builds/CMake/RippledCore.cmake b/Builds/CMake/RippledCore.cmake index 40b1df1997..461de2f861 100644 --- a/Builds/CMake/RippledCore.cmake +++ b/Builds/CMake/RippledCore.cmake @@ -272,15 +272,6 @@ install ( DESTINATION include/ripple/beast/core) install ( FILES - src/ripple/beast/crypto/detail/mac_facade.h - src/ripple/beast/crypto/detail/ripemd_context.h - src/ripple/beast/crypto/detail/sha2_context.h - src/ripple/beast/crypto/ripemd.h - src/ripple/beast/crypto/sha2.h - DESTINATION include/ripple/beast/crypto) -install ( - FILES - src/ripple/beast/hash/endian.h src/ripple/beast/hash/hash_append.h src/ripple/beast/hash/meta.h src/ripple/beast/hash/uhash.h @@ -891,7 +882,6 @@ target_sources (rippled PRIVATE src/test/protocol/Seed_test.cpp src/test/protocol/SeqProxy_test.cpp src/test/protocol/TER_test.cpp - src/test/protocol/digest_test.cpp src/test/protocol/types_test.cpp #[===============================[ test sources: diff --git a/Builds/CMake/RippledInterface.cmake b/Builds/CMake/RippledInterface.cmake index e0c0c1e5c0..28a531246f 100644 --- a/Builds/CMake/RippledInterface.cmake +++ b/Builds/CMake/RippledInterface.cmake @@ -16,9 +16,6 @@ target_compile_definitions (opts BOOST_BEAST_ALLOW_DEPRECATED BOOST_FILESYSTEM_DEPRECATED > - $<$: - USE_BEAST_HASHER - > $<$:BEAST_NO_UNIT_TEST_INLINE=1> $<$:BEAST_DONT_AUTOLINK_TO_WIN32_LIBRARIES=1> $<$:RIPPLE_SINGLE_IO_SERVICE_THREAD=1>) diff --git a/bin/ci/test.sh b/bin/ci/test.sh index 6162f37aa0..11615d732b 100755 --- a/bin/ci/test.sh +++ b/bin/ci/test.sh @@ -24,7 +24,6 @@ declare -a manual_tests=( 'ripple.consensus.ByzantineFailureSim' 'ripple.consensus.DistributedValidators' 'ripple.consensus.ScaleFreeSim' - 'ripple.ripple_data.digest' 'ripple.tx.CrossingLimits' 'ripple.tx.FindOversizeCross' 'ripple.tx.Offer_manual' diff --git a/bin/ci/ubuntu/build-and-test.sh b/bin/ci/ubuntu/build-and-test.sh index ea83e76865..1f9da09b88 100755 --- a/bin/ci/ubuntu/build-and-test.sh +++ b/bin/ci/ubuntu/build-and-test.sh @@ -137,7 +137,6 @@ else # descending execution time (longest running tests at top) declare -a manual_tests=( 'ripple.ripple_data.reduce_relay_simulate' - 'ripple.ripple_data.digest' 'ripple.tx.Offer_manual' 'ripple.tx.CrossingLimits' 'ripple.tx.PlumpBook' diff --git a/src/ripple/app/consensus/RCLCxPeerPos.h b/src/ripple/app/consensus/RCLCxPeerPos.h index 83456a101f..9d448aac48 100644 --- a/src/ripple/app/consensus/RCLCxPeerPos.h +++ b/src/ripple/app/consensus/RCLCxPeerPos.h @@ -113,12 +113,6 @@ private: Slice const& signature, uint256 const& suppress, Proposal&& proposal); - - static char const* - getCountedObjectName() - { - return "RCLCxPeerPos::Data"; - } }; std::shared_ptr data_; diff --git a/src/ripple/app/ledger/AcceptedLedgerTx.cpp b/src/ripple/app/ledger/AcceptedLedgerTx.cpp index 4c0150d4a8..c92ebffe04 100644 --- a/src/ripple/app/ledger/AcceptedLedgerTx.cpp +++ b/src/ripple/app/ledger/AcceptedLedgerTx.cpp @@ -74,7 +74,7 @@ std::string AcceptedLedgerTx::getEscMeta() const { assert(!mRawMeta.empty()); - return sqlEscape(mRawMeta); + return sqlBlobLiteral(mRawMeta); } void diff --git a/src/ripple/app/ledger/InboundLedger.h b/src/ripple/app/ledger/InboundLedger.h index 6688d0dc35..4ab66b6a67 100644 --- a/src/ripple/app/ledger/InboundLedger.h +++ b/src/ripple/app/ledger/InboundLedger.h @@ -38,12 +38,6 @@ class InboundLedger final : public PeerSet, public: using clock_type = beast::abstract_clock; - static char const* - getCountedObjectName() - { - return "InboundLedger"; - } - using PeerDataPairType = std::pair, std::shared_ptr>; diff --git a/src/ripple/app/ledger/Ledger.cpp b/src/ripple/app/ledger/Ledger.cpp index 15b4583c7f..e52aebeb46 100644 --- a/src/ripple/app/ledger/Ledger.cpp +++ b/src/ripple/app/ledger/Ledger.cpp @@ -1173,13 +1173,13 @@ loadLedgerHelper(std::string const& sqlSuffix, Application& app, bool acquire) uint256 prevHash{}, accountHash{}, transHash{}; if (sLedgerHash) - ledgerHash.SetHexExact(*sLedgerHash); + (void)ledgerHash.parseHex(*sLedgerHash); if (sPrevHash) - prevHash.SetHexExact(*sPrevHash); + (void)prevHash.parseHex(*sPrevHash); if (sAccountHash) - accountHash.SetHexExact(*sAccountHash); + (void)accountHash.parseHex(*sAccountHash); if (sTransHash) - transHash.SetHexExact(*sTransHash); + (void)transHash.parseHex(*sTransHash); using time_point = NetClock::time_point; using duration = NetClock::duration; @@ -1266,7 +1266,7 @@ getHashByIndex(std::uint32_t ledgerIndex, Application& app) std::string sql = "SELECT LedgerHash FROM Ledgers INDEXED BY SeqLedger WHERE LedgerSeq='"; - sql.append(beast::lexicalCastThrow(ledgerIndex)); + sql.append(std::to_string(ledgerIndex)); sql.append("';"); std::string hash; @@ -1284,7 +1284,7 @@ getHashByIndex(std::uint32_t ledgerIndex, Application& app) return ret; } - ret.SetHexExact(hash); + (void)ret.parseHex(hash); return ret; } @@ -1310,10 +1310,7 @@ getHashesByIndex( return false; } - ledgerHash.SetHexExact(*lhO); - parentHash.SetHexExact(*phO); - - return true; + return ledgerHash.parseHex(*lhO) && parentHash.parseHex(*phO); } std::map> @@ -1323,9 +1320,9 @@ getHashesByIndex(std::uint32_t minSeq, std::uint32_t maxSeq, Application& app) std::string sql = "SELECT LedgerSeq,LedgerHash,PrevHash FROM Ledgers WHERE LedgerSeq >= "; - sql.append(beast::lexicalCastThrow(minSeq)); + sql.append(std::to_string(minSeq)); sql.append(" AND LedgerSeq <= "); - sql.append(beast::lexicalCastThrow(maxSeq)); + sql.append(std::to_string(maxSeq)); sql.append(";"); auto db = app.getLedgerDB().checkoutDb(); @@ -1341,9 +1338,9 @@ getHashesByIndex(std::uint32_t minSeq, std::uint32_t maxSeq, Application& app) { std::pair& hashes = ret[rangeCheckedCast(ls)]; - hashes.first.SetHexExact(lh); + (void)hashes.first.parseHex(lh); if (ph) - hashes.second.SetHexExact(*ph); + (void)hashes.second.parseHex(*ph); else hashes.second.zero(); if (!ph) diff --git a/src/ripple/app/ledger/Ledger.h b/src/ripple/app/ledger/Ledger.h index 2dff593802..1e3eb791d6 100644 --- a/src/ripple/app/ledger/Ledger.h +++ b/src/ripple/app/ledger/Ledger.h @@ -80,12 +80,6 @@ class Ledger final : public std::enable_shared_from_this, public CountedObject { public: - static char const* - getCountedObjectName() - { - return "Ledger"; - } - Ledger(Ledger const&) = delete; Ledger& operator=(Ledger const&) = delete; diff --git a/src/ripple/app/ledger/impl/InboundLedgers.cpp b/src/ripple/app/ledger/impl/InboundLedgers.cpp index 98a6cc895d..b7116aba22 100644 --- a/src/ripple/app/ledger/impl/InboundLedgers.cpp +++ b/src/ripple/app/ledger/impl/InboundLedgers.cpp @@ -309,8 +309,7 @@ public: for (auto const& it : mRecentFailures) { if (it.second > 1) - ret[beast::lexicalCastThrow(it.second)] - [jss::failed] = true; + ret[std::to_string(it.second)][jss::failed] = true; else ret[to_string(it.first)][jss::failed] = true; } diff --git a/src/ripple/app/ledger/impl/TransactionAcquire.h b/src/ripple/app/ledger/impl/TransactionAcquire.h index be93a86a68..c1119c4ace 100644 --- a/src/ripple/app/ledger/impl/TransactionAcquire.h +++ b/src/ripple/app/ledger/impl/TransactionAcquire.h @@ -34,15 +34,8 @@ class TransactionAcquire final public CountedObject { public: - static char const* - getCountedObjectName() - { - return "TransactionAcquire"; - } - using pointer = std::shared_ptr; -public: TransactionAcquire(Application& app, uint256 const& hash); ~TransactionAcquire() = default; diff --git a/src/ripple/app/main/Application.cpp b/src/ripple/app/main/Application.cpp index 411dfaf52c..04828557c8 100644 --- a/src/ripple/app/main/Application.cpp +++ b/src/ripple/app/main/Application.cpp @@ -1878,7 +1878,7 @@ ApplicationImp::loadLedgerFromFile(std::string const& name) uint256 uIndex; - if (!uIndex.SetHex(entry[jss::index].asString())) + if (!uIndex.parseHex(entry[jss::index].asString())) { JLOG(m_journal.fatal()) << "Invalid entry in ledger"; return nullptr; @@ -1940,7 +1940,7 @@ ApplicationImp::loadOldLedger( { uint256 hash; - if (hash.SetHex(ledgerID)) + if (hash.parseHex(ledgerID)) { loadLedger = loadByHash(hash, *this); diff --git a/src/ripple/app/misc/HashRouter.h b/src/ripple/app/misc/HashRouter.h index 76cf4431ec..ba2f9436dd 100644 --- a/src/ripple/app/misc/HashRouter.h +++ b/src/ripple/app/misc/HashRouter.h @@ -61,12 +61,6 @@ private: class Entry : public CountedObject { public: - static char const* - getCountedObjectName() - { - return "HashRouterEntry"; - } - Entry() { } diff --git a/src/ripple/app/misc/NetworkOPs.cpp b/src/ripple/app/misc/NetworkOPs.cpp index bc4bdd9d82..3d4ff057e0 100644 --- a/src/ripple/app/misc/NetworkOPs.cpp +++ b/src/ripple/app/misc/NetworkOPs.cpp @@ -2229,8 +2229,7 @@ NetworkOPsImp::transactionsSQL( boost::format("SELECT %s FROM AccountTransactions " "WHERE Account = '%s' %s %s LIMIT %u, %u;") % selection % app_.accountIDCache().toBase58(account) % maxClause % - minClause % beast::lexicalCastThrow(offset) % - beast::lexicalCastThrow(numberOfResults)); + minClause % offset % numberOfResults); else sql = boost::str( boost::format( @@ -2244,8 +2243,7 @@ NetworkOPsImp::transactionsSQL( selection % app_.accountIDCache().toBase58(account) % maxClause % minClause % (descending ? "DESC" : "ASC") % (descending ? "DESC" : "ASC") % (descending ? "DESC" : "ASC") % - beast::lexicalCastThrow(offset) % - beast::lexicalCastThrow(numberOfResults)); + offset % numberOfResults); JLOG(m_journal.trace()) << "txSQL query: " << sql; return sql; } diff --git a/src/ripple/app/misc/Transaction.h b/src/ripple/app/misc/Transaction.h index 4dbe2f06b8..79da8b2244 100644 --- a/src/ripple/app/misc/Transaction.h +++ b/src/ripple/app/misc/Transaction.h @@ -61,12 +61,6 @@ class Transaction : public std::enable_shared_from_this, public CountedObject { public: - static char const* - getCountedObjectName() - { - return "Transaction"; - } - using pointer = std::shared_ptr; using ref = const pointer&; diff --git a/src/ripple/app/misc/impl/AmendmentTable.cpp b/src/ripple/app/misc/impl/AmendmentTable.cpp index 2f29a2f578..68ad92b204 100644 --- a/src/ripple/app/misc/impl/AmendmentTable.cpp +++ b/src/ripple/app/misc/impl/AmendmentTable.cpp @@ -56,7 +56,7 @@ parseSection(Section const& section) uint256 id; - if (!id.SetHexExact(match[1])) + if (!id.parseHex(match[1])) Throw( "Invalid amendment ID '" + match[1] + "' in [" + section.name() + "]"); diff --git a/src/ripple/app/misc/impl/Manifest.cpp b/src/ripple/app/misc/impl/Manifest.cpp index e69c5c49d9..aa2f99e019 100644 --- a/src/ripple/app/misc/impl/Manifest.cpp +++ b/src/ripple/app/misc/impl/Manifest.cpp @@ -22,12 +22,12 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -235,7 +235,7 @@ loadValidatorToken(std::vector const& blob) })); for (auto const& line : blob) - tokenStr += beast::rfc2616::trim(line); + tokenStr += boost::algorithm::trim_copy(line); tokenStr = base64_decode(tokenStr); @@ -509,7 +509,7 @@ ManifestCache::load( })); for (auto const& line : configRevocation) - revocationStr += beast::rfc2616::trim(line); + revocationStr += boost::algorithm::trim_copy(line); auto mo = deserializeManifest(base64_decode(revocationStr)); diff --git a/src/ripple/app/paths/PathRequest.h b/src/ripple/app/paths/PathRequest.h index e0b9f37cdb..4cba34fbad 100644 --- a/src/ripple/app/paths/PathRequest.h +++ b/src/ripple/app/paths/PathRequest.h @@ -49,12 +49,6 @@ class PathRequest : public std::enable_shared_from_this, public CountedObject { public: - static char const* - getCountedObjectName() - { - return "PathRequest"; - } - using wptr = std::weak_ptr; using pointer = std::shared_ptr; using ref = const pointer&; @@ -112,8 +106,6 @@ public: private: bool isValid(std::shared_ptr const& crCache); - void - setValid(); std::unique_ptr const& getPathFinder( diff --git a/src/ripple/basics/CountedObject.h b/src/ripple/basics/CountedObject.h index cf57b2a309..a5bccf89ec 100644 --- a/src/ripple/basics/CountedObject.h +++ b/src/ripple/basics/CountedObject.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_COUNTEDOBJECT_H_INCLUDED #include +#include #include #include #include @@ -45,47 +46,60 @@ public: @internal */ - class CounterBase + class Counter { public: - CounterBase() noexcept; + Counter(std::string name) noexcept : name_(std::move(name)), count_(0) + { + // Insert ourselves at the front of the lock-free linked list + CountedObjects& instance = CountedObjects::getInstance(); + Counter* head; - virtual ~CounterBase() noexcept; + do + { + head = instance.m_head.load(); + next_ = head; + } while (instance.m_head.exchange(this) != head); + + ++instance.m_count; + } + + ~Counter() noexcept = default; int increment() noexcept { - return ++m_count; + return ++count_; } int decrement() noexcept { - return --m_count; + return --count_; } int getCount() const noexcept { - return m_count.load(); + return count_.load(); } - CounterBase* + Counter* getNext() const noexcept { - return m_next; + return next_; } - virtual char const* - getName() const = 0; + std::string const& + getName() const noexcept + { + return name_; + } private: - virtual void - checkPureVirtual() const = 0; - - protected: - std::atomic m_count; - CounterBase* m_next; + std::string const name_; + std::atomic count_; + Counter* next_; }; private: @@ -94,7 +108,7 @@ private: private: std::atomic m_count; - std::atomic m_head; + std::atomic m_head; }; //------------------------------------------------------------------------------ @@ -109,6 +123,14 @@ private: template class CountedObject { +private: + static auto& + getCounter() noexcept + { + static CountedObjects::Counter c{beast::type_name()}; + return c; + } + public: CountedObject() noexcept { @@ -127,35 +149,6 @@ public: { getCounter().decrement(); } - -private: - class Counter : public CountedObjects::CounterBase - { - public: - Counter() noexcept - { - } - - char const* - getName() const override - { - return Object::getCountedObjectName(); - } - - void - checkPureVirtual() const override - { - } - }; - -private: - static Counter& - getCounter() noexcept - { - static_assert(std::is_nothrow_constructible{}, ""); - static Counter c; - return c; - } }; } // namespace ripple diff --git a/src/ripple/basics/StringUtilities.h b/src/ripple/basics/StringUtilities.h index 9cedbbe175..759d407361 100644 --- a/src/ripple/basics/StringUtilities.h +++ b/src/ripple/basics/StringUtilities.h @@ -30,42 +30,19 @@ #include namespace ripple { -inline static std::string -sqlEscape(std::string const& strSrc) -{ - static boost::format f("X'%s'"); - return str(boost::format(f) % strHex(strSrc)); -} -inline static std::string -sqlEscape(Blob const& vecSrc) -{ - size_t size = vecSrc.size(); +/** Format arbitrary binary data as an SQLite "blob literal". - if (size == 0) - return "X''"; + In SQLite, blob literals must be encoded when used in a query. Per + https://sqlite.org/lang_expr.html#literal_values_constants_ they are + encoded as string literals containing hexadecimal data and preceded + by a single 'X' character. - std::string j(size * 2 + 3, 0); - - unsigned char* oPtr = reinterpret_cast(&*j.begin()); - const unsigned char* iPtr = &vecSrc[0]; - - *oPtr++ = 'X'; - *oPtr++ = '\''; - - for (int i = size; i != 0; --i) - { - unsigned char c = *iPtr++; - *oPtr++ = charHex(c >> 4); - *oPtr++ = charHex(c & 15); - } - - *oPtr++ = '\''; - return j; -} - -uint64_t -uintFromHex(std::string const& strSrc); + @param blob An arbitrary blob of binary data + @return The input, encoded as a blob literal. + */ +std::string +sqlBlobLiteral(Blob const& blob); template boost::optional diff --git a/src/ripple/basics/base_uint.h b/src/ripple/basics/base_uint.h index bc23a58251..3ada512b51 100644 --- a/src/ripple/basics/base_uint.h +++ b/src/ripple/basics/base_uint.h @@ -56,8 +56,19 @@ struct is_contiguous_container< } // namespace detail -// This class stores its values internally in big-endian form +/** Integers of any length that is a multiple of 32-bits + @note This class stores its values internally in big-endian + form and that internal representation is part of the + binary protocol of the XRP Ledger and cannot be changed + arbitrarily without causing breakage. + + @tparam Bits The number of bits this integer should have; must + be at least 64 and a multiple of 32. + @tparam Tag An arbitrary type that functions as a tag and allows + the instantiation of "distinct" types that the same + number of bits. + */ template class base_uint { @@ -362,99 +373,53 @@ public: } /** Parse a hex string into a base_uint - The string must contain exactly bytes * 2 hex characters and must not - have any leading or trailing whitespace. - */ - bool - SetHexExact(const char* psz) + + The input must be precisely `2 * bytes` hexadecimal characters + long, with one exception: the value '0'. + + @param sv A null-terminated string of hexadecimal characters + @return true if the input was parsed properly; false otherwise. + */ + [[nodiscard]] bool + parseHex(std::string_view sv) { - unsigned char* pOut = begin(); - - for (int i = 0; i < sizeof(data_); ++i) + if (sv == "0") { - auto hi = charUnHex(*psz++); - if (hi == -1) - return false; - - auto lo = charUnHex(*psz++); - if (lo == -1) - return false; - - *pOut++ = (hi << 4) | lo; + zero(); + return true; } - // We've consumed exactly as many bytes as we needed at this point - // so we should be at the end of the string. - return (*psz == 0); - } + if (sv.size() != bytes * 2) + return false; - /** Parse a hex string into a base_uint - The input can be: - - shorter than the full hex representation by not including leading - zeroes. - - longer than the full hex representation in which case leading - bytes are discarded. + auto out = data(); - When finished parsing, the string must be fully consumed with only a - null terminator remaining. + auto in = sv.begin(); - When bStrict is false, the parsing is done in non-strict mode, and, if - present, leading whitespace and the 0x prefix will be skipped. - */ - bool - SetHex(const char* psz, bool bStrict = false) - { - // Find beginning. - auto pBegin = reinterpret_cast(psz); - // skip leading spaces - if (!bStrict) - while (isspace(*pBegin)) - pBegin++; - - // skip 0x - if (!bStrict && pBegin[0] == '0' && tolower(pBegin[1]) == 'x') - pBegin += 2; - - // Find end. - auto pEnd = pBegin; - while (charUnHex(*pEnd) != -1) - pEnd++; - - // Take only last digits of over long string. - if ((unsigned int)(pEnd - pBegin) > 2 * size()) - pBegin = pEnd - 2 * size(); - - unsigned char* pOut = end() - ((pEnd - pBegin + 1) / 2); - - *this = beast::zero; - - if ((pEnd - pBegin) & 1) - *pOut++ = charUnHex(*pBegin++); - - while (pBegin != pEnd) + while (in != sv.end()) { - auto cHigh = charUnHex(*pBegin++); - auto cLow = pBegin == pEnd ? 0 : charUnHex(*pBegin++); + auto const hi = charUnHex(*in++); + auto const lo = charUnHex(*in++); - if (cHigh == -1 || cLow == -1) + if (hi == -1 || lo == -1) return false; - *pOut++ = (cHigh << 4) | cLow; + *out++ = static_cast((hi << 4) + lo); } - return !*pEnd; + return true; } - bool - SetHex(std::string const& str, bool bStrict = false) + [[nodiscard]] bool + parseHex(const char* str) { - return SetHex(str.c_str(), bStrict); + return parseHex(std::string_view{str}); } - bool - SetHexExact(std::string const& str) + [[nodiscard]] bool + parseHex(std::string const& str) { - return SetHexExact(str.c_str()); + return parseHex(std::string_view{str}); } constexpr static std::size_t @@ -602,31 +567,6 @@ to_string(base_uint const& a) return strHex(a.cbegin(), a.cend()); } -// Function templates that return a base_uint given text in hexadecimal. -// Invoke like: -// auto i = from_hex_text("AAAAA"); -template -auto -from_hex_text(char const* text) -> std::enable_if_t< - std::is_same>::value, - T> -{ - T ret; - ret.SetHex(text); - return ret; -} - -template -auto -from_hex_text(std::string const& text) -> std::enable_if_t< - std::is_same>::value, - T> -{ - T ret; - ret.SetHex(text); - return ret; -} - template inline std::ostream& operator<<(std::ostream& out, base_uint const& u) diff --git a/src/ripple/basics/impl/CountedObject.cpp b/src/ripple/basics/impl/CountedObject.cpp index da42bf5b49..5b25091632 100644 --- a/src/ripple/basics/impl/CountedObject.cpp +++ b/src/ripple/basics/impl/CountedObject.cpp @@ -18,6 +18,7 @@ //============================================================================== #include +#include #include namespace ripple { @@ -41,53 +42,17 @@ CountedObjects::getCounts(int minimumThreshold) const // When other operations are concurrent, the count // might be temporarily less than the actual count. - int const count = m_count.load(); + counts.reserve(m_count.load()); - counts.reserve(count); - - CounterBase* counter = m_head.load(); - - while (counter != nullptr) + for (auto* ctr = m_head.load(); ctr != nullptr; ctr = ctr->getNext()) { - if (counter->getCount() >= minimumThreshold) - { - Entry entry; - - entry.first = counter->getName(); - entry.second = counter->getCount(); - - counts.push_back(entry); - } - - counter = counter->getNext(); + if (ctr->getCount() >= minimumThreshold) + counts.emplace_back(ctr->getName(), ctr->getCount()); } + std::sort(counts.begin(), counts.end()); + return counts; } -//------------------------------------------------------------------------------ - -CountedObjects::CounterBase::CounterBase() noexcept : m_count(0) -{ - // Insert ourselves at the front of the lock-free linked list - - CountedObjects& instance = CountedObjects::getInstance(); - CounterBase* head; - - do - { - head = instance.m_head.load(); - m_next = head; - } while (instance.m_head.exchange(this) != head); - - ++instance.m_count; -} - -CountedObjects::CounterBase::~CounterBase() noexcept -{ - // VFALCO NOTE If the counters are destroyed before the singleton, - // undefined behavior will result if the singleton's member - // functions are called. -} - } // namespace ripple diff --git a/src/ripple/basics/impl/StringUtilities.cpp b/src/ripple/basics/impl/StringUtilities.cpp index d76bd79b6b..346e94c756 100644 --- a/src/ripple/basics/impl/StringUtilities.cpp +++ b/src/ripple/basics/impl/StringUtilities.cpp @@ -26,29 +26,21 @@ #include #include #include -#include namespace ripple { -uint64_t -uintFromHex(std::string const& strSrc) +std::string +sqlBlobLiteral(Blob const& blob) { - uint64_t uValue(0); + std::string j; - if (strSrc.size() > 16) - Throw("overlong 64-bit value"); + j.reserve(blob.size() * 2 + 3); + j.push_back('X'); + j.push_back('\''); + boost::algorithm::hex(blob.begin(), blob.end(), std::back_inserter(j)); + j.push_back('\''); - for (auto c : strSrc) - { - int ret = charUnHex(c); - - if (ret == -1) - Throw("invalid hex digit"); - - uValue = (uValue << 4) | ret; - } - - return uValue; + return j; } bool diff --git a/src/ripple/basics/impl/strHex.cpp b/src/ripple/basics/impl/strHex.cpp index 66aa8949f0..084493af53 100644 --- a/src/ripple/basics/impl/strHex.cpp +++ b/src/ripple/basics/impl/strHex.cpp @@ -18,37 +18,30 @@ //============================================================================== #include -#include -#include +#include namespace ripple { int charUnHex(unsigned char c) { - struct HexTab - { - int hex[256]; + static constexpr std::array const xtab = []() { + std::array t{}; - HexTab() - { - std::fill(std::begin(hex), std::end(hex), -1); - for (int i = 0; i < 10; ++i) - hex['0' + i] = i; - for (int i = 0; i < 6; ++i) - { - hex['A' + i] = 10 + i; - hex['a' + i] = 10 + i; - } - } - int - operator[](unsigned char c) const - { - return hex[c]; - } - }; + for (auto& x : t) + x = -1; - static HexTab xtab; + for (int i = 0; i < 10; ++i) + t['0' + i] = i; + + for (int i = 0; i < 6; ++i) + { + t['A' + i] = 10 + i; + t['a' + i] = 10 + i; + } + + return t; + }(); return xtab[c]; } diff --git a/src/ripple/basics/strHex.h b/src/ripple/basics/strHex.h index f3618a359d..e48ea92155 100644 --- a/src/ripple/basics/strHex.h +++ b/src/ripple/basics/strHex.h @@ -17,36 +17,14 @@ */ //============================================================================== -// Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying -// file license.txt or http://www.opensource.org/licenses/mit-license.php. - #ifndef RIPPLE_BASICS_STRHEX_H_INCLUDED #define RIPPLE_BASICS_STRHEX_H_INCLUDED -#include -#include - #include #include namespace ripple { -/** Converts an integer to the corresponding hex digit - @param iDigit 0-15 inclusive - @return a character from '0'-'9' or 'A'-'F'. -*/ -inline char -charHex(unsigned int digit) -{ - static char const xtab[] = "0123456789ABCDEF"; - - assert(digit < 16); - - return xtab[digit]; -} - /** @{ */ /** Converts a hex digit to the corresponding integer @param cDigit one of '0'-'9', 'A'-'F' or 'a'-'f' @@ -84,15 +62,6 @@ strHex(T const& from) return strHex(from.begin(), from.end()); } -inline std::string -strHex(const std::uint64_t uiHost) -{ - uint64_t uBig = boost::endian::native_to_big(uiHost); - - auto const begin = (unsigned char*)&uBig; - auto const end = begin + sizeof(uBig); - return strHex(begin, end); -} } // namespace ripple #endif diff --git a/src/ripple/beast/asio/io_latency_probe.h b/src/ripple/beast/asio/io_latency_probe.h index b18fb823e3..bbde13af68 100644 --- a/src/ripple/beast/asio/io_latency_probe.h +++ b/src/ripple/beast/asio/io_latency_probe.h @@ -22,7 +22,6 @@ #include #include -#include #include #include #include @@ -137,12 +136,7 @@ private: } if (wait) -#ifdef BOOST_NO_CXX11_LAMBDAS - while (m_count != 0) - m_cond.wait(lock); -#else m_cond.wait(lock, [this] { return this->m_count == 0; }); -#endif } void diff --git a/src/ripple/beast/crypto/detail/mac_facade.h b/src/ripple/beast/crypto/detail/mac_facade.h deleted file mode 100644 index f58c2fa234..0000000000 --- a/src/ripple/beast/crypto/detail/mac_facade.h +++ /dev/null @@ -1,82 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#ifndef BEAST_CRYPTO_MAC_FACADE_H_INCLUDED -#define BEAST_CRYPTO_MAC_FACADE_H_INCLUDED - -#include -#include -#include -#include - -namespace beast { -namespace detail { - -// Message Authentication Code (MAC) facade -template -class mac_facade -{ -private: - Context ctx_; - -public: - static beast::endian const endian = beast::endian::native; - - static std::size_t const digest_size = Context::digest_size; - - using result_type = std::array; - - mac_facade() noexcept - { - init(ctx_); - } - - ~mac_facade() - { - erase(std::integral_constant{}); - } - - void - operator()(void const* data, std::size_t size) noexcept - { - update(ctx_, data, size); - } - - explicit operator result_type() noexcept - { - result_type digest; - finish(ctx_, &digest[0]); - return digest; - } - -private: - inline void erase(std::false_type) noexcept - { - } - - inline void erase(std::true_type) noexcept - { - secure_erase(&ctx_, sizeof(ctx_)); - } -}; - -} // namespace detail -} // namespace beast - -#endif diff --git a/src/ripple/beast/crypto/detail/ripemd_context.h b/src/ripple/beast/crypto/detail/ripemd_context.h deleted file mode 100644 index 8eb7a573dd..0000000000 --- a/src/ripple/beast/crypto/detail/ripemd_context.h +++ /dev/null @@ -1,449 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#ifndef BEAST_CRYPTO_RIPEMD_CONTEXT_H_INCLUDED -#define BEAST_CRYPTO_RIPEMD_CONTEXT_H_INCLUDED - -#include -#include -#include - -namespace beast { -namespace detail { - -// Based on -// https://code.google.com/p/blockchain/source/browse/trunk/RIPEMD160.cpp -/* - Copyright (c) Katholieke Universiteit Leuven - 1996 All Rights Reserved - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. -*/ -// This implementation has been modified from the -// original. It has been updated for C++11. - -struct ripemd160_context -{ - explicit ripemd160_context() = default; - - static unsigned int const block_size = 64; - static unsigned int const digest_size = 20; - - unsigned int tot_len; - unsigned int len; - unsigned char block[256]; - std::uint32_t h[5]; -}; - -// ROL(x, n) cyclically rotates x over n bits to the left -// x must be of an unsigned 32 bits type and 0 <= n < 32. -#define BEAST_RIPEMD_ROL(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) - -// the five basic functions F(), G() and H() -#define BEAST_RIPEMD_F(x, y, z) ((x) ^ (y) ^ (z)) -#define BEAST_RIPEMD_G(x, y, z) (((x) & (y)) | (~(x) & (z))) -#define BEAST_RIPEMD_H(x, y, z) (((x) | ~(y)) ^ (z)) -#define BEAST_RIPEMD_I(x, y, z) (((x) & (z)) | ((y) & ~(z))) -#define BEAST_RIPEMD_J(x, y, z) ((x) ^ ((y) | ~(z))) - -// the ten basic operations FF() through III() -#define BEAST_RIPEMD_FF(a, b, c, d, e, x, s) \ - { \ - (a) += BEAST_RIPEMD_F((b), (c), (d)) + (x); \ - (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \ - (c) = BEAST_RIPEMD_ROL((c), 10); \ - } -#define BEAST_RIPEMD_GG(a, b, c, d, e, x, s) \ - { \ - (a) += BEAST_RIPEMD_G((b), (c), (d)) + (x) + 0x5a827999UL; \ - (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \ - (c) = BEAST_RIPEMD_ROL((c), 10); \ - } -#define BEAST_RIPEMD_HH(a, b, c, d, e, x, s) \ - { \ - (a) += BEAST_RIPEMD_H((b), (c), (d)) + (x) + 0x6ed9eba1UL; \ - (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \ - (c) = BEAST_RIPEMD_ROL((c), 10); \ - } -#define BEAST_RIPEMD_II(a, b, c, d, e, x, s) \ - { \ - (a) += BEAST_RIPEMD_I((b), (c), (d)) + (x) + 0x8f1bbcdcUL; \ - (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \ - (c) = BEAST_RIPEMD_ROL((c), 10); \ - } -#define BEAST_RIPEMD_JJ(a, b, c, d, e, x, s) \ - { \ - (a) += BEAST_RIPEMD_J((b), (c), (d)) + (x) + 0xa953fd4eUL; \ - (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \ - (c) = BEAST_RIPEMD_ROL((c), 10); \ - } -#define BEAST_RIPEMD_FFF(a, b, c, d, e, x, s) \ - { \ - (a) += BEAST_RIPEMD_F((b), (c), (d)) + (x); \ - (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \ - (c) = BEAST_RIPEMD_ROL((c), 10); \ - } -#define BEAST_RIPEMD_GGG(a, b, c, d, e, x, s) \ - { \ - (a) += BEAST_RIPEMD_G((b), (c), (d)) + (x) + 0x7a6d76e9UL; \ - (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \ - (c) = BEAST_RIPEMD_ROL((c), 10); \ - } -#define BEAST_RIPEMD_HHH(a, b, c, d, e, x, s) \ - { \ - (a) += BEAST_RIPEMD_H((b), (c), (d)) + (x) + 0x6d703ef3UL; \ - (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \ - (c) = BEAST_RIPEMD_ROL((c), 10); \ - } -#define BEAST_RIPEMD_III(a, b, c, d, e, x, s) \ - { \ - (a) += BEAST_RIPEMD_I((b), (c), (d)) + (x) + 0x5c4dd124UL; \ - (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \ - (c) = BEAST_RIPEMD_ROL((c), 10); \ - } -#define BEAST_RIPEMD_JJJ(a, b, c, d, e, x, s) \ - { \ - (a) += BEAST_RIPEMD_J((b), (c), (d)) + (x) + 0x50a28be6UL; \ - (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \ - (c) = BEAST_RIPEMD_ROL((c), 10); \ - } - -template -void -ripemd_load(std::array& X, unsigned char const* p) -{ - for (int i = 0; i < 16; ++i) - { - X[i] = ((std::uint32_t) * ((p) + 3) << 24) | - ((std::uint32_t) * ((p) + 2) << 16) | - ((std::uint32_t) * ((p) + 1) << 8) | ((std::uint32_t) * (p)); - p += 4; - } -} - -template -void -ripemd_compress( - ripemd160_context& ctx, - std::array& X) noexcept -{ - std::uint32_t aa = ctx.h[0]; - std::uint32_t bb = ctx.h[1]; - std::uint32_t cc = ctx.h[2]; - std::uint32_t dd = ctx.h[3]; - std::uint32_t ee = ctx.h[4]; - std::uint32_t aaa = ctx.h[0]; - std::uint32_t bbb = ctx.h[1]; - std::uint32_t ccc = ctx.h[2]; - std::uint32_t ddd = ctx.h[3]; - std::uint32_t eee = ctx.h[4]; - - // round 1 - BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[0], 11); - BEAST_RIPEMD_FF(ee, aa, bb, cc, dd, X[1], 14); - BEAST_RIPEMD_FF(dd, ee, aa, bb, cc, X[2], 15); - BEAST_RIPEMD_FF(cc, dd, ee, aa, bb, X[3], 12); - BEAST_RIPEMD_FF(bb, cc, dd, ee, aa, X[4], 5); - BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[5], 8); - BEAST_RIPEMD_FF(ee, aa, bb, cc, dd, X[6], 7); - BEAST_RIPEMD_FF(dd, ee, aa, bb, cc, X[7], 9); - BEAST_RIPEMD_FF(cc, dd, ee, aa, bb, X[8], 11); - BEAST_RIPEMD_FF(bb, cc, dd, ee, aa, X[9], 13); - BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[10], 14); - BEAST_RIPEMD_FF(ee, aa, bb, cc, dd, X[11], 15); - BEAST_RIPEMD_FF(dd, ee, aa, bb, cc, X[12], 6); - BEAST_RIPEMD_FF(cc, dd, ee, aa, bb, X[13], 7); - BEAST_RIPEMD_FF(bb, cc, dd, ee, aa, X[14], 9); - BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[15], 8); - - // round 2 - BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[7], 7); - BEAST_RIPEMD_GG(dd, ee, aa, bb, cc, X[4], 6); - BEAST_RIPEMD_GG(cc, dd, ee, aa, bb, X[13], 8); - BEAST_RIPEMD_GG(bb, cc, dd, ee, aa, X[1], 13); - BEAST_RIPEMD_GG(aa, bb, cc, dd, ee, X[10], 11); - BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[6], 9); - BEAST_RIPEMD_GG(dd, ee, aa, bb, cc, X[15], 7); - BEAST_RIPEMD_GG(cc, dd, ee, aa, bb, X[3], 15); - BEAST_RIPEMD_GG(bb, cc, dd, ee, aa, X[12], 7); - BEAST_RIPEMD_GG(aa, bb, cc, dd, ee, X[0], 12); - BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[9], 15); - BEAST_RIPEMD_GG(dd, ee, aa, bb, cc, X[5], 9); - BEAST_RIPEMD_GG(cc, dd, ee, aa, bb, X[2], 11); - BEAST_RIPEMD_GG(bb, cc, dd, ee, aa, X[14], 7); - BEAST_RIPEMD_GG(aa, bb, cc, dd, ee, X[11], 13); - BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[8], 12); - - // round 3 - BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[3], 11); - BEAST_RIPEMD_HH(cc, dd, ee, aa, bb, X[10], 13); - BEAST_RIPEMD_HH(bb, cc, dd, ee, aa, X[14], 6); - BEAST_RIPEMD_HH(aa, bb, cc, dd, ee, X[4], 7); - BEAST_RIPEMD_HH(ee, aa, bb, cc, dd, X[9], 14); - BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[15], 9); - BEAST_RIPEMD_HH(cc, dd, ee, aa, bb, X[8], 13); - BEAST_RIPEMD_HH(bb, cc, dd, ee, aa, X[1], 15); - BEAST_RIPEMD_HH(aa, bb, cc, dd, ee, X[2], 14); - BEAST_RIPEMD_HH(ee, aa, bb, cc, dd, X[7], 8); - BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[0], 13); - BEAST_RIPEMD_HH(cc, dd, ee, aa, bb, X[6], 6); - BEAST_RIPEMD_HH(bb, cc, dd, ee, aa, X[13], 5); - BEAST_RIPEMD_HH(aa, bb, cc, dd, ee, X[11], 12); - BEAST_RIPEMD_HH(ee, aa, bb, cc, dd, X[5], 7); - BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[12], 5); - - // round 4 - BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[1], 11); - BEAST_RIPEMD_II(bb, cc, dd, ee, aa, X[9], 12); - BEAST_RIPEMD_II(aa, bb, cc, dd, ee, X[11], 14); - BEAST_RIPEMD_II(ee, aa, bb, cc, dd, X[10], 15); - BEAST_RIPEMD_II(dd, ee, aa, bb, cc, X[0], 14); - BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[8], 15); - BEAST_RIPEMD_II(bb, cc, dd, ee, aa, X[12], 9); - BEAST_RIPEMD_II(aa, bb, cc, dd, ee, X[4], 8); - BEAST_RIPEMD_II(ee, aa, bb, cc, dd, X[13], 9); - BEAST_RIPEMD_II(dd, ee, aa, bb, cc, X[3], 14); - BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[7], 5); - BEAST_RIPEMD_II(bb, cc, dd, ee, aa, X[15], 6); - BEAST_RIPEMD_II(aa, bb, cc, dd, ee, X[14], 8); - BEAST_RIPEMD_II(ee, aa, bb, cc, dd, X[5], 6); - BEAST_RIPEMD_II(dd, ee, aa, bb, cc, X[6], 5); - BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[2], 12); - - // round 5 - BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[4], 9); - BEAST_RIPEMD_JJ(aa, bb, cc, dd, ee, X[0], 15); - BEAST_RIPEMD_JJ(ee, aa, bb, cc, dd, X[5], 5); - BEAST_RIPEMD_JJ(dd, ee, aa, bb, cc, X[9], 11); - BEAST_RIPEMD_JJ(cc, dd, ee, aa, bb, X[7], 6); - BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[12], 8); - BEAST_RIPEMD_JJ(aa, bb, cc, dd, ee, X[2], 13); - BEAST_RIPEMD_JJ(ee, aa, bb, cc, dd, X[10], 12); - BEAST_RIPEMD_JJ(dd, ee, aa, bb, cc, X[14], 5); - BEAST_RIPEMD_JJ(cc, dd, ee, aa, bb, X[1], 12); - BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[3], 13); - BEAST_RIPEMD_JJ(aa, bb, cc, dd, ee, X[8], 14); - BEAST_RIPEMD_JJ(ee, aa, bb, cc, dd, X[11], 11); - BEAST_RIPEMD_JJ(dd, ee, aa, bb, cc, X[6], 8); - BEAST_RIPEMD_JJ(cc, dd, ee, aa, bb, X[15], 5); - BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[13], 6); - - // parallel round 1 - BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[5], 8); - BEAST_RIPEMD_JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9); - BEAST_RIPEMD_JJJ(ddd, eee, aaa, bbb, ccc, X[7], 9); - BEAST_RIPEMD_JJJ(ccc, ddd, eee, aaa, bbb, X[0], 11); - BEAST_RIPEMD_JJJ(bbb, ccc, ddd, eee, aaa, X[9], 13); - BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[2], 15); - BEAST_RIPEMD_JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15); - BEAST_RIPEMD_JJJ(ddd, eee, aaa, bbb, ccc, X[4], 5); - BEAST_RIPEMD_JJJ(ccc, ddd, eee, aaa, bbb, X[13], 7); - BEAST_RIPEMD_JJJ(bbb, ccc, ddd, eee, aaa, X[6], 7); - BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[15], 8); - BEAST_RIPEMD_JJJ(eee, aaa, bbb, ccc, ddd, X[8], 11); - BEAST_RIPEMD_JJJ(ddd, eee, aaa, bbb, ccc, X[1], 14); - BEAST_RIPEMD_JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14); - BEAST_RIPEMD_JJJ(bbb, ccc, ddd, eee, aaa, X[3], 12); - BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6); - - // parallel round 2 - BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[6], 9); - BEAST_RIPEMD_III(ddd, eee, aaa, bbb, ccc, X[11], 13); - BEAST_RIPEMD_III(ccc, ddd, eee, aaa, bbb, X[3], 15); - BEAST_RIPEMD_III(bbb, ccc, ddd, eee, aaa, X[7], 7); - BEAST_RIPEMD_III(aaa, bbb, ccc, ddd, eee, X[0], 12); - BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[13], 8); - BEAST_RIPEMD_III(ddd, eee, aaa, bbb, ccc, X[5], 9); - BEAST_RIPEMD_III(ccc, ddd, eee, aaa, bbb, X[10], 11); - BEAST_RIPEMD_III(bbb, ccc, ddd, eee, aaa, X[14], 7); - BEAST_RIPEMD_III(aaa, bbb, ccc, ddd, eee, X[15], 7); - BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[8], 12); - BEAST_RIPEMD_III(ddd, eee, aaa, bbb, ccc, X[12], 7); - BEAST_RIPEMD_III(ccc, ddd, eee, aaa, bbb, X[4], 6); - BEAST_RIPEMD_III(bbb, ccc, ddd, eee, aaa, X[9], 15); - BEAST_RIPEMD_III(aaa, bbb, ccc, ddd, eee, X[1], 13); - BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[2], 11); - - // parallel round 3 - BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[15], 9); - BEAST_RIPEMD_HHH(ccc, ddd, eee, aaa, bbb, X[5], 7); - BEAST_RIPEMD_HHH(bbb, ccc, ddd, eee, aaa, X[1], 15); - BEAST_RIPEMD_HHH(aaa, bbb, ccc, ddd, eee, X[3], 11); - BEAST_RIPEMD_HHH(eee, aaa, bbb, ccc, ddd, X[7], 8); - BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[14], 6); - BEAST_RIPEMD_HHH(ccc, ddd, eee, aaa, bbb, X[6], 6); - BEAST_RIPEMD_HHH(bbb, ccc, ddd, eee, aaa, X[9], 14); - BEAST_RIPEMD_HHH(aaa, bbb, ccc, ddd, eee, X[11], 12); - BEAST_RIPEMD_HHH(eee, aaa, bbb, ccc, ddd, X[8], 13); - BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[12], 5); - BEAST_RIPEMD_HHH(ccc, ddd, eee, aaa, bbb, X[2], 14); - BEAST_RIPEMD_HHH(bbb, ccc, ddd, eee, aaa, X[10], 13); - BEAST_RIPEMD_HHH(aaa, bbb, ccc, ddd, eee, X[0], 13); - BEAST_RIPEMD_HHH(eee, aaa, bbb, ccc, ddd, X[4], 7); - BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[13], 5); - - // parallel round 4 - BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[8], 15); - BEAST_RIPEMD_GGG(bbb, ccc, ddd, eee, aaa, X[6], 5); - BEAST_RIPEMD_GGG(aaa, bbb, ccc, ddd, eee, X[4], 8); - BEAST_RIPEMD_GGG(eee, aaa, bbb, ccc, ddd, X[1], 11); - BEAST_RIPEMD_GGG(ddd, eee, aaa, bbb, ccc, X[3], 14); - BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[11], 14); - BEAST_RIPEMD_GGG(bbb, ccc, ddd, eee, aaa, X[15], 6); - BEAST_RIPEMD_GGG(aaa, bbb, ccc, ddd, eee, X[0], 14); - BEAST_RIPEMD_GGG(eee, aaa, bbb, ccc, ddd, X[5], 6); - BEAST_RIPEMD_GGG(ddd, eee, aaa, bbb, ccc, X[12], 9); - BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[2], 12); - BEAST_RIPEMD_GGG(bbb, ccc, ddd, eee, aaa, X[13], 9); - BEAST_RIPEMD_GGG(aaa, bbb, ccc, ddd, eee, X[9], 12); - BEAST_RIPEMD_GGG(eee, aaa, bbb, ccc, ddd, X[7], 5); - BEAST_RIPEMD_GGG(ddd, eee, aaa, bbb, ccc, X[10], 15); - BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[14], 8); - - // parallel round 5 - BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[12], 8); - BEAST_RIPEMD_FFF(aaa, bbb, ccc, ddd, eee, X[15], 5); - BEAST_RIPEMD_FFF(eee, aaa, bbb, ccc, ddd, X[10], 12); - BEAST_RIPEMD_FFF(ddd, eee, aaa, bbb, ccc, X[4], 9); - BEAST_RIPEMD_FFF(ccc, ddd, eee, aaa, bbb, X[1], 12); - BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[5], 5); - BEAST_RIPEMD_FFF(aaa, bbb, ccc, ddd, eee, X[8], 14); - BEAST_RIPEMD_FFF(eee, aaa, bbb, ccc, ddd, X[7], 6); - BEAST_RIPEMD_FFF(ddd, eee, aaa, bbb, ccc, X[6], 8); - BEAST_RIPEMD_FFF(ccc, ddd, eee, aaa, bbb, X[2], 13); - BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[13], 6); - BEAST_RIPEMD_FFF(aaa, bbb, ccc, ddd, eee, X[14], 5); - BEAST_RIPEMD_FFF(eee, aaa, bbb, ccc, ddd, X[0], 15); - BEAST_RIPEMD_FFF(ddd, eee, aaa, bbb, ccc, X[3], 13); - BEAST_RIPEMD_FFF(ccc, ddd, eee, aaa, bbb, X[9], 11); - BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[11], 11); - - // combine results - ddd += cc + ctx.h[1]; // final result for h[0] - ctx.h[1] = ctx.h[2] + dd + eee; - ctx.h[2] = ctx.h[3] + ee + aaa; - ctx.h[3] = ctx.h[4] + aa + bbb; - ctx.h[4] = ctx.h[0] + bb + ccc; - ctx.h[0] = ddd; -} - -template -void -init(ripemd160_context& ctx) noexcept -{ - ctx.len = 0; - ctx.tot_len = 0; - ctx.h[0] = 0x67452301UL; - ctx.h[1] = 0xefcdab89UL; - ctx.h[2] = 0x98badcfeUL; - ctx.h[3] = 0x10325476UL; - ctx.h[4] = 0xc3d2e1f0UL; -} - -template -void -update(ripemd160_context& ctx, void const* message, std::size_t size) noexcept -{ - auto const pm = reinterpret_cast(message); - unsigned int block_nb; - unsigned int new_len, rem_len, tmp_len; - const unsigned char* shifted_message; - tmp_len = ripemd160_context::block_size - ctx.len; - rem_len = size < tmp_len ? size : tmp_len; - std::memcpy(&ctx.block[ctx.len], pm, rem_len); - if (ctx.len + size < ripemd160_context::block_size) - { - ctx.len += size; - return; - } - new_len = size - rem_len; - block_nb = new_len / ripemd160_context::block_size; - shifted_message = pm + rem_len; - std::array X; - ripemd_load(X, ctx.block); - ripemd_compress(ctx, X); - for (int i = 0; i < block_nb; ++i) - { - ripemd_load(X, shifted_message + i * ripemd160_context::block_size); - ripemd_compress(ctx, X); - } - rem_len = new_len % ripemd160_context::block_size; - std::memcpy( - ctx.block, - &shifted_message[block_nb * ripemd160_context::block_size], - rem_len); - ctx.len = rem_len; - ctx.tot_len += (block_nb + 1) * ripemd160_context::block_size; -} - -template -void -finish(ripemd160_context& ctx, void* digest) noexcept -{ - std::array X; - X.fill(0); - // put leftovers into X - auto p = &ctx.block[0]; - // uint8_t i goes into word X[i div 4] at pos. 8*(i mod 4) - for (int i = 0; i < ctx.len; ++i) - X[i >> 2] ^= (std::uint32_t)*p++ << (8 * (i & 3)); - ctx.tot_len += ctx.len; - // append the bit m_n == 1 - X[(ctx.tot_len >> 2) & 15] ^= (uint32_t)1 << (8 * (ctx.tot_len & 3) + 7); - // length goes to next block? - if ((ctx.tot_len & 63) > 55) - { - ripemd_compress(ctx, X); - X.fill(0); - } - // append length in bits*/ - X[14] = ctx.tot_len << 3; - X[15] = (ctx.tot_len >> 29) | (0 << 3); - ripemd_compress(ctx, X); - - std::uint8_t* pd = reinterpret_cast(digest); - for (std::uint32_t i = 0; i < 20; i += 4) - { - pd[i] = (std::uint8_t)(ctx.h[i >> 2]); // implicit cast to uint8_t - pd[i + 1] = (std::uint8_t)(ctx.h[i >> 2] >> 8); // extracts the 8 least - pd[i + 2] = (std::uint8_t)(ctx.h[i >> 2] >> 16); // significant bits. - pd[i + 3] = (std::uint8_t)(ctx.h[i >> 2] >> 24); - } -} - -} // namespace detail -} // namespace beast - -#endif diff --git a/src/ripple/beast/crypto/detail/sha2_context.h b/src/ripple/beast/crypto/detail/sha2_context.h deleted file mode 100644 index 6fc8018fc6..0000000000 --- a/src/ripple/beast/crypto/detail/sha2_context.h +++ /dev/null @@ -1,419 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#ifndef BEAST_CRYPTO_SHA512_CONTEXT_H_INCLUDED -#define BEAST_CRYPTO_SHA512_CONTEXT_H_INCLUDED - -#include -#include - -namespace beast { -namespace detail { - -// Based on https://github.com/ogay/sha2 -// This implementation has been modified from the -// original. It has been updated for C++11. - -/* - * Updated to C++, zedwood.com 2012 - * Based on Olivier Gay's version - * See Modified BSD License below: - * - * FIPS 180-2 SHA-224/256/384/512 implementation - * Issue date: 04/30/2005 - * http://www.ouah.org/ogay/sha2/ - * - * Copyright (C) 2005, 2007 Olivier Gay - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 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. - */ - -struct sha256_context -{ - explicit sha256_context() = default; - - static unsigned int const block_size = 64; - static unsigned int const digest_size = 32; - - unsigned int tot_len; - unsigned int len; - unsigned char block[2 * block_size]; - std::uint32_t h[8]; -}; - -struct sha512_context -{ - explicit sha512_context() = default; - - static unsigned int const block_size = 128; - static unsigned int const digest_size = 64; - - unsigned int tot_len; - unsigned int len; - unsigned char block[2 * block_size]; - std::uint64_t h[8]; -}; - -#define BEAST_SHA2_SHFR(x, n) (x >> n) -#define BEAST_SHA2_ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) -#define BEAST_SHA2_ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n))) -#define BEAST_SHA2_CH(x, y, z) ((x & y) ^ (~x & z)) -#define BEAST_SHA2_MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) -#define BEAST_SHA256_F1(x) \ - (BEAST_SHA2_ROTR(x, 2) ^ BEAST_SHA2_ROTR(x, 13) ^ BEAST_SHA2_ROTR(x, 22)) -#define BEAST_SHA256_F2(x) \ - (BEAST_SHA2_ROTR(x, 6) ^ BEAST_SHA2_ROTR(x, 11) ^ BEAST_SHA2_ROTR(x, 25)) -#define BEAST_SHA256_F3(x) \ - (BEAST_SHA2_ROTR(x, 7) ^ BEAST_SHA2_ROTR(x, 18) ^ BEAST_SHA2_SHFR(x, 3)) -#define BEAST_SHA256_F4(x) \ - (BEAST_SHA2_ROTR(x, 17) ^ BEAST_SHA2_ROTR(x, 19) ^ BEAST_SHA2_SHFR(x, 10)) -#define BEAST_SHA512_F1(x) \ - (BEAST_SHA2_ROTR(x, 28) ^ BEAST_SHA2_ROTR(x, 34) ^ BEAST_SHA2_ROTR(x, 39)) -#define BEAST_SHA512_F2(x) \ - (BEAST_SHA2_ROTR(x, 14) ^ BEAST_SHA2_ROTR(x, 18) ^ BEAST_SHA2_ROTR(x, 41)) -#define BEAST_SHA512_F3(x) \ - (BEAST_SHA2_ROTR(x, 1) ^ BEAST_SHA2_ROTR(x, 8) ^ BEAST_SHA2_SHFR(x, 7)) -#define BEAST_SHA512_F4(x) \ - (BEAST_SHA2_ROTR(x, 19) ^ BEAST_SHA2_ROTR(x, 61) ^ BEAST_SHA2_SHFR(x, 6)) -#define BEAST_SHA2_PACK32(str, x) \ - { \ - *(x) = ((std::uint32_t) * ((str) + 3)) | \ - ((std::uint32_t) * ((str) + 2) << 8) | \ - ((std::uint32_t) * ((str) + 1) << 16) | \ - ((std::uint32_t) * ((str) + 0) << 24); \ - } -#define BEAST_SHA2_UNPACK32(x, str) \ - { \ - *((str) + 3) = (std::uint8_t)((x)); \ - *((str) + 2) = (std::uint8_t)((x) >> 8); \ - *((str) + 1) = (std::uint8_t)((x) >> 16); \ - *((str) + 0) = (std::uint8_t)((x) >> 24); \ - } -#define BEAST_SHA2_PACK64(str, x) \ - { \ - *(x) = ((std::uint64_t) * ((str) + 7)) | \ - ((std::uint64_t) * ((str) + 6) << 8) | \ - ((std::uint64_t) * ((str) + 5) << 16) | \ - ((std::uint64_t) * ((str) + 4) << 24) | \ - ((std::uint64_t) * ((str) + 3) << 32) | \ - ((std::uint64_t) * ((str) + 2) << 40) | \ - ((std::uint64_t) * ((str) + 1) << 48) | \ - ((std::uint64_t) * ((str) + 0) << 56); \ - } -#define BEAST_SHA2_UNPACK64(x, str) \ - { \ - *((str) + 7) = (std::uint8_t)((x)); \ - *((str) + 6) = (std::uint8_t)((x) >> 8); \ - *((str) + 5) = (std::uint8_t)((x) >> 16); \ - *((str) + 4) = (std::uint8_t)((x) >> 24); \ - *((str) + 3) = (std::uint8_t)((x) >> 32); \ - *((str) + 2) = (std::uint8_t)((x) >> 40); \ - *((str) + 1) = (std::uint8_t)((x) >> 48); \ - *((str) + 0) = (std::uint8_t)((x) >> 56); \ - } - -//------------------------------------------------------------------------------ - -// SHA256 - -template -void -sha256_transform( - sha256_context& ctx, - unsigned char const* message, - unsigned int block_nb) noexcept -{ - static unsigned long long const K[64] = { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, - 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, - 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, - 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, - 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, - 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2}; - std::uint32_t w[64]; - std::uint32_t wv[8]; - std::uint32_t t1, t2; - unsigned char const* sub_block; - int i, j; - for (i = 0; i < (int)block_nb; i++) - { - sub_block = message + (i << 6); - for (j = 0; j < 16; j++) - BEAST_SHA2_PACK32(&sub_block[j << 2], &w[j]); - for (j = 16; j < 64; j++) - w[j] = BEAST_SHA256_F4(w[j - 2]) + w[j - 7] + - BEAST_SHA256_F3(w[j - 15]) + w[j - 16]; - for (j = 0; j < 8; j++) - wv[j] = ctx.h[j]; - for (j = 0; j < 64; j++) - { - t1 = wv[7] + BEAST_SHA256_F2(wv[4]) + - BEAST_SHA2_CH(wv[4], wv[5], wv[6]) + K[j] + w[j]; - t2 = BEAST_SHA256_F1(wv[0]) + BEAST_SHA2_MAJ(wv[0], wv[1], wv[2]); - wv[7] = wv[6]; - wv[6] = wv[5]; - wv[5] = wv[4]; - wv[4] = wv[3] + t1; - wv[3] = wv[2]; - wv[2] = wv[1]; - wv[1] = wv[0]; - wv[0] = t1 + t2; - } - for (j = 0; j < 8; j++) - ctx.h[j] += wv[j]; - } -} - -template -void -init(sha256_context& ctx) noexcept -{ - ctx.len = 0; - ctx.tot_len = 0; - ctx.h[0] = 0x6a09e667; - ctx.h[1] = 0xbb67ae85; - ctx.h[2] = 0x3c6ef372; - ctx.h[3] = 0xa54ff53a; - ctx.h[4] = 0x510e527f; - ctx.h[5] = 0x9b05688c; - ctx.h[6] = 0x1f83d9ab; - ctx.h[7] = 0x5be0cd19; -} - -template -void -update(sha256_context& ctx, void const* message, std::size_t size) noexcept -{ - auto const pm = reinterpret_cast(message); - unsigned int block_nb; - unsigned int new_len, rem_len, tmp_len; - const unsigned char* shifted_message; - tmp_len = sha256_context::block_size - ctx.len; - rem_len = size < tmp_len ? size : tmp_len; - std::memcpy(&ctx.block[ctx.len], pm, rem_len); - if (ctx.len + size < sha256_context::block_size) - { - ctx.len += size; - return; - } - new_len = size - rem_len; - block_nb = new_len / sha256_context::block_size; - shifted_message = pm + rem_len; - sha256_transform(ctx, ctx.block, 1); - sha256_transform(ctx, shifted_message, block_nb); - rem_len = new_len % sha256_context::block_size; - std::memcpy(ctx.block, &shifted_message[block_nb << 6], rem_len); - ctx.len = rem_len; - ctx.tot_len += (block_nb + 1) << 6; -} - -template -void -finish(sha256_context& ctx, void* digest) noexcept -{ - auto const pd = reinterpret_cast(digest); - unsigned int block_nb; - unsigned int pm_len; - unsigned int len_b; - int i; - block_nb = - (1 + - ((sha256_context::block_size - 9) < - (ctx.len % sha256_context::block_size))); - len_b = (ctx.tot_len + ctx.len) << 3; - pm_len = block_nb << 6; - std::memset(ctx.block + ctx.len, 0, pm_len - ctx.len); - ctx.block[ctx.len] = 0x80; - BEAST_SHA2_UNPACK32(len_b, ctx.block + pm_len - 4); - sha256_transform(ctx, ctx.block, block_nb); - for (i = 0; i < 8; i++) - BEAST_SHA2_UNPACK32(ctx.h[i], &pd[i << 2]); -} - -//------------------------------------------------------------------------------ - -// SHA512 - -template -void -sha512_transform( - sha512_context& ctx, - unsigned char const* message, - unsigned int block_nb) noexcept -{ - static unsigned long long const K[80] = { - 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, - 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, - 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0xd807aa98a3030242ULL, - 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, - 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, - 0xc19bf174cf692694ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, - 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL, - 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, - 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, - 0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, - 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x27b70a8546d22ffcULL, - 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, - 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, - 0x92722c851482353bULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, - 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL, - 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, - 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, - 0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, - 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x748f82ee5defb2fcULL, - 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, - 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, - 0xc67178f2e372532bULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, - 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL, - 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, - 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, - 0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, - 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL}; - - std::uint64_t w[80]; - std::uint64_t wv[8]; - std::uint64_t t1, t2; - unsigned char const* sub_block; - int i, j; - for (i = 0; i < (int)block_nb; i++) - { - sub_block = message + (i << 7); - for (j = 0; j < 16; j++) - BEAST_SHA2_PACK64(&sub_block[j << 3], &w[j]); - for (j = 16; j < 80; j++) - w[j] = BEAST_SHA512_F4(w[j - 2]) + w[j - 7] + - BEAST_SHA512_F3(w[j - 15]) + w[j - 16]; - for (j = 0; j < 8; j++) - wv[j] = ctx.h[j]; - for (j = 0; j < 80; j++) - { - t1 = wv[7] + BEAST_SHA512_F2(wv[4]) + - BEAST_SHA2_CH(wv[4], wv[5], wv[6]) + K[j] + w[j]; - t2 = BEAST_SHA512_F1(wv[0]) + BEAST_SHA2_MAJ(wv[0], wv[1], wv[2]); - wv[7] = wv[6]; - wv[6] = wv[5]; - wv[5] = wv[4]; - wv[4] = wv[3] + t1; - wv[3] = wv[2]; - wv[2] = wv[1]; - wv[1] = wv[0]; - wv[0] = t1 + t2; - } - for (j = 0; j < 8; j++) - ctx.h[j] += wv[j]; - } -} - -template -void -init(sha512_context& ctx) noexcept -{ - ctx.len = 0; - ctx.tot_len = 0; - ctx.h[0] = 0x6a09e667f3bcc908ULL; - ctx.h[1] = 0xbb67ae8584caa73bULL; - ctx.h[2] = 0x3c6ef372fe94f82bULL; - ctx.h[3] = 0xa54ff53a5f1d36f1ULL; - ctx.h[4] = 0x510e527fade682d1ULL; - ctx.h[5] = 0x9b05688c2b3e6c1fULL; - ctx.h[6] = 0x1f83d9abfb41bd6bULL; - ctx.h[7] = 0x5be0cd19137e2179ULL; -} - -template -void -update(sha512_context& ctx, void const* message, std::size_t size) noexcept -{ - auto const pm = reinterpret_cast(message); - unsigned int block_nb; - unsigned int new_len, rem_len, tmp_len; - const unsigned char* shifted_message; - tmp_len = sha512_context::block_size - ctx.len; - rem_len = size < tmp_len ? size : tmp_len; - std::memcpy(&ctx.block[ctx.len], pm, rem_len); - if (ctx.len + size < sha512_context::block_size) - { - ctx.len += size; - return; - } - new_len = size - rem_len; - block_nb = new_len / sha512_context::block_size; - shifted_message = pm + rem_len; - sha512_transform(ctx, ctx.block, 1); - sha512_transform(ctx, shifted_message, block_nb); - rem_len = new_len % sha512_context::block_size; - std::memcpy(ctx.block, &shifted_message[block_nb << 7], rem_len); - ctx.len = rem_len; - ctx.tot_len += (block_nb + 1) << 7; -} - -template -void -finish(sha512_context& ctx, void* digest) noexcept -{ - auto const pd = reinterpret_cast(digest); - unsigned int block_nb; - unsigned int pm_len; - unsigned int len_b; - int i; - block_nb = 1 + - ((sha512_context::block_size - 17) < - (ctx.len % sha512_context::block_size)); - len_b = (ctx.tot_len + ctx.len) << 3; - pm_len = block_nb << 7; - std::memset(ctx.block + ctx.len, 0, pm_len - ctx.len); - ctx.block[ctx.len] = 0x80; - BEAST_SHA2_UNPACK32(len_b, ctx.block + pm_len - 4); - sha512_transform(ctx, ctx.block, block_nb); - for (i = 0; i < 8; i++) - BEAST_SHA2_UNPACK64(ctx.h[i], &pd[i << 3]); -} - -} // namespace detail -} // namespace beast - -#endif diff --git a/src/ripple/beast/crypto/ripemd.h b/src/ripple/beast/crypto/ripemd.h deleted file mode 100644 index 3111deee85..0000000000 --- a/src/ripple/beast/crypto/ripemd.h +++ /dev/null @@ -1,35 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#ifndef BEAST_CRYPTO_RIPEMD_H_INCLUDED -#define BEAST_CRYPTO_RIPEMD_H_INCLUDED - -#include -#include - -namespace beast { - -using ripemd160_hasher = detail::mac_facade; - -// secure version -using ripemd160_hasher_s = detail::mac_facade; - -} // namespace beast - -#endif diff --git a/src/ripple/beast/crypto/sha2.h b/src/ripple/beast/crypto/sha2.h deleted file mode 100644 index c7cd187a51..0000000000 --- a/src/ripple/beast/crypto/sha2.h +++ /dev/null @@ -1,40 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2013, Vinnie Falco - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#ifndef BEAST_CRYPTO_SHA2_H_INCLUDED -#define BEAST_CRYPTO_SHA2_H_INCLUDED - -#include -#include - -namespace beast { - -using sha256_hasher = detail::mac_facade; - -// secure version -using sha256_hasher_s = detail::mac_facade; - -using sha512_hasher = detail::mac_facade; - -// secure version -using sha512_hasher_s = detail::mac_facade; - -} // namespace beast - -#endif diff --git a/src/ripple/beast/hash/endian.h b/src/ripple/beast/hash/endian.h deleted file mode 100644 index cda8f4b0d4..0000000000 --- a/src/ripple/beast/hash/endian.h +++ /dev/null @@ -1,54 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of Beast: https://github.com/vinniefalco/Beast - Copyright 2014, Howard Hinnant , - Vinnie Falco #include #include +#include #include #include #include @@ -77,7 +77,10 @@ inline void maybe_reverse_bytes(T& t, Hasher&) { maybe_reverse_bytes( - t, std::integral_constant{}); + t, + std::integral_constant< + bool, + Hasher::endian != boost::endian::order::native>{}); } } // namespace detail @@ -182,7 +185,8 @@ struct is_contiguously_hashable : public std::integral_constant< bool, is_uniquely_represented::value && - (sizeof(T) == 1 || HashAlgorithm::endian == endian::native)> + (sizeof(T) == 1 || + HashAlgorithm::endian == boost::endian::order::native)> { explicit is_contiguously_hashable() = default; }; @@ -192,7 +196,8 @@ struct is_contiguously_hashable : public std::integral_constant< bool, is_uniquely_represented::value && - (sizeof(T) == 1 || HashAlgorithm::endian == endian::native)> + (sizeof(T) == 1 || + HashAlgorithm::endian == boost::endian::order::native)> { explicit is_contiguously_hashable() = default; }; diff --git a/src/ripple/beast/hash/xxhasher.h b/src/ripple/beast/hash/xxhasher.h index d6f6335ace..512c451a05 100644 --- a/src/ripple/beast/hash/xxhasher.h +++ b/src/ripple/beast/hash/xxhasher.h @@ -20,8 +20,8 @@ #ifndef BEAST_HASH_XXHASHER_H_INCLUDED #define BEAST_HASH_XXHASHER_H_INCLUDED -#include #include +#include #include #include @@ -38,7 +38,7 @@ private: public: using result_type = std::size_t; - static beast::endian const endian = beast::endian::native; + static constexpr auto const endian = boost::endian::order::native; xxhasher() noexcept { diff --git a/src/ripple/beast/rfc2616.h b/src/ripple/beast/rfc2616.h index bb176b944f..deac23550b 100644 --- a/src/ripple/beast/rfc2616.h +++ b/src/ripple/beast/rfc2616.h @@ -29,7 +29,6 @@ #include #include #include -#include // for std::tie, remove ASAP #include #include @@ -38,27 +37,6 @@ namespace rfc2616 { namespace detail { -/* Routines for performing RFC2616 compliance. - RFC2616: - Hypertext Transfer Protocol -- HTTP/1.1 - http://www.w3.org/Protocols/rfc2616/rfc2616 -*/ - -struct ci_equal_pred -{ - explicit ci_equal_pred() = default; - - bool - operator()(char c1, char c2) - { - // VFALCO TODO Use a table lookup here - return std::tolower(static_cast(c1)) == - std::tolower(static_cast(c2)); - } -}; - -} // namespace detail - /** Returns `true` if `c` is linear white space. This excludes the CRLF sequence allowed for line continuations. @@ -86,57 +64,6 @@ is_white(char c) return false; } -/** Returns `true` if `c` is a control character. */ -inline bool -is_control(char c) -{ - return c <= 31 || c >= 127; -} - -/** Returns `true` if `c` is a separator. */ -inline bool -is_separator(char c) -{ - // VFALCO Could use a static table - switch (c) - { - case '(': - case ')': - case '<': - case '>': - case '@': - case ',': - case ';': - case ':': - case '\\': - case '"': - case '{': - case '}': - case ' ': - case '\t': - return true; - }; - return false; -} - -/** Returns `true` if `c` is a character. */ -inline bool -is_char(char c) -{ -#ifdef __CHAR_UNSIGNED__ /* -funsigned-char */ - return c >= 0 && c <= 127; -#else - return c >= 0; -#endif -} - -template -FwdIter -trim_left(FwdIter first, FwdIter last) -{ - return std::find_if_not(first, last, is_white); -} - template FwdIter trim_right(FwdIter first, FwdIter last) @@ -152,34 +79,6 @@ trim_right(FwdIter first, FwdIter last) return first; } -template -void -trim_right_in_place(std::basic_string& s) -{ - s.resize(std::distance(s.begin(), trim_right(s.begin(), s.end()))); -} - -template -std::pair -trim(FwdIter first, FwdIter last) -{ - first = trim_left(first, last); - last = trim_right(first, last); - return std::make_pair(first, last); -} - -template -String -trim(String const& s) -{ - using std::begin; - using std::end; - auto first = begin(s); - auto last = end(s); - std::tie(first, last) = trim(first, last); - return {first, last}; -} - template String trim_right(String const& s) @@ -192,11 +91,7 @@ trim_right(String const& s) return {first, last}; } -inline std::string -trim(std::string const& s) -{ - return trim(s); -} +} // namespace detail /** Parse a character sequence of values separated by commas. Double quotes and escape sequences will be converted. Excess white @@ -214,8 +109,11 @@ template < Result split(FwdIt first, FwdIt last, Char delim) { - Result result; + using namespace detail; using string = typename Result::value_type; + + Result result; + FwdIt iter = first; string e; while (iter != last) @@ -297,179 +195,6 @@ split_commas(boost::beast::string_view const& s) return split_commas(s.begin(), s.end()); } -//------------------------------------------------------------------------------ - -/** Iterates through a comma separated list. - - Meets the requirements of ForwardIterator. - - List defined in rfc2616 2.1. - - @note Values returned may contain backslash escapes. -*/ -class list_iterator -{ - using iter_type = boost::string_ref::const_iterator; - - iter_type it_; - iter_type end_; - boost::string_ref value_; - -public: - using value_type = boost::string_ref; - using pointer = value_type const*; - using reference = value_type const&; - using difference_type = std::ptrdiff_t; - using iterator_category = std::forward_iterator_tag; - - list_iterator(iter_type begin, iter_type end) : it_(begin), end_(end) - { - if (it_ != end_) - increment(); - } - - bool - operator==(list_iterator const& other) const - { - return other.it_ == it_ && other.end_ == end_ && - other.value_.size() == value_.size(); - } - - bool - operator!=(list_iterator const& other) const - { - return !(*this == other); - } - - reference - operator*() const - { - return value_; - } - - pointer - operator->() const - { - return &*(*this); - } - - list_iterator& - operator++() - { - increment(); - return *this; - } - - list_iterator - operator++(int) - { - auto temp = *this; - ++(*this); - return temp; - } - -private: - template - void - increment(); -}; - -template -void -list_iterator::increment() -{ - value_.clear(); - while (it_ != end_) - { - if (*it_ == '"') - { - // quoted-string - ++it_; - if (it_ == end_) - return; - if (*it_ != '"') - { - auto start = it_; - for (;;) - { - ++it_; - if (it_ == end_) - { - value_ = boost::string_ref( - &*start, std::distance(start, it_)); - return; - } - if (*it_ == '"') - { - value_ = boost::string_ref( - &*start, std::distance(start, it_)); - ++it_; - return; - } - } - } - ++it_; - } - else if (*it_ == ',') - { - it_++; - continue; - } - else if (is_lws(*it_)) - { - ++it_; - continue; - } - else - { - auto start = it_; - for (;;) - { - ++it_; - if (it_ == end_ || *it_ == ',' || is_lws(*it_)) - { - value_ = - boost::string_ref(&*start, std::distance(start, it_)); - return; - } - } - } - } -} - -/** Returns true if two strings are equal. - - A case-insensitive comparison is used. -*/ -inline bool -ci_equal(boost::string_ref s1, boost::string_ref s2) -{ - return boost::range::equal(s1, s2, detail::ci_equal_pred{}); -} - -/** Returns a range representing the list. */ -inline boost::iterator_range -make_list(boost::string_ref const& field) -{ - return boost::iterator_range{ - list_iterator{field.begin(), field.end()}, - list_iterator{field.end(), field.end()}}; -} - -/** Returns true if the specified token exists in the list. - - A case-insensitive comparison is used. -*/ -template -bool -token_in_list(boost::string_ref const& value, boost::string_ref const& token) -{ - for (auto const& item : make_list(value)) - if (ci_equal(item, token)) - return true; - return false; -} - template bool is_keep_alive(boost::beast::http::message const& m) diff --git a/src/ripple/consensus/Consensus.h b/src/ripple/consensus/Consensus.h index 5f88033ecf..4b64cfbdad 100644 --- a/src/ripple/consensus/Consensus.h +++ b/src/ripple/consensus/Consensus.h @@ -738,8 +738,7 @@ Consensus::peerProposalInternal( if (deadNodes_.find(peerID) != deadNodes_.end()) { - using std::to_string; - JLOG(j_.info()) << "Position from dead node: " << to_string(peerID); + JLOG(j_.info()) << "Position from dead node: " << peerID; return false; } @@ -758,9 +757,7 @@ Consensus::peerProposalInternal( if (newPeerProp.isBowOut()) { - using std::to_string; - - JLOG(j_.info()) << "Peer bows out: " << to_string(peerID); + JLOG(j_.info()) << "Peer " << peerID << " bows out"; if (result_) { for (auto& it : result_->disputes) @@ -1559,10 +1556,7 @@ Consensus::haveConsensus() } else { - using std::to_string; - - JLOG(j_.debug()) << to_string(nodeId) << " has " - << to_string(peerProp.position()); + JLOG(j_.debug()) << nodeId << " has " << peerProp.position(); ++disagree; } } diff --git a/src/ripple/json/impl/json_value.cpp b/src/ripple/json/impl/json_value.cpp index aaf8a23b21..024ad2c88a 100644 --- a/src/ripple/json/impl/json_value.cpp +++ b/src/ripple/json/impl/json_value.cpp @@ -480,13 +480,13 @@ Value::asString() const return value_.bool_ ? "true" : "false"; case intValue: - return beast::lexicalCastThrow(value_.int_); + return std::to_string(value_.int_); case uintValue: - return beast::lexicalCastThrow(value_.uint_); + return std::to_string(value_.uint_); case realValue: - return beast::lexicalCastThrow(value_.real_); + return std::to_string(value_.real_); case arrayValue: case objectValue: diff --git a/src/ripple/ledger/detail/ReadViewFwdRange.h b/src/ripple/ledger/detail/ReadViewFwdRange.h index 3e7408568e..af00944cfe 100644 --- a/src/ripple/ledger/detail/ReadViewFwdRange.h +++ b/src/ripple/ledger/detail/ReadViewFwdRange.h @@ -141,10 +141,6 @@ public: ReadViewFwdRange& operator=(ReadViewFwdRange const&) = default; - // VFALCO Otherwise causes errors on clang - // private: - // friend class ReadView; - explicit ReadViewFwdRange(ReadView const& view) : view_(&view) { } diff --git a/src/ripple/net/InfoSub.h b/src/ripple/net/InfoSub.h index aaf6293d2b..b1ef6e25be 100644 --- a/src/ripple/net/InfoSub.h +++ b/src/ripple/net/InfoSub.h @@ -40,12 +40,6 @@ class PathRequest; class InfoSub : public CountedObject { public: - static char const* - getCountedObjectName() - { - return "InfoSub"; - } - using pointer = std::shared_ptr; // VFALCO TODO Standardize on the names of weak / strong pointer type diff --git a/src/ripple/net/impl/HTTPClient.cpp b/src/ripple/net/impl/HTTPClient.cpp index 79779065ce..c9f136cb0d 100644 --- a/src/ripple/net/impl/HTTPClient.cpp +++ b/src/ripple/net/impl/HTTPClient.cpp @@ -144,7 +144,7 @@ public: auto query = std::make_shared( mDeqSites[0], - beast::lexicalCast(mPort), + std::to_string(mPort), boost::asio::ip::resolver_query_base::numeric_service); mQuery = query; diff --git a/src/ripple/net/impl/RPCCall.cpp b/src/ripple/net/impl/RPCCall.cpp index 815ccf0ac5..9a79515a25 100644 --- a/src/ripple/net/impl/RPCCall.cpp +++ b/src/ripple/net/impl/RPCCall.cpp @@ -818,7 +818,7 @@ private: { // verify the channel id is a valid 256 bit number uint256 channelId; - if (!channelId.SetHexExact(jvParams[index].asString())) + if (!channelId.parseHex(jvParams[index].asString())) return rpcError(rpcCHANNEL_MALFORMED); jvRequest[jss::channel_id] = to_string(channelId); index++; @@ -850,7 +850,7 @@ private: { // verify the channel id is a valid 256 bit number uint256 channelId; - if (!channelId.SetHexExact(jvParams[1u].asString())) + if (!channelId.parseHex(jvParams[1u].asString())) return rpcError(rpcCHANNEL_MALFORMED); } jvRequest[jss::channel_id] = jvParams[1u].asString(); diff --git a/src/ripple/nodestore/NodeObject.h b/src/ripple/nodestore/NodeObject.h index 7c33169939..2bd73d8dee 100644 --- a/src/ripple/nodestore/NodeObject.h +++ b/src/ripple/nodestore/NodeObject.h @@ -48,12 +48,6 @@ enum NodeObjectType : std::uint32_t { class NodeObject : public CountedObject { public: - static char const* - getCountedObjectName() - { - return "NodeObject"; - } - static constexpr std::size_t keyBytes = 32; private: diff --git a/src/ripple/nodestore/backend/RocksDBFactory.cpp b/src/ripple/nodestore/backend/RocksDBFactory.cpp index 4fc36b7e1b..04b9699902 100644 --- a/src/ripple/nodestore/backend/RocksDBFactory.cpp +++ b/src/ripple/nodestore/backend/RocksDBFactory.cpp @@ -376,8 +376,7 @@ public: { // Uh oh, corrupted data! JLOG(m_journal.fatal()) - << "Corrupt NodeObject #" - << from_hex_text(it->key().data()); + << "Corrupt NodeObject #" << it->key().ToString(true); } } else diff --git a/src/ripple/nodestore/impl/Shard.cpp b/src/ripple/nodestore/impl/Shard.cpp index a7f49bebe3..6032bf3e8c 100644 --- a/src/ripple/nodestore/impl/Shard.cpp +++ b/src/ripple/nodestore/impl/Shard.cpp @@ -671,7 +671,7 @@ Shard::finalize( if (!sHash) return fail("missing LastLedgerHash"); - if (!hash.SetHexExact(*sHash) || hash.isZero()) + if (!hash.parseHex(*sHash) || hash.isZero()) return fail("invalid LastLedgerHash"); if (blobPresent != soci::i_ok) @@ -1159,7 +1159,7 @@ Shard::storeSQLite( session << (STTx::getMetaSQLInsertReplaceHeader() + item.first->getMetaSQL( - ledgerSeq, sqlEscape(s.modData())) + + ledgerSeq, sqlBlobLiteral(s.modData())) + ';'); } } diff --git a/src/ripple/overlay/impl/PeerImp.cpp b/src/ripple/overlay/impl/PeerImp.cpp index ae373801a3..7a2834dd4a 100644 --- a/src/ripple/overlay/impl/PeerImp.cpp +++ b/src/ripple/overlay/impl/PeerImp.cpp @@ -135,7 +135,7 @@ PeerImp::run() auto parseLedgerHash = [](std::string const& value) -> boost::optional { - if (uint256 ret; ret.SetHexExact(value)) + if (uint256 ret; ret.parseHex(value)) return ret; if (auto const s = base64_decode(value); s.size() == uint256::size()) diff --git a/src/ripple/protocol/AccountID.h b/src/ripple/protocol/AccountID.h index f8393bc263..e105084c8c 100644 --- a/src/ripple/protocol/AccountID.h +++ b/src/ripple/protocol/AccountID.h @@ -57,29 +57,6 @@ template <> boost::optional parseBase58(std::string const& s); -// Compatibility with legacy code -bool -deprecatedParseBase58(AccountID& account, Json::Value const& jv); - -/** Parse AccountID from hexadecimal string - - If the string is not exactly 40 - hex digits, boost::none is returned. - - @return boost::none if a parse error occurs -*/ -template <> -boost::optional -parseHex(std::string const& s); - -/** Parse AccountID from hex or checked base58 string. - - @return boost::none if a parse error occurs -*/ -template <> -boost::optional -parseHexOrBase58(std::string const& s); - /** Compute AccountID from public key. The account ID is computed as the 160-bit hash of the diff --git a/src/ripple/protocol/STArray.h b/src/ripple/protocol/STArray.h index ad62b5af6b..12c6986497 100644 --- a/src/ripple/protocol/STArray.h +++ b/src/ripple/protocol/STArray.h @@ -33,12 +33,6 @@ private: list_type v_; public: - static char const* - getCountedObjectName() - { - return "STArray"; - } - using size_type = list_type::size_type; using iterator = list_type::iterator; using const_iterator = list_type::const_iterator; diff --git a/src/ripple/protocol/STBitString.h b/src/ripple/protocol/STBitString.h index a4a847d0b0..06ace27d98 100644 --- a/src/ripple/protocol/STBitString.h +++ b/src/ripple/protocol/STBitString.h @@ -45,16 +45,6 @@ public: { } - STBitString(SField const& n, const char* v) : STBase(n) - { - value_.SetHex(v); - } - - STBitString(SField const& n, std::string const& v) : STBase(n) - { - value_.SetHex(v); - } - STBitString(SerialIter& sit, SField const& name) : STBitString(name, sit.getBitString()) { diff --git a/src/ripple/protocol/STLedgerEntry.h b/src/ripple/protocol/STLedgerEntry.h index 1ddb012201..0a0e3a8054 100644 --- a/src/ripple/protocol/STLedgerEntry.h +++ b/src/ripple/protocol/STLedgerEntry.h @@ -32,12 +32,6 @@ class STLedgerEntry final : public STObject, public CountedObject friend Invariants_test; // this test wants access to the private type_ public: - static char const* - getCountedObjectName() - { - return "STLedgerEntry"; - } - using pointer = std::shared_ptr; using ref = const std::shared_ptr&; diff --git a/src/ripple/protocol/STObject.h b/src/ripple/protocol/STObject.h index 4ac67ded5c..ad63dcc396 100644 --- a/src/ripple/protocol/STObject.h +++ b/src/ripple/protocol/STObject.h @@ -260,12 +260,6 @@ public: using std::runtime_error::runtime_error; }; - static char const* - getCountedObjectName() - { - return "STObject"; - } - STObject(STObject&&); STObject(STObject const&) = default; STObject(const SOTemplate& type, SField const& name); diff --git a/src/ripple/protocol/STTx.h b/src/ripple/protocol/STTx.h index cecbd2c0a3..0d90b23245 100644 --- a/src/ripple/protocol/STTx.h +++ b/src/ripple/protocol/STTx.h @@ -42,12 +42,6 @@ enum TxnSql : char { class STTx final : public STObject, public CountedObject { public: - static char const* - getCountedObjectName() - { - return "STTx"; - } - static std::size_t const minMultiSigners = 1; static std::size_t const maxMultiSigners = 8; diff --git a/src/ripple/protocol/STValidation.h b/src/ripple/protocol/STValidation.h index be1537ad04..866d1e7850 100644 --- a/src/ripple/protocol/STValidation.h +++ b/src/ripple/protocol/STValidation.h @@ -43,12 +43,6 @@ constexpr std::uint32_t vfFullyCanonicalSig = 0x80000000; class STValidation final : public STObject, public CountedObject { public: - static char const* - getCountedObjectName() - { - return "STValidation"; - } - /** Construct a STValidation from a peer. Construct a STValidation from serialized data previously shared by a diff --git a/src/ripple/protocol/Serializer.h b/src/ripple/protocol/Serializer.h index 812517f256..e51e1bb14f 100644 --- a/src/ripple/protocol/Serializer.h +++ b/src/ripple/protocol/Serializer.h @@ -411,15 +411,18 @@ template base_uint SerialIter::getBitString() { - base_uint u; auto const n = Bits / 8; + if (remain_ < n) Throw("invalid SerialIter getBitString"); - std::memcpy(u.begin(), p_, n); + + auto const x = p_; + p_ += n; used_ += n; remain_ -= n; - return u; + + return base_uint::fromVoid(x); } } // namespace ripple diff --git a/src/ripple/protocol/digest.h b/src/ripple/protocol/digest.h index bd6190f185..6507057dcd 100644 --- a/src/ripple/protocol/digest.h +++ b/src/ripple/protocol/digest.h @@ -21,21 +21,20 @@ #define RIPPLE_PROTOCOL_DIGEST_H_INCLUDED #include -#include -#include -#include +#include +#include #include #include namespace ripple { -/* Message digest functions used in the Ripple Protocol +/** Message digest functions used in the codebase - Modeled to meet the requirements of `Hasher` in the - `hash_append` interface, currently in proposal: + @note These are modeled to meet the requirements of `Hasher` in the + `hash_append` interface, discussed in proposal: - N3980 "Types Don't Know #" - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3980.html + N3980 "Types Don't Know #" + http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3980.html */ //------------------------------------------------------------------------------ @@ -47,7 +46,7 @@ namespace ripple { struct openssl_ripemd160_hasher { public: - static beast::endian const endian = beast::endian::native; + static constexpr auto const endian = boost::endian::order::native; using result_type = std::array; @@ -69,7 +68,7 @@ private: struct openssl_sha512_hasher { public: - static beast::endian const endian = beast::endian::native; + static constexpr auto const endian = boost::endian::order::native; using result_type = std::array; @@ -91,7 +90,7 @@ private: struct openssl_sha256_hasher { public: - static beast::endian const endian = beast::endian::native; + static constexpr auto const endian = boost::endian::order::native; using result_type = std::array; @@ -108,17 +107,9 @@ private: //------------------------------------------------------------------------------ -// Aliases to choose the correct digest implementation - -#if USE_BEAST_HASHER -using ripemd160_hasher = beast::ripemd160_hasher; -using sha256_hasher = beast::sha256_hasher; -using sha512_hasher = beast::sha512_hasher; -#else using ripemd160_hasher = openssl_ripemd160_hasher; using sha256_hasher = openssl_sha256_hasher; using sha512_hasher = openssl_sha512_hasher; -#endif //------------------------------------------------------------------------------ @@ -143,7 +134,7 @@ private: sha256_hasher h_; public: - static beast::endian const endian = beast::endian::native; + static constexpr auto const endian = boost::endian::order::native; using result_type = std::array; @@ -178,7 +169,7 @@ private: sha512_hasher h_; public: - static beast::endian const endian = beast::endian::big; + static constexpr auto const endian = boost::endian::order::big; using result_type = uint256; @@ -196,9 +187,7 @@ public: explicit operator result_type() noexcept { auto const digest = sha512_hasher::result_type(h_); - result_type result; - std::copy(digest.begin(), digest.begin() + 32, result.begin()); - return result; + return result_type::fromVoid(digest.data()); } private: diff --git a/src/ripple/protocol/impl/AccountID.cpp b/src/ripple/protocol/impl/AccountID.cpp index 4719351355..5f9b7a1b76 100644 --- a/src/ripple/protocol/impl/AccountID.cpp +++ b/src/ripple/protocol/impl/AccountID.cpp @@ -36,47 +36,9 @@ boost::optional parseBase58(std::string const& s) { auto const result = decodeBase58Token(s, TokenType::AccountID); - if (result.empty()) + if (result.size() != AccountID::bytes) return boost::none; - AccountID id; - if (result.size() != id.size()) - return boost::none; - std::memcpy(id.data(), result.data(), result.size()); - return id; -} - -bool -deprecatedParseBase58(AccountID& account, Json::Value const& jv) -{ - if (!jv.isString()) - return false; - auto const result = parseBase58(jv.asString()); - if (!result) - return false; - account = *result; - return true; -} - -template <> -boost::optional -parseHex(std::string const& s) -{ - if (s.size() != 40) - return boost::none; - AccountID id; - if (!id.SetHex(s, true)) - return boost::none; - return id; -} - -template <> -boost::optional -parseHexOrBase58(std::string const& s) -{ - auto result = parseHex(s); - if (!result) - result = parseBase58(s); - return result; + return AccountID{result}; } //------------------------------------------------------------------------------ @@ -117,13 +79,11 @@ parseHexOrBase58(std::string const& s) AccountID calcAccountID(PublicKey const& pk) { + static_assert(AccountID::bytes == sizeof(ripesha_hasher::result_type)); + ripesha_hasher rsh; rsh(pk.data(), pk.size()); - auto const d = static_cast(rsh); - AccountID id; - static_assert(sizeof(d) == id.size(), ""); - std::memcpy(id.data(), d.data(), d.size()); - return id; + return AccountID{static_cast(rsh)}; } AccountID const& @@ -143,11 +103,8 @@ noAccount() bool to_issuer(AccountID& issuer, std::string const& s) { - if (s.size() == (160 / 4)) - { - issuer.SetHex(s); + if (issuer.parseHex(s)) return true; - } auto const account = parseBase58(s); if (!account) return false; diff --git a/src/ripple/protocol/impl/Indexes.cpp b/src/ripple/protocol/impl/Indexes.cpp index 20174d9788..02148a5f15 100644 --- a/src/ripple/protocol/impl/Indexes.cpp +++ b/src/ripple/protocol/impl/Indexes.cpp @@ -96,8 +96,13 @@ getBookBase(Book const& book) uint256 getQualityNext(uint256 const& uBase) { - static uint256 const uNext(from_hex_text("10000000000000000")); - return uBase + uNext; + static uint256 const nextq = []() { + uint256 x; + (void)x.parseHex( + "0000000000000000000000000000000000000000000000010000000000000000"); + return x; + }(); + return uBase + nextq; } std::uint64_t diff --git a/src/ripple/protocol/impl/PublicKey.cpp b/src/ripple/protocol/impl/PublicKey.cpp index 4dfdc312b6..0469c6ed64 100644 --- a/src/ripple/protocol/impl/PublicKey.cpp +++ b/src/ripple/protocol/impl/PublicKey.cpp @@ -298,13 +298,11 @@ verify( NodeID calcNodeID(PublicKey const& pk) { + static_assert(NodeID::bytes == sizeof(ripesha_hasher::result_type)); + ripesha_hasher h; h(pk.data(), pk.size()); - auto const digest = static_cast(h); - static_assert(NodeID::bytes == sizeof(ripesha_hasher::result_type), ""); - NodeID result; - std::memcpy(result.data(), digest.data(), digest.size()); - return result; + return NodeID{static_cast(h)}; } } // namespace ripple diff --git a/src/ripple/protocol/impl/STBase.cpp b/src/ripple/protocol/impl/STBase.cpp index 2c7d4b4f71..f447b1fe23 100644 --- a/src/ripple/protocol/impl/STBase.cpp +++ b/src/ripple/protocol/impl/STBase.cpp @@ -36,16 +36,6 @@ STBase::STBase(SField const& n) : fName(&n) STBase& STBase::operator=(const STBase& t) { - if ((t.fName != fName) && fName->isUseful() && t.fName->isUseful()) - { - // VFALCO We shouldn't be logging at this low a level - /* - WriteLog ((t.getSType () == STI_AMOUNT) ? lsTRACE : lsWARNING, STBase) - // This is common for amounts - << "Caution: " << t.fName->getName () << " not replacing " << - fName->getName (); - */ - } if (!fName->isUseful()) fName = t.fName; return *this; @@ -110,12 +100,7 @@ bool STBase::isEquivalent(const STBase& t) const { assert(getSType() == STI_NOTPRESENT); - if (t.getSType() == STI_NOTPRESENT) - return true; - // VFALCO We shouldn't be logging at this low a level - // WriteLog (lsDEBUG, STBase) << "notEquiv " << getFullText() << " not - // STI_NOTPRESENT"; - return false; + return t.getSType() == STI_NOTPRESENT; } bool diff --git a/src/ripple/protocol/impl/STInteger.cpp b/src/ripple/protocol/impl/STInteger.cpp index dc580388d6..2b154e369e 100644 --- a/src/ripple/protocol/impl/STInteger.cpp +++ b/src/ripple/protocol/impl/STInteger.cpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace ripple { @@ -56,7 +57,7 @@ STUInt8::getText() const << "Unknown result code in metadata: " << value_; } - return beast::lexicalCastThrow(value_); + return std::to_string(value_); } template <> @@ -113,7 +114,7 @@ STUInt16::getText() const return item->getName(); } - return beast::lexicalCastThrow(value_); + return std::to_string(value_); } template <> @@ -159,7 +160,7 @@ template <> std::string STUInt32::getText() const { - return beast::lexicalCastThrow(value_); + return std::to_string(value_); } template <> @@ -187,13 +188,17 @@ template <> std::string STUInt64::getText() const { - return beast::lexicalCastThrow(value_); + return std::to_string(value_); } template <> Json::Value STUInt64::getJson(JsonOptions) const { - return strHex(value_); + std::string str(16, 0); + auto ret = std::to_chars(str.data(), str.data() + str.size(), value_, 16); + assert(ret.ec == std::errc()); + str.resize(std::distance(str.data(), ret.ptr)); + return str; } } // namespace ripple diff --git a/src/ripple/protocol/impl/STLedgerEntry.cpp b/src/ripple/protocol/impl/STLedgerEntry.cpp index 6211e3e7f0..9c0ac3f511 100644 --- a/src/ripple/protocol/impl/STLedgerEntry.cpp +++ b/src/ripple/protocol/impl/STLedgerEntry.cpp @@ -25,22 +25,29 @@ #include #include #include +#include namespace ripple { STLedgerEntry::STLedgerEntry(Keylet const& k) : STObject(sfLedgerEntry), key_(k.key), type_(k.type) { - if (!(0u <= type_ && - type_ <= std::min( - std::numeric_limits::max(), - std::numeric_limits< - std::underlying_type_t>::max()))) + // The on-ledger representation of a key type is a 16-bit unsigned integer + // but the LedgerEntryType enum has a larger range (including negative + // values), so catch obviously wrong values: + constexpr auto const minValidValue = + static_cast(std::numeric_limits::min()); + + constexpr auto const maxValidValue = + static_cast(std::numeric_limits::max()); + + if (type_ < minValidValue || type_ > maxValidValue) Throw("invalid ledger entry type: out of range"); + auto const format = LedgerFormats::getInstance().findByType(type_); if (format == nullptr) - Throw("invalid ledger entry type"); + Throw("unknown ledger entry type"); set(format->getSOTemplate()); diff --git a/src/ripple/protocol/impl/STParsedJSON.cpp b/src/ripple/protocol/impl/STParsedJSON.cpp index 7baad35a9f..da5e53b332 100644 --- a/src/ripple/protocol/impl/STParsedJSON.cpp +++ b/src/ripple/protocol/impl/STParsedJSON.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include namespace ripple { @@ -403,8 +404,17 @@ parseLeaf( { if (value.isString()) { - ret = detail::make_stvar( - field, uintFromHex(value.asString())); + auto const str = value.asString(); + + std::uint64_t val; + + auto [p, ec] = std::from_chars( + str.data(), str.data() + str.size(), val, 16); + + if (ec != std::errc() || (p != str.data() + str.size())) + Throw("invalid data"); + + ret = detail::make_stvar(field, val); } else if (value.isInt()) { @@ -430,71 +440,77 @@ parseLeaf( break; - case STI_HASH128: - try + case STI_HASH128: { + if (!value.isString()) { - if (value.isString()) - { - ret = - detail::make_stvar(field, value.asString()); - } - else - { - error = bad_type(json_name, fieldName); - return ret; - } - } - catch (std::exception const&) - { - error = invalid_data(json_name, fieldName); + error = bad_type(json_name, fieldName); return ret; } - break; + uint128 num; - case STI_HASH160: - try + if (auto const s = value.asString(); !num.parseHex(s)) { - if (value.isString()) + if (!s.empty()) { - ret = - detail::make_stvar(field, value.asString()); - } - else - { - error = bad_type(json_name, fieldName); + error = invalid_data(json_name, fieldName); return ret; } + + num.zero(); } - catch (std::exception const&) + + ret = detail::make_stvar(field, num); + break; + } + + case STI_HASH160: { + if (!value.isString()) { - error = invalid_data(json_name, fieldName); + error = bad_type(json_name, fieldName); return ret; } - break; + uint160 num; - case STI_HASH256: - try + if (auto const s = value.asString(); !num.parseHex(s)) { - if (value.isString()) + if (!s.empty()) { - ret = - detail::make_stvar(field, value.asString()); - } - else - { - error = bad_type(json_name, fieldName); + error = invalid_data(json_name, fieldName); return ret; } + + num.zero(); } - catch (std::exception const&) + + ret = detail::make_stvar(field, num); + break; + } + + case STI_HASH256: { + if (!value.isString()) { - error = invalid_data(json_name, fieldName); + error = bad_type(json_name, fieldName); return ret; } + uint256 num; + + if (auto const s = value.asString(); !num.parseHex(s)) + { + if (!s.empty()) + { + error = invalid_data(json_name, fieldName); + return ret; + } + + num.zero(); + } + + ret = detail::make_stvar(field, num); break; + } case STI_VL: if (!value.isString()) @@ -550,7 +566,8 @@ parseLeaf( for (Json::UInt i = 0; value.isValidIndex(i); ++i) { uint256 s; - s.SetHex(value[i].asString()); + if (!s.parseHex(value[i].asString())) + Throw("invalid data"); tail.push_back(s); } ret = detail::make_stvar(std::move(tail)); @@ -623,7 +640,7 @@ parseLeaf( // If we have what looks like a 160-bit hex value, // we set it, otherwise, we assume it's an AccountID - if (!uAccount.SetHexExact(account.asString())) + if (!uAccount.parseHex(account.asString())) { auto const a = parseBase58(account.asString()); @@ -649,7 +666,7 @@ parseLeaf( hasCurrency = true; - if (!uCurrency.SetHexExact(currency.asString())) + if (!uCurrency.parseHex(currency.asString())) { if (!to_currency( uCurrency, currency.asString())) @@ -670,7 +687,7 @@ parseLeaf( return ret; } - if (!uIssuer.SetHexExact(issuer.asString())) + if (!uIssuer.parseHex(issuer.asString())) { auto const a = parseBase58(issuer.asString()); @@ -711,14 +728,14 @@ parseLeaf( try { - // VFALCO This needs careful auditing - auto const account = parseHexOrBase58(strValue); - if (!account) - { - error = invalid_data(json_name, fieldName); - return ret; - } - ret = detail::make_stvar(field, *account); + if (AccountID account; account.parseHex(strValue)) + return detail::make_stvar(field, account); + + if (auto result = parseBase58(strValue)) + return detail::make_stvar(field, *result); + + error = invalid_data(json_name, fieldName); + return ret; } catch (std::exception const&) { diff --git a/src/ripple/protocol/impl/STPathSet.cpp b/src/ripple/protocol/impl/STPathSet.cpp index 2825c7cfbc..141fad329c 100644 --- a/src/ripple/protocol/impl/STPathSet.cpp +++ b/src/ripple/protocol/impl/STPathSet.cpp @@ -156,7 +156,6 @@ Json::Value STPath::getJson(JsonOptions) const auto const iType = it.getNodeType(); elem[jss::type] = iType; - elem[jss::type_hex] = strHex(iType); if (iType & STPathElement::typeAccount) elem[jss::account] = to_string(it.getAccountID()); diff --git a/src/ripple/protocol/impl/STTx.cpp b/src/ripple/protocol/impl/STTx.cpp index 14bffddea5..6e1b86f1fb 100644 --- a/src/ripple/protocol/impl/STTx.cpp +++ b/src/ripple/protocol/impl/STTx.cpp @@ -259,7 +259,7 @@ STTx::getMetaSQL( { static boost::format bfTrans( "('%s', '%s', '%s', '%d', '%d', '%c', %s, %s)"); - std::string rTxn = sqlEscape(rawTxn.peekData()); + std::string rTxn = sqlBlobLiteral(rawTxn.peekData()); auto format = TxFormats::getInstance().findByType(tx_type_); assert(format != nullptr); diff --git a/src/ripple/protocol/impl/Seed.cpp b/src/ripple/protocol/impl/Seed.cpp index 02c1ad2e3e..f38556c2ec 100644 --- a/src/ripple/protocol/impl/Seed.cpp +++ b/src/ripple/protocol/impl/Seed.cpp @@ -104,7 +104,7 @@ parseGenericSeed(std::string const& str) { uint128 seed; - if (seed.SetHexExact(str)) + if (seed.parseHex(str)) return Seed{Slice(seed.data(), seed.size())}; } diff --git a/src/ripple/protocol/impl/UintTypes.cpp b/src/ripple/protocol/impl/UintTypes.cpp index 698555b9a0..39e25a8136 100644 --- a/src/ripple/protocol/impl/UintTypes.cpp +++ b/src/ripple/protocol/impl/UintTypes.cpp @@ -55,8 +55,11 @@ to_string(Currency const& currency) if (currency == noCurrency()) return "1"; - static Currency const sIsoBits( - from_hex_text("FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF")); + static Currency const sIsoBits = []() { + Currency c; + (void)c.parseHex("FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF"); + return c; + }(); if ((currency & sIsoBits).isZero()) { @@ -105,7 +108,7 @@ to_currency(Currency& currency, std::string const& code) return true; } - return currency.SetHexExact(code); + return currency.parseHex(code); } Currency diff --git a/src/ripple/protocol/tokens.h b/src/ripple/protocol/tokens.h index 1da8ca9934..d507c2542e 100644 --- a/src/ripple/protocol/tokens.h +++ b/src/ripple/protocol/tokens.h @@ -45,14 +45,6 @@ template boost::optional parseBase58(TokenType type, std::string const& s); -template -boost::optional -parseHex(std::string const& s); - -template -boost::optional -parseHexOrBase58(std::string const& s); - /** Encode data in Base58Check format using XRPL alphabet For details on the format see diff --git a/src/ripple/rpc/handlers/AccountChannels.cpp b/src/ripple/rpc/handlers/AccountChannels.cpp index b1c85cc80a..d222e4c72c 100644 --- a/src/ripple/rpc/handlers/AccountChannels.cpp +++ b/src/ripple/rpc/handlers/AccountChannels.cpp @@ -121,7 +121,7 @@ doAccountChannels(RPC::JsonContext& context) if (!marker.isString()) return RPC::expected_field_error(jss::marker, "string"); - if (!startAfter.SetHex(marker.asString())) + if (!startAfter.parseHex(marker.asString())) { return rpcError(rpcINVALID_PARAMS); } diff --git a/src/ripple/rpc/handlers/AccountLines.cpp b/src/ripple/rpc/handlers/AccountLines.cpp index 947b0a3be0..2e1dac1d71 100644 --- a/src/ripple/rpc/handlers/AccountLines.cpp +++ b/src/ripple/rpc/handlers/AccountLines.cpp @@ -139,7 +139,9 @@ doAccountLines(RPC::JsonContext& context) if (!marker.isString()) return RPC::expected_field_error(jss::marker, "string"); - startAfter.SetHex(marker.asString()); + if (!startAfter.parseHex(marker.asString())) + return rpcError(rpcINVALID_PARAMS); + auto const sleLine = ledger->read({ltRIPPLE_STATE, startAfter}); if (!sleLine) diff --git a/src/ripple/rpc/handlers/AccountObjects.cpp b/src/ripple/rpc/handlers/AccountObjects.cpp index 464031e93d..1783c89da9 100644 --- a/src/ripple/rpc/handlers/AccountObjects.cpp +++ b/src/ripple/rpc/handlers/AccountObjects.cpp @@ -134,13 +134,13 @@ doAccountObjects(RPC::JsonContext& context) if (!std::getline(ss, s, ',')) return RPC::invalid_field_error(jss::marker); - if (!dirIndex.SetHex(s)) + if (!dirIndex.parseHex(s)) return RPC::invalid_field_error(jss::marker); if (!std::getline(ss, s, ',')) return RPC::invalid_field_error(jss::marker); - if (!entryIndex.SetHex(s)) + if (!entryIndex.parseHex(s)) return RPC::invalid_field_error(jss::marker); } diff --git a/src/ripple/rpc/handlers/AccountOffers.cpp b/src/ripple/rpc/handlers/AccountOffers.cpp index 9836417293..063d087437 100644 --- a/src/ripple/rpc/handlers/AccountOffers.cpp +++ b/src/ripple/rpc/handlers/AccountOffers.cpp @@ -101,7 +101,9 @@ doAccountOffers(RPC::JsonContext& context) if (!marker.isString()) return RPC::expected_field_error(jss::marker, "string"); - startAfter.SetHex(marker.asString()); + if (!startAfter.parseHex(marker.asString())) + return rpcError(rpcINVALID_PARAMS); + auto const sleOffer = ledger->read({ltOFFER, startAfter}); if (!sleOffer || accountID != sleOffer->getAccountID(sfAccount)) diff --git a/src/ripple/rpc/handlers/AccountTx.cpp b/src/ripple/rpc/handlers/AccountTx.cpp index ffcbe145fb..104f555357 100644 --- a/src/ripple/rpc/handlers/AccountTx.cpp +++ b/src/ripple/rpc/handlers/AccountTx.cpp @@ -165,7 +165,7 @@ parseLedgerArgs(Json::Value const& params) } LedgerHash hash; - if (!hash.SetHex(hashValue.asString())) + if (!hash.parseHex(hashValue.asString())) { RPC::Status status{rpcINVALID_PARAMS, "ledgerHashMalformed"}; status.inject(response); diff --git a/src/ripple/rpc/handlers/CanDelete.cpp b/src/ripple/rpc/handlers/CanDelete.cpp index d302a2f1b2..56015375a2 100644 --- a/src/ripple/rpc/handlers/CanDelete.cpp +++ b/src/ripple/rpc/handlers/CanDelete.cpp @@ -71,13 +71,9 @@ doCanDelete(RPC::JsonContext& context) if (!canDeleteSeq) return RPC::make_error(rpcNOT_READY); } - else if ( - canDeleteStr.size() == 64 && - canDeleteStr.find_first_not_of("0123456789abcdef") == - std::string::npos) + else if (uint256 lh; lh.parseHex(canDeleteStr)) { - auto ledger = context.ledgerMaster.getLedgerByHash( - from_hex_text(canDeleteStr)); + auto ledger = context.ledgerMaster.getLedgerByHash(lh); if (!ledger) return RPC::make_error(rpcLGR_NOT_FOUND, "ledgerNotFound"); diff --git a/src/ripple/rpc/handlers/Feature1.cpp b/src/ripple/rpc/handlers/Feature1.cpp index 47a284f309..086d6acd26 100644 --- a/src/ripple/rpc/handlers/Feature1.cpp +++ b/src/ripple/rpc/handlers/Feature1.cpp @@ -60,8 +60,7 @@ doFeature(RPC::JsonContext& context) auto feature = table.find(context.params[jss::feature].asString()); - if (!feature && - !feature.SetHexExact(context.params[jss::feature].asString())) + if (!feature && !feature.parseHex(context.params[jss::feature].asString())) return rpcError(rpcBAD_FEATURE); if (context.params.isMember(jss::vetoed)) diff --git a/src/ripple/rpc/handlers/LedgerData.cpp b/src/ripple/rpc/handlers/LedgerData.cpp index 9bad148547..4cb0b4d466 100644 --- a/src/ripple/rpc/handlers/LedgerData.cpp +++ b/src/ripple/rpc/handlers/LedgerData.cpp @@ -55,7 +55,7 @@ doLedgerData(RPC::JsonContext& context) if (isMarker) { Json::Value const& jMarker = params[jss::marker]; - if (!(jMarker.isString() && key.SetHex(jMarker.asString()))) + if (!(jMarker.isString() && key.parseHex(jMarker.asString()))) return RPC::expected_field_error(jss::marker, "valid"); } diff --git a/src/ripple/rpc/handlers/LedgerEntry.cpp b/src/ripple/rpc/handlers/LedgerEntry.cpp index 6d0fbbdb03..933c61f23f 100644 --- a/src/ripple/rpc/handlers/LedgerEntry.cpp +++ b/src/ripple/rpc/handlers/LedgerEntry.cpp @@ -50,7 +50,11 @@ doLedgerEntry(RPC::JsonContext& context) if (context.params.isMember(jss::index)) { - uNodeIndex.SetHex(context.params[jss::index].asString()); + if (!uNodeIndex.parseHex(context.params[jss::index].asString())) + { + uNodeIndex = beast::zero; + jvResult[jss::error] = "malformedRequest"; + } } else if (context.params.isMember(jss::account_root)) { @@ -65,7 +69,12 @@ doLedgerEntry(RPC::JsonContext& context) else if (context.params.isMember(jss::check)) { expectedType = ltCHECK; - uNodeIndex.SetHex(context.params[jss::check].asString()); + + if (!uNodeIndex.parseHex(context.params[jss::check].asString())) + { + uNodeIndex = beast::zero; + jvResult[jss::error] = "malformedRequest"; + } } else if (context.params.isMember(jss::deposit_preauth)) { @@ -74,7 +83,7 @@ doLedgerEntry(RPC::JsonContext& context) if (!context.params[jss::deposit_preauth].isObject()) { if (!context.params[jss::deposit_preauth].isString() || - !uNodeIndex.SetHex( + !uNodeIndex.parseHex( context.params[jss::deposit_preauth].asString())) { uNodeIndex = beast::zero; @@ -115,7 +124,11 @@ doLedgerEntry(RPC::JsonContext& context) } else if (!context.params[jss::directory].isObject()) { - uNodeIndex.SetHex(context.params[jss::directory].asString()); + if (!uNodeIndex.parseHex(context.params[jss::directory].asString())) + { + uNodeIndex = beast::zero; + jvResult[jss::error] = "malformedRequest"; + } } else if ( context.params[jss::directory].isMember(jss::sub_index) && @@ -132,18 +145,22 @@ doLedgerEntry(RPC::JsonContext& context) if (context.params[jss::directory].isMember(jss::dir_root)) { + uint256 uDirRoot; + if (context.params[jss::directory].isMember(jss::owner)) { // May not specify both dir_root and owner. jvResult[jss::error] = "malformedRequest"; } + else if (!uDirRoot.parseHex( + context.params[jss::directory][jss::dir_root] + .asString())) + { + uNodeIndex = beast::zero; + jvResult[jss::error] = "malformedRequest"; + } else { - uint256 uDirRoot; - uDirRoot.SetHex( - context.params[jss::directory][jss::dir_root] - .asString()); - uNodeIndex = keylet::page(uDirRoot, uSubIndex).key; } } @@ -173,7 +190,11 @@ doLedgerEntry(RPC::JsonContext& context) expectedType = ltESCROW; if (!context.params[jss::escrow].isObject()) { - uNodeIndex.SetHex(context.params[jss::escrow].asString()); + if (!uNodeIndex.parseHex(context.params[jss::escrow].asString())) + { + uNodeIndex = beast::zero; + jvResult[jss::error] = "malformedRequest"; + } } else if ( !context.params[jss::escrow].isMember(jss::owner) || @@ -200,7 +221,11 @@ doLedgerEntry(RPC::JsonContext& context) expectedType = ltOFFER; if (!context.params[jss::offer].isObject()) { - uNodeIndex.SetHex(context.params[jss::offer].asString()); + if (!uNodeIndex.parseHex(context.params[jss::offer].asString())) + { + uNodeIndex = beast::zero; + jvResult[jss::error] = "malformedRequest"; + } } else if ( !context.params[jss::offer].isMember(jss::account) || @@ -225,7 +250,13 @@ doLedgerEntry(RPC::JsonContext& context) else if (context.params.isMember(jss::payment_channel)) { expectedType = ltPAYCHAN; - uNodeIndex.SetHex(context.params[jss::payment_channel].asString()); + + if (!uNodeIndex.parseHex( + context.params[jss::payment_channel].asString())) + { + uNodeIndex = beast::zero; + jvResult[jss::error] = "malformedRequest"; + } } else if (context.params.isMember(jss::ripple_state)) { @@ -271,7 +302,11 @@ doLedgerEntry(RPC::JsonContext& context) expectedType = ltTICKET; if (!context.params[jss::ticket].isObject()) { - uNodeIndex.SetHex(context.params[jss::ticket].asString()); + if (!uNodeIndex.parseHex(context.params[jss::ticket].asString())) + { + uNodeIndex = beast::zero; + jvResult[jss::error] = "malformedRequest"; + } } else if ( !context.params[jss::ticket].isMember(jss::account) || diff --git a/src/ripple/rpc/handlers/LedgerRequest.cpp b/src/ripple/rpc/handlers/LedgerRequest.cpp index 5d2d11b00a..dfb9d099ff 100644 --- a/src/ripple/rpc/handlers/LedgerRequest.cpp +++ b/src/ripple/rpc/handlers/LedgerRequest.cpp @@ -55,7 +55,7 @@ doLedgerRequest(RPC::JsonContext& context) if (hasHash) { auto const& jsonHash = context.params[jss::ledger_hash]; - if (!jsonHash.isString() || !ledgerHash.SetHex(jsonHash.asString())) + if (!jsonHash.isString() || !ledgerHash.parseHex(jsonHash.asString())) return RPC::invalid_field_error(jss::ledger_hash); } else diff --git a/src/ripple/rpc/handlers/PayChanClaim.cpp b/src/ripple/rpc/handlers/PayChanClaim.cpp index ddc09f8aab..9c46893ddf 100644 --- a/src/ripple/rpc/handlers/PayChanClaim.cpp +++ b/src/ripple/rpc/handlers/PayChanClaim.cpp @@ -60,7 +60,7 @@ doChannelAuthorize(RPC::JsonContext& context) return result; uint256 channelId; - if (!channelId.SetHexExact(params[jss::channel_id].asString())) + if (!channelId.parseHex(params[jss::channel_id].asString())) return rpcError(rpcCHANNEL_MALFORMED); boost::optional const optDrops = @@ -122,7 +122,7 @@ doChannelVerify(RPC::JsonContext& context) } uint256 channelId; - if (!channelId.SetHexExact(params[jss::channel_id].asString())) + if (!channelId.parseHex(params[jss::channel_id].asString())) return rpcError(rpcCHANNEL_MALFORMED); boost::optional const optDrops = diff --git a/src/ripple/rpc/handlers/TransactionEntry.cpp b/src/ripple/rpc/handlers/TransactionEntry.cpp index 3731b60637..83c4d18a23 100644 --- a/src/ripple/rpc/handlers/TransactionEntry.cpp +++ b/src/ripple/rpc/handlers/TransactionEntry.cpp @@ -57,7 +57,11 @@ doTransactionEntry(RPC::JsonContext& context) uint256 uTransID; // XXX Relying on trusted WSS client. Would be better to have a strict // routine, returning success or failure. - uTransID.SetHex(context.params[jss::tx_hash].asString()); + if (!uTransID.parseHex(context.params[jss::tx_hash].asString())) + { + jvResult[jss::error] = "malformedRequest"; + return jvResult; + } auto [sttx, stobj] = lpLedger->txRead(uTransID); if (!sttx) diff --git a/src/ripple/rpc/handlers/Tx.cpp b/src/ripple/rpc/handlers/Tx.cpp index e5ab4b8dd3..9db86b1e1b 100644 --- a/src/ripple/rpc/handlers/Tx.cpp +++ b/src/ripple/rpc/handlers/Tx.cpp @@ -37,20 +37,6 @@ namespace ripple { // transaction: // } -static bool -isHexTxID(std::string const& txid) -{ - if (txid.size() != 64) - return false; - - auto const ret = - std::find_if(txid.begin(), txid.end(), [](std::string::value_type c) { - return !std::isxdigit(static_cast(c)); - }); - - return (ret == txid.end()); -} - static bool isValidated(LedgerMaster& ledgerMaster, std::uint32_t seq, uint256 const& hash) { @@ -326,12 +312,10 @@ doTxJson(RPC::JsonContext& context) if (!context.params.isMember(jss::transaction)) return rpcError(rpcINVALID_PARAMS); - std::string txHash = context.params[jss::transaction].asString(); - if (!isHexTxID(txHash)) - return rpcError(rpcNOT_IMPL); - TxArgs args; - args.hash = from_hex_text(txHash); + + if (!args.hash.parseHex(context.params[jss::transaction].asString())) + return rpcError(rpcNOT_IMPL); args.binary = context.params.isMember(jss::binary) && context.params[jss::binary].asBool(); diff --git a/src/ripple/rpc/impl/RPCHelpers.cpp b/src/ripple/rpc/impl/RPCHelpers.cpp index 6a415477a7..4aac4e6a53 100644 --- a/src/ripple/rpc/impl/RPCHelpers.cpp +++ b/src/ripple/rpc/impl/RPCHelpers.cpp @@ -221,7 +221,7 @@ ledgerFromRequest(T& ledger, JsonContext& context) return {rpcINVALID_PARAMS, "ledgerHashNotString"}; uint256 ledgerHash; - if (!ledgerHash.SetHex(hashValue.asString())) + if (!ledgerHash.parseHex(hashValue.asString())) return {rpcINVALID_PARAMS, "ledgerHashMalformed"}; return getLedger(ledger, ledgerHash, context); } @@ -646,7 +646,7 @@ getSeedFromRPC(Json::Value const& params, Json::Value& error) { uint128 s; - if (s.SetHexExact(fieldContents)) + if (s.parseHex(fieldContents)) seed.emplace(Slice(s.data(), s.size())); } diff --git a/src/ripple/shamap/impl/SHAMapTreeNode.cpp b/src/ripple/shamap/impl/SHAMapTreeNode.cpp index acc268ac2a..e05f9c3dd0 100644 --- a/src/ripple/shamap/impl/SHAMapTreeNode.cpp +++ b/src/ripple/shamap/impl/SHAMapTreeNode.cpp @@ -513,7 +513,7 @@ SHAMapTreeNode::getString(const SHAMapNodeID& id) const ret += "\n Hash="; ret += to_string(mHash); ret += "/"; - ret += beast::lexicalCast(mItem->size()); + ret += std::to_string(mItem->size()); return ret; } diff --git a/src/test/app/Manifest_test.cpp b/src/test/app/Manifest_test.cpp index 18460ce368..8dbc92ed78 100644 --- a/src/test/app/Manifest_test.cpp +++ b/src/test/app/Manifest_test.cpp @@ -602,14 +602,29 @@ public: std::uint32_t sequence = 0; // public key with invalid type - auto const ret = strUnHex( - "9930E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD02" - "0"); - auto const badKey = Slice{ret->data(), ret->size()}; + std::array const badKey{ + 0x99, 0x30, 0xE7, 0xFC, 0x9D, 0x56, 0xBB, 0x25, 0xD6, 0x89, 0x3B, + 0xA3, 0xF3, 0x17, 0xAE, 0x5B, 0xCF, 0x33, 0xB3, 0x29, 0x1B, 0xD6, + 0x3D, 0xB3, 0x26, 0x54, 0xA3, 0x13, 0x22, 0x2F, 0x7F, 0xD0, 0x20}; - // short public key - auto const retShort = strUnHex("0330"); - auto const shortKey = Slice{retShort->data(), retShort->size()}; + // Short public key: + std::array const shortKey{ + 0x03, + 0x30, + 0xE7, + 0xFC, + 0x9D, + 0x56, + 0xBB, + 0x25, + 0xD6, + 0x89, + 0x3B, + 0xA3, + 0xF3, + 0x17, + 0xAE, + 0x5B}; auto toString = [](STObject const& st) { Serializer s; @@ -749,13 +764,13 @@ public: { // reject invalid public key type auto badSt = st; - badSt[sfPublicKey] = badKey; + badSt[sfPublicKey] = makeSlice(badKey); BEAST_EXPECT(!deserializeManifest(toString(badSt))); } { // reject short public key auto badSt = st; - badSt[sfPublicKey] = shortKey; + badSt[sfPublicKey] = makeSlice(shortKey); BEAST_EXPECT(!deserializeManifest(toString(badSt))); } { @@ -767,13 +782,13 @@ public: { // reject invalid signing public key type auto badSt = st; - badSt[sfSigningPubKey] = badKey; + badSt[sfSigningPubKey] = makeSlice(badKey); BEAST_EXPECT(!deserializeManifest(toString(badSt))); } { // reject short signing public key auto badSt = st; - badSt[sfSigningPubKey] = shortKey; + badSt[sfSigningPubKey] = makeSlice(shortKey); BEAST_EXPECT(!deserializeManifest(toString(badSt))); } { diff --git a/src/test/app/Path_test.cpp b/src/test/app/Path_test.cpp index 17e15c9504..1889a790e2 100644 --- a/src/test/app/Path_test.cpp +++ b/src/test/app/Path_test.cpp @@ -802,7 +802,7 @@ public: "issuer" : "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", "value" : "1000" }, - "HighNode" : "0000000000000000", + "HighNode" : "0", "HighQualityIn" : 2000, "HighQualityOut" : 1400000000, "LedgerEntryType" : "RippleState", @@ -811,7 +811,7 @@ public: "issuer" : "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", "value" : "0" }, - "LowNode" : "0000000000000000" + "LowNode" : "0" })", jv); @@ -847,14 +847,14 @@ public: "issuer" : "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", "value" : "1000" }, - "HighNode" : "0000000000000000", + "HighNode" : "0", "LedgerEntryType" : "RippleState", "LowLimit" : { "currency" : "USD", "issuer" : "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", "value" : "1000" }, - "LowNode" : "0000000000000000" + "LowNode" : "0" })", jv); @@ -900,7 +900,7 @@ public: "issuer" : "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", "value" : "0" }, - "HighNode" : "0000000000000000", + "HighNode" : "0", "LedgerEntryType" : "RippleState", "LowLimit" : { @@ -908,7 +908,7 @@ public: "issuer" : "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn", "value" : "0" }, - "LowNode" : "0000000000000000" + "LowNode" : "0" })", jv); diff --git a/src/test/app/TrustAndBalance_test.cpp b/src/test/app/TrustAndBalance_test.cpp index 5e07f1110d..72ab5eb43e 100644 --- a/src/test/app/TrustAndBalance_test.cpp +++ b/src/test/app/TrustAndBalance_test.cpp @@ -454,30 +454,24 @@ class TrustAndBalance_test : public beast::unit_test::suite jvs[jss::streams].append("transactions"); BEAST_EXPECT(wsc->invoke("subscribe", jvs)[jss::status] == "success"); + char const* invoiceid = + "243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89"; + Json::Value jv; auto tx = env.jt( pay(env.master, alice, XRP(10000)), - json(sfInvoiceID.fieldName, "DEADBEEF")); + json(sfInvoiceID.fieldName, invoiceid)); jv[jss::tx_blob] = strHex(tx.stx->getSerializer().slice()); auto jrr = wsc->invoke("submit", jv)[jss::result]; BEAST_EXPECT(jrr[jss::status] == "success"); - BEAST_EXPECT( - jrr[jss::tx_json][sfInvoiceID.fieldName] == - "0000000000000000" - "0000000000000000" - "0000000000000000" - "00000000DEADBEEF"); + BEAST_EXPECT(jrr[jss::tx_json][sfInvoiceID.fieldName] == invoiceid); env.close(); using namespace std::chrono_literals; - BEAST_EXPECT(wsc->findMsg(2s, [](auto const& jval) { + BEAST_EXPECT(wsc->findMsg(2s, [invoiceid](auto const& jval) { auto const& t = jval[jss::transaction]; return t[jss::TransactionType] == jss::Payment && - t[sfInvoiceID.fieldName] == - "0000000000000000" - "0000000000000000" - "0000000000000000" - "00000000DEADBEEF"; + t[sfInvoiceID.fieldName] == invoiceid; })); BEAST_EXPECT(wsc->invoke("unsubscribe", jv)[jss::status] == "success"); diff --git a/src/test/basics/base_uint_test.cpp b/src/test/basics/base_uint_test.cpp index ab327bc28b..2ac8bbe8f6 100644 --- a/src/test/basics/base_uint_test.cpp +++ b/src/test/basics/base_uint_test.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include @@ -34,9 +34,10 @@ namespace test { template struct nonhash { + static constexpr auto const endian = boost::endian::order::big; static constexpr std::size_t WIDTH = Bits / 8; + std::array data_; - static beast::endian const endian = beast::endian::big; nonhash() = default; @@ -62,6 +63,8 @@ struct base_uint_test : beast::unit_test::suite void run() override { + testcase("base_uint: general purpose tests"); + static_assert( !std::is_constructible>::value, ""); static_assert( @@ -151,59 +154,47 @@ struct base_uint_test : beast::unit_test::suite BEAST_EXPECT(uset.size() == 4); - // SetHex tests... - test96 fromHex; - BEAST_EXPECT(fromHex.SetHexExact(to_string(u))); - BEAST_EXPECT(fromHex == u); - fromHex = z; + test96 tmp; + BEAST_EXPECT(tmp.parseHex(to_string(u))); + BEAST_EXPECT(tmp == u); + tmp = z; // fails with extra char - BEAST_EXPECT(!fromHex.SetHexExact("A" + to_string(u))); - fromHex = z; + BEAST_EXPECT(!tmp.parseHex("A" + to_string(u))); + tmp = z; // fails with extra char at end - BEAST_EXPECT(!fromHex.SetHexExact(to_string(u) + "A")); - // NOTE: the value fromHex is actually correctly parsed - // in this case, but that is an implementation detail and - // not guaranteed, thus we don't check the value here. - fromHex = z; + BEAST_EXPECT(!tmp.parseHex(to_string(u) + "A")); - BEAST_EXPECT(fromHex.SetHex(to_string(u))); - BEAST_EXPECT(fromHex == u); - fromHex = z; + // fails with a non-hex character at some point in the string: + tmp = z; - // leading space/0x allowed if not strict - BEAST_EXPECT(fromHex.SetHex(" 0x" + to_string(u))); - BEAST_EXPECT(fromHex == u); - fromHex = z; + for (std::size_t i = 0; i != 24; ++i) + { + std::string x = to_string(z); + x[i] = ('G' + (i % 10)); + BEAST_EXPECT(!tmp.parseHex(x)); + } - // other leading chars also allowed (ignored) - BEAST_EXPECT(fromHex.SetHex("FEFEFE" + to_string(u))); - BEAST_EXPECT(fromHex == u); - fromHex = z; + // Walking 1s: + for (std::size_t i = 0; i != 24; ++i) + { + std::string s1 = "000000000000000000000000"; + s1[i] = '1'; - // invalid hex chars should fail (0 replaced with Z here) - BEAST_EXPECT(!fromHex.SetHex( - boost::algorithm::replace_all_copy(to_string(u), "0", "Z"))); - fromHex = z; + BEAST_EXPECT(tmp.parseHex(s1)); + BEAST_EXPECT(to_string(tmp) == s1); + } - BEAST_EXPECT(fromHex.SetHex(to_string(u), true)); - BEAST_EXPECT(fromHex == u); - fromHex = z; + // Walking 0s: + for (std::size_t i = 0; i != 24; ++i) + { + std::string s1 = "111111111111111111111111"; + s1[i] = '0'; - // strict mode fails with leading chars - BEAST_EXPECT(!fromHex.SetHex(" 0x" + to_string(u), true)); - fromHex = z; - - // SetHex ignores extra leading hexits, so the parsed value - // is still correct for the following case (strict or non-strict) - BEAST_EXPECT(fromHex.SetHex("DEAD" + to_string(u), true)); - BEAST_EXPECT(fromHex == u); - fromHex = z; - - BEAST_EXPECT(fromHex.SetHex("DEAD" + to_string(u), false)); - BEAST_EXPECT(fromHex == u); - fromHex = z; + BEAST_EXPECT(tmp.parseHex(s1)); + BEAST_EXPECT(to_string(tmp) == s1); + } } }; diff --git a/src/test/conditions/PreimageSha256_test.cpp b/src/test/conditions/PreimageSha256_test.cpp index d9df96226c..cf4bc8c7c1 100644 --- a/src/test/conditions/PreimageSha256_test.cpp +++ b/src/test/conditions/PreimageSha256_test.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -37,29 +38,9 @@ class PreimageSha256_test : public beast::unit_test::suite inline Buffer hexblob(std::string const& s) { - std::vector x; - x.reserve(s.size() / 2); - - auto iter = s.cbegin(); - - while (iter != s.cend()) - { - int cHigh = charUnHex(*iter++); - - if (cHigh < 0) - return {}; - - int cLow = charUnHex(*iter++); - - if (cLow < 0) - return {}; - - x.push_back( - static_cast(cHigh << 4) | - static_cast(cLow)); - } - - return {x.data(), x.size()}; + auto blob = strUnHex(s); + BEAST_EXPECT(blob); + return {blob->data(), blob->size()}; } void diff --git a/src/test/jtx/impl/Env.cpp b/src/test/jtx/impl/Env.cpp index 855dfe7bbf..a8c5aca49b 100644 --- a/src/test/jtx/impl/Env.cpp +++ b/src/test/jtx/impl/Env.cpp @@ -327,7 +327,9 @@ Env::sign_and_submit(JTx const& jt, Json::Value params) params[jss::tx_json] = jt.jv; jr = client().invoke("submit", params); } - txid_.SetHex(jr[jss::result][jss::tx_json][jss::hash].asString()); + + if (!txid_.parseHex(jr[jss::result][jss::tx_json][jss::hash].asString())) + txid_.zero(); std::tie(ter_, didApply) = parseResult(jr); diff --git a/src/test/ledger/Directory_test.cpp b/src/test/ledger/Directory_test.cpp index 39d319ad9b..183e82d9a7 100644 --- a/src/test/ledger/Directory_test.cpp +++ b/src/test/ledger/Directory_test.cpp @@ -326,11 +326,11 @@ struct Directory_test : public beast::unit_test::suite env.close(); uint256 base; - base.SetHex( + (void)base.parseHex( "fb71c9aa3310141da4b01d6c744a98286af2d72ab5448d5adc0910ca0c910880"); uint256 item; - item.SetHex( + (void)item.parseHex( "bad0f021aa3b2f6754a8fe82a5779730aa0bbbab82f17201ef24900efc2c7312"); { diff --git a/src/test/overlay/compression_test.cpp b/src/test/overlay/compression_test.cpp index f5f0817a9d..041659b372 100644 --- a/src/test/overlay/compression_test.cpp +++ b/src/test/overlay/compression_test.cpp @@ -203,18 +203,11 @@ public: env.trust(bob["USD"](fund), alice); env.close(); - auto toBinary = [](std::string const& text) { - std::string binary; - for (size_t i = 0; i < text.size(); ++i) - { - unsigned int c = charUnHex(text[i]); - c = c << 4; - ++i; - c = c | charUnHex(text[i]); - binary.push_back(c); - } - - return binary; + auto toBinary = [this](std::string const& text) { + auto blob = strUnHex(text); + BEAST_EXPECT(blob); + return std::string{ + reinterpret_cast(blob->data()), blob->size()}; }; std::string usdTxBlob = ""; diff --git a/src/test/protocol/STAmount_test.cpp b/src/test/protocol/STAmount_test.cpp index 10c4e1d4ab..bd3e96694f 100644 --- a/src/test/protocol/STAmount_test.cpp +++ b/src/test/protocol/STAmount_test.cpp @@ -306,9 +306,6 @@ public: const std::string cur = "015841551A748AD2C1F76FF6ECB0CCCD00000000"; unexpected(!to_currency(c, cur), "create custom currency"); unexpected(to_string(c) != cur, "check custom currency"); - unexpected( - c != Currency(from_hex_text(cur)), - "check custom currency"); } //-------------------------------------------------------------------------- diff --git a/src/test/protocol/digest_test.cpp b/src/test/protocol/digest_test.cpp deleted file mode 100644 index 7c82b5e768..0000000000 --- a/src/test/protocol/digest_test.cpp +++ /dev/null @@ -1,160 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2012, 2013 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ripple { - -class digest_test : public beast::unit_test::suite -{ - std::vector dataset1; - - template - void - test(char const* name) - { - using namespace std::chrono; - - // Prime the cache - for (int i = 0; i != 4; i++) - { - for (auto const& x : dataset1) - { - Hasher h; - h(x.data(), x.size()); - (void)static_cast(h); - } - } - - std::array results; - - for (auto& result : results) - { - auto const start = high_resolution_clock::now(); - - for (auto const& x : dataset1) - { - Hasher h; - h(x.data(), x.size()); - (void)static_cast(h); - } - - auto const d = high_resolution_clock::now() - start; - - result = d; - } - - log << " " << name << ":" << '\n'; - - auto const sum = - std::accumulate(results.begin(), results.end(), nanoseconds{0}); - { - auto s = duration_cast(sum); - auto ms = duration_cast(sum) - s; - log << " Total Time = " << s.count() << "." << ms.count() - << " seconds" << std::endl; - } - - auto const mean = sum / results.size(); - { - auto s = duration_cast(mean); - auto ms = duration_cast(mean) - s; - log << " Mean Time = " << s.count() << "." << ms.count() - << " seconds" << std::endl; - } - - std::vector diff(results.size()); - std::transform( - results.begin(), - results.end(), - diff.begin(), - [&mean](nanoseconds trial) { return (trial - mean).count(); }); - auto const sq_sum = - std::inner_product(diff.begin(), diff.end(), diff.begin(), 0.0); - { - nanoseconds const stddev{static_cast( - std::sqrt(sq_sum / results.size()))}; - auto s = duration_cast(stddev); - auto ms = duration_cast(stddev) - s; - log << " Std Dev = " << s.count() << "." << ms.count() - << " seconds" << std::endl; - } - } - -public: - digest_test() - { - beast::xor_shift_engine g(19207813); - std::array buf; - - for (int i = 0; i < 1000000; i++) - { - beast::rngfill(buf.data(), buf.size(), g); - dataset1.push_back(uint256{buf}); - } - } - - void - testSHA512() - { - testcase("SHA512"); - test("OpenSSL"); - test("Beast"); - pass(); - } - - void - testSHA256() - { - testcase("SHA256"); - test("OpenSSL"); - test("Beast"); - pass(); - } - - void - testRIPEMD160() - { - testcase("RIPEMD160"); - test("OpenSSL"); - test("Beast"); - pass(); - } - - void - run() override - { - testSHA512(); - testSHA256(); - testRIPEMD160(); - } -}; - -BEAST_DEFINE_TESTSUITE_MANUAL_PRIO(digest, ripple_data, ripple, 20); - -} // namespace ripple diff --git a/src/test/rpc/AccountObjects_test.cpp b/src/test/rpc/AccountObjects_test.cpp index 8f77b6ce9d..70c70e6977 100644 --- a/src/test/rpc/AccountObjects_test.cpp +++ b/src/test/rpc/AccountObjects_test.cpp @@ -34,10 +34,10 @@ static char const* bobs_account_objects[] = { R"json({ "Account" : "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", "BookDirectory" : "50AD0A9E54D2B381288D535EB724E4275FFBF41580D28A925D038D7EA4C68000", - "BookNode" : "0000000000000000", + "BookNode" : "0", "Flags" : 65536, "LedgerEntryType" : "Offer", - "OwnerNode" : "0000000000000000", + "OwnerNode" : "0", "Sequence" : 6, "TakerGets" : { "currency" : "USD", @@ -59,14 +59,14 @@ static char const* bobs_account_objects[] = { "issuer" : "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", "value" : "1000" }, - "HighNode" : "0000000000000000", + "HighNode" : "0", "LedgerEntryType" : "RippleState", "LowLimit" : { "currency" : "USD", "issuer" : "r9cZvwKU3zzuZK9JFovGg1JC5n7QiqNL8L", "value" : "0" }, - "LowNode" : "0000000000000000", + "LowNode" : "0", "index" : "D13183BCFFC9AAC9F96AEBB5F66E4A652AD1F5D10273AEB615478302BEBFD4A4" })json", R"json({ @@ -81,23 +81,23 @@ static char const* bobs_account_objects[] = { "issuer" : "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", "value" : "1000" }, - "HighNode" : "0000000000000000", + "HighNode" : "0", "LedgerEntryType" : "RippleState", "LowLimit" : { "currency" : "USD", "issuer" : "r32rQHyesiTtdWFU7UJVtff4nCR5SHCbJW", "value" : "0" }, - "LowNode" : "0000000000000000", + "LowNode" : "0", "index" : "D89BC239086183EB9458C396E643795C1134963E6550E682A190A5F021766D43" })json", R"json({ "Account" : "rPMh7Pi9ct699iZUTWaytJUoHcJ7cgyziK", "BookDirectory" : "B025997A323F5C3E03DDF1334471F5984ABDE31C59D463525D038D7EA4C68000", - "BookNode" : "0000000000000000", + "BookNode" : "0", "Flags" : 65536, "LedgerEntryType" : "Offer", - "OwnerNode" : "0000000000000000", + "OwnerNode" : "0", "Sequence" : 7, "TakerGets" : { "currency" : "USD", @@ -287,9 +287,6 @@ public: auto& aobj = resp[jss::result][jss::account_objects][i]; aobj.removeMember("PreviousTxnID"); aobj.removeMember("PreviousTxnLgrSeq"); - - if (aobj != bobj[i]) - std::cout << "Fail at " << i << ": " << aobj << std::endl; BEAST_EXPECT(aobj == bobj[i]); } } diff --git a/src/test/rpc/AccountSet_test.cpp b/src/test/rpc/AccountSet_test.cpp index b9745f3ecd..a3fe45e774 100644 --- a/src/test/rpc/AccountSet_test.cpp +++ b/src/test/rpc/AccountSet_test.cpp @@ -258,11 +258,11 @@ public: env.fund(XRP(10000), alice); auto jt = noop(alice); - uint256 somehash = from_hex_text( - "9633ec8af54f16b5286db1d7b519ef49eefc050c0c8ac4384f1d88acd1bfdf05"); - jt[sfWalletLocator.fieldName] = to_string(somehash); + std::string const locator = + "9633EC8AF54F16B5286DB1D7B519EF49EEFC050C0C8AC4384F1D88ACD1BFDF05"; + jt[sfWalletLocator.fieldName] = locator; env(jt); - BEAST_EXPECT((*env.le(alice))[sfWalletLocator] == somehash); + BEAST_EXPECT(to_string((*env.le(alice))[sfWalletLocator]) == locator); jt[sfWalletLocator.fieldName] = ""; env(jt); @@ -280,11 +280,10 @@ public: env.fund(XRP(10000), alice); auto jt = noop(alice); - uint128 somehash = - from_hex_text("fff680681c2f5e6095324e2e08838f221a72ab4f"); - jt[sfEmailHash.fieldName] = to_string(somehash); + std::string const mh("5F31A79367DC3137FADA860C05742EE6"); + jt[sfEmailHash.fieldName] = mh; env(jt); - BEAST_EXPECT((*env.le(alice))[sfEmailHash] == somehash); + BEAST_EXPECT(to_string((*env.le(alice))[sfEmailHash]) == mh); jt[sfEmailHash.fieldName] = ""; env(jt); diff --git a/src/test/rpc/Book_test.cpp b/src/test/rpc/Book_test.cpp index 548f0b6eb8..a2ebc21cb9 100644 --- a/src/test/rpc/Book_test.cpp +++ b/src/test/rpc/Book_test.cpp @@ -1054,10 +1054,10 @@ public: BEAST_EXPECT( jrOffer[sfBookDirectory.fieldName] == getBookDir(env, XRP, USD.issue())); - BEAST_EXPECT(jrOffer[sfBookNode.fieldName] == "0000000000000000"); + BEAST_EXPECT(jrOffer[sfBookNode.fieldName] == "0"); BEAST_EXPECT(jrOffer[jss::Flags] == 0); BEAST_EXPECT(jrOffer[sfLedgerEntryType.fieldName] == jss::Offer); - BEAST_EXPECT(jrOffer[sfOwnerNode.fieldName] == "0000000000000000"); + BEAST_EXPECT(jrOffer[sfOwnerNode.fieldName] == "0"); BEAST_EXPECT(jrOffer[sfSequence.fieldName] == 5); BEAST_EXPECT( jrOffer[jss::TakerGets] == @@ -1110,10 +1110,10 @@ public: BEAST_EXPECT( jrNextOffer[sfBookDirectory.fieldName] == getBookDir(env, XRP, USD.issue())); - BEAST_EXPECT(jrNextOffer[sfBookNode.fieldName] == "0000000000000000"); + BEAST_EXPECT(jrNextOffer[sfBookNode.fieldName] == "0"); BEAST_EXPECT(jrNextOffer[jss::Flags] == 0); BEAST_EXPECT(jrNextOffer[sfLedgerEntryType.fieldName] == jss::Offer); - BEAST_EXPECT(jrNextOffer[sfOwnerNode.fieldName] == "0000000000000000"); + BEAST_EXPECT(jrNextOffer[sfOwnerNode.fieldName] == "0"); BEAST_EXPECT(jrNextOffer[sfSequence.fieldName] == 5); BEAST_EXPECT( jrNextOffer[jss::TakerGets] == diff --git a/src/test/rpc/Feature_test.cpp b/src/test/rpc/Feature_test.cpp index 5773f75666..89b9763952 100644 --- a/src/test/rpc/Feature_test.cpp +++ b/src/test/rpc/Feature_test.cpp @@ -129,7 +129,7 @@ class Feature_test : public beast::unit_test::suite ++it) { uint256 id; - id.SetHexExact(it.key().asString().c_str()); + (void)id.parseHex(it.key().asString().c_str()); if (!BEAST_EXPECT((*it).isMember(jss::name))) return; bool expectEnabled = env.app().getAmendmentTable().isEnabled(id); diff --git a/src/test/rpc/LedgerRPC_test.cpp b/src/test/rpc/LedgerRPC_test.cpp index b58d213590..d0070857d3 100644 --- a/src/test/rpc/LedgerRPC_test.cpp +++ b/src/test/rpc/LedgerRPC_test.cpp @@ -249,10 +249,10 @@ class LedgerRPC_test : public beast::unit_test::suite Env env{*this, envconfig(no_admin)}; - env.close(); + // env.close(); Json::Value jvParams; - jvParams[jss::ledger_index] = 3u; + jvParams[jss::ledger_index] = 1u; jvParams[jss::full] = true; auto const jrr = env.rpc("json", "ledger", to_string(jvParams))[jss::result]; @@ -1345,9 +1345,8 @@ class LedgerRPC_test : public beast::unit_test::suite "json", "ledger", boost::lexical_cast(jvParams))[jss::result]; - BEAST_EXPECT(jrr.isMember(jss::ledger)); - BEAST_EXPECT(jrr.isMember(jss::ledger_hash)); - BEAST_EXPECT(jrr[jss::ledger][jss::ledger_index] == "3"); + BEAST_EXPECT(jrr[jss::error] == "invalidParams"); + BEAST_EXPECT(jrr[jss::error_message] == "ledgerHashMalformed"); // request with non-string ledger_hash jvParams[jss::ledger_hash] = 2; diff --git a/src/test/rpc/Submit_test.cpp b/src/test/rpc/Submit_test.cpp index bd8047372e..252e1c32a8 100644 --- a/src/test/rpc/Submit_test.cpp +++ b/src/test/rpc/Submit_test.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include #include @@ -73,18 +74,11 @@ public: env.trust(bob["USD"](TestData::fund), alice); env.close(); - auto toBinary = [](std::string const& text) { - std::string binary; - for (size_t i = 0; i < text.size(); ++i) - { - unsigned int c = charUnHex(text[i]); - c = c << 4; - ++i; - c = c | charUnHex(text[i]); - binary.push_back(c); - } - - return binary; + auto toBinary = [this](std::string const& text) { + auto blob = strUnHex(text); + BEAST_EXPECT(blob); + return std::string{ + reinterpret_cast(blob->data()), blob->size()}; }; // use a websocket client to fill transaction blobs diff --git a/src/test/rpc/TransactionEntry_test.cpp b/src/test/rpc/TransactionEntry_test.cpp index 1d81355c9d..a477a62485 100644 --- a/src/test/rpc/TransactionEntry_test.cpp +++ b/src/test/rpc/TransactionEntry_test.cpp @@ -66,7 +66,7 @@ class TransactionEntry_test : public beast::unit_test::suite auto const result = env.client().invoke("transaction_entry", params)[jss::result]; BEAST_EXPECT(!result[jss::ledger_hash].asString().empty()); - BEAST_EXPECT(result[jss::error] == "transactionNotFound"); + BEAST_EXPECT(result[jss::error] == "malformedRequest"); BEAST_EXPECT(result[jss::status] == "error"); } diff --git a/src/test/shamap/SHAMap_test.cpp b/src/test/shamap/SHAMap_test.cpp index 49d5d5638e..6b1d5c6d66 100644 --- a/src/test/shamap/SHAMap_test.cpp +++ b/src/test/shamap/SHAMap_test.cpp @@ -143,15 +143,15 @@ public: // h3 and h4 differ only in the leaf, same terminal node (level 19) uint256 h1, h2, h3, h4, h5; - h1.SetHex( + (void)h1.parseHex( "092891fe4ef6cee585fdc6fda0e09eb4d386363158ec3321b8123e5a772c6ca7"); - h2.SetHex( + (void)h2.parseHex( "436ccbac3347baa1f1e53baeef1f43334da88f1f6d70d963b833afd6dfa289fe"); - h3.SetHex( + (void)h3.parseHex( "b92891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6ca8"); - h4.SetHex( + (void)h4.parseHex( "b92891fe4ef6cee585fdc6fda2e09eb4d386363158ec3321b8123e5a772c6ca8"); - h5.SetHex( + (void)h5.parseHex( "a92891fe4ef6cee585fdc6fda0e09eb4d386363158ec3321b8123e5a772c6ca7"); SHAMap sMap(SHAMapType::FREE, f); @@ -223,54 +223,54 @@ public: testcase("build/tear unbacked"); { std::vector keys(8); - keys[0].SetHex( + (void)keys[0].parseHex( "b92891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[1].SetHex( + (void)keys[1].parseHex( "b92881fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[2].SetHex( + (void)keys[2].parseHex( "b92691fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[3].SetHex( + (void)keys[3].parseHex( "b92791fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[4].SetHex( + (void)keys[4].parseHex( "b91891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[5].SetHex( + (void)keys[5].parseHex( "b99891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[6].SetHex( + (void)keys[6].parseHex( "f22891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[7].SetHex( + (void)keys[7].parseHex( "292891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); std::vector hashes(8); - hashes[0].SetHex( + (void)hashes[0].parseHex( "B7387CFEA0465759ADC718E8C42B52D2309D179B326E239EB5075C64B6281F" "7F"); - hashes[1].SetHex( + (void)hashes[1].parseHex( "FBC195A9592A54AB44010274163CB6BA95F497EC5BA0A8831845467FB2ECE2" "66"); - hashes[2].SetHex( + (void)hashes[2].parseHex( "4E7D2684B65DFD48937FFB775E20175C43AF0C94066F7D5679F51AE756795B" "75"); - hashes[3].SetHex( + (void)hashes[3].parseHex( "7A2F312EB203695FFD164E038E281839EEF06A1B99BFC263F3CECC6C74F93E" "07"); - hashes[4].SetHex( + (void)hashes[4].parseHex( "395A6691A372387A703FB0F2C6D2C405DAF307D0817F8F0E207596462B0E3A" "3E"); - hashes[5].SetHex( + (void)hashes[5].parseHex( "D044C0A696DE3169CC70AE216A1564D69DE96582865796142CE7D98A84D9DD" "E4"); - hashes[6].SetHex( + (void)hashes[6].parseHex( "76DCC77C4027309B5A91AD164083264D70B77B5E43E08AEDA5EBF943611436" "15"); - hashes[7].SetHex( + (void)hashes[7].parseHex( "DF4220E93ADC6F5569063A01B4DC79F8DB9553B6A3222ADE23DEA02BBE7230" "E5"); @@ -302,28 +302,28 @@ public: { std::vector keys(8); - keys[0].SetHex( + (void)keys[0].parseHex( "f22891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[1].SetHex( + (void)keys[1].parseHex( "b99891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[2].SetHex( + (void)keys[2].parseHex( "b92891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[3].SetHex( + (void)keys[3].parseHex( "b92881fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[4].SetHex( + (void)keys[4].parseHex( "b92791fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[5].SetHex( + (void)keys[5].parseHex( "b92691fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[6].SetHex( + (void)keys[6].parseHex( "b91891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8"); - keys[7].SetHex( + (void)keys[7].parseHex( "292891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c" "a8");