xrpld
Loading...
Searching...
No Matches
hardened_hash_test.cpp
1#include <xrpl/basics/hardened_hash.h>
2#include <xrpl/beast/unit_test/suite.h>
3
4#include <array>
5#include <cstddef>
6#include <cstdint>
7#include <iomanip>
8#include <ios>
9#include <ostream>
10#include <string>
11#include <type_traits>
12#include <unordered_map>
13#include <unordered_set>
14
15namespace xrpl::detail {
16
17template <class T>
19{
20private:
21 T t_;
22
23public:
24 explicit TestUserTypeMember(T const& t = T()) : t_(t)
25 {
26 }
27
28 template <class Hasher>
29 friend void
30 // NOLINTNEXTLINE(readability-identifier-naming)
31 hash_append(Hasher& h, TestUserTypeMember const& a) noexcept
32 {
34 hash_append(h, a.t_);
35 }
36};
37
38template <class T>
40{
41private:
42 T t_;
43
44public:
45 explicit TestUserTypeFree(T const& t = T()) : t_(t)
46 {
47 }
48
49 template <class Hasher>
50 friend void
51 // NOLINTNEXTLINE(readability-identifier-naming)
52 hash_append(Hasher& h, TestUserTypeFree const& a) noexcept
53 {
55 hash_append(h, a.t_);
56 }
57};
58
59} // namespace xrpl::detail
60
61//------------------------------------------------------------------------------
62
63namespace xrpl {
64
65namespace detail {
66
67template <class T>
69
70template <class T>
72
73template <class T>
75
76template <class T>
78
79} // namespace detail
80
81template <std::size_t Bits, class UInt = std::uint64_t>
83{
84private:
85 static_assert(
87 "UInt must be an unsigned integral type");
88
89 static_assert(Bits % (8 * sizeof(UInt)) == 0, "Bits must be a multiple of 8*sizeof(UInt)");
90
91 static_assert(Bits >= (8 * sizeof(UInt)), "Bits must be at least 8*sizeof(UInt)");
92
93 static std::size_t const kSize = Bits / (8 * sizeof(UInt));
94
96
97public:
98 using value_type = UInt;
99
100 static std::size_t const kBits = Bits;
101 static std::size_t const kBytes = kBits / 8;
102
103 template <class Int>
104 static UnsignedInteger
106 {
107 UnsignedInteger result;
108 for (std::size_t i(1); i < kSize; ++i)
109 result.vec_[i] = 0;
110 result.vec_[0] = v;
111 return result;
112 }
113
114 void*
115 data() noexcept
116 {
117 return &vec_[0];
118 }
119
120 [[nodiscard]] void const*
121 data() const noexcept
122 {
123 return &vec_[0];
124 }
125
126 template <class Hasher>
127 friend void
128 hash_append(Hasher& h, UnsignedInteger const& a) noexcept
129 {
130 using beast::hash_append;
131 hash_append(h, a.vec_);
132 }
133
136 {
137 for (std::size_t i(0); i < kSize; ++i)
138 s << std::hex << std::setfill('0') << std::setw(2 * sizeof(UInt)) << v.vec_[i];
139 return s;
140 }
141};
142
144
145#ifndef __INTELLISENSE__
146static_assert(sha256_t::kBits == 256, "sha256_t must have 256 bits");
147#endif
148
149} // namespace xrpl
150
151//------------------------------------------------------------------------------
152
153namespace xrpl {
154
156{
157public:
158 template <class T>
159 void
161 {
162 T t{};
163 HardenedHash<>()(t);
164 pass();
165 }
166
167 template <template <class T> class U>
168 void
170 {
171 check<U<bool>>();
172 check<U<char>>();
175 // These cause trouble for boost
176 // check <U <char16_t>> ();
177 // check <U <char32_t>> ();
181 check<U<int>>();
183 check<U<long>>();
190 }
191
192 template <template <class T> class C>
193 void
195 {
196 {
197 C<detail::TestUserTypeMember<std::string>> const c;
198 }
199
200 pass();
201
202 {
203 C<detail::TestUserTypeFree<std::string>> const c;
204 }
205
206 pass();
207 }
208
209 void
216
217 void
226
227 void
228 run() override
229 {
232 }
233};
234
235BEAST_DEFINE_TESTSUITE(hardened_hash, basics, xrpl);
236
237} // namespace xrpl
A testsuite class.
Definition suite.h:50
void pass()
Record a successful test condition.
Definition suite.h:500
TestcaseT testcase
Memberspace for declaring test cases.
Definition suite.h:149
Seed functor once per construction.
static UnsignedInteger fronumber(Int v)
std::array< std::size_t, kSize > vec_
friend void hash_append(Hasher &h, UnsignedInteger const &a) noexcept
void const * data() const noexcept
friend std::ostream & operator<<(std::ostream &s, UnsignedInteger const &v)
friend void hash_append(Hasher &h, TestUserTypeFree const &a) noexcept
friend void hash_append(Hasher &h, TestUserTypeMember const &a) noexcept
void run() override
Runs the suite.
T hex(T... args)
T is_integral_v
T is_unsigned_v
std::enable_if_t< IsContiguouslyHashable< T, Hasher >::value > hash_append(Hasher &h, T const &t) noexcept
Logically concatenate input data to a Hasher.
std::unordered_multiset< T, HardenedHash<> > test_hardened_unordered_multiset
std::unordered_set< T, HardenedHash<> > test_hardened_unordered_set
std::unordered_multimap< T, int, HardenedHash<> > test_hardened_unordered_multimap
std::unordered_map< T, int, HardenedHash<> > test_hardened_unordered_map
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
UnsignedInteger< 256, std::size_t > sha256_t
BEAST_DEFINE_TESTSUITE(AccountTxPaging, app, xrpl)
T setfill(T... args)
T setw(T... args)