xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
tests
libxrpl
basics
hardened_hash.cpp
1
#include <xrpl/basics/hardened_hash.h>
2
3
#include <xrpl/beast/hash/hash_append.h>
4
5
#include <gtest/gtest.h>
6
7
#include <
array
>
8
#include <
cstddef
>
9
#include <
cstdint
>
10
#include <
iomanip
>
11
#include <
ios
>
12
#include <
ostream
>
13
#include <
string
>
14
#include <
type_traits
>
15
#include <
unordered_map
>
16
#include <
unordered_set
>
17
18
namespace
xrpl::detail
{
19
20
template
<
class
T>
21
class
TestUserTypeMember
22
{
23
private
:
24
T
t_
;
25
26
public
:
27
explicit
TestUserTypeMember
(T
const
& t = T()) :
t_
(t)
28
{
29
}
30
31
template
<
class
Hasher>
32
friend
void
33
// NOLINTNEXTLINE(readability-identifier-naming)
34
hash_append
(Hasher& h,
TestUserTypeMember
const
& a)
noexcept
35
{
36
using
beast::hash_append
;
37
hash_append
(h, a.t_);
38
}
39
};
40
41
template
<
class
T>
42
class
TestUserTypeFree
43
{
44
private
:
45
T
t_
;
46
47
public
:
48
explicit
TestUserTypeFree
(T
const
& t = T()) :
t_
(t)
49
{
50
}
51
52
template
<
class
Hasher>
53
friend
void
54
// NOLINTNEXTLINE(readability-identifier-naming)
55
hash_append
(Hasher& h,
TestUserTypeFree
const
& a)
noexcept
56
{
57
using
beast::hash_append
;
58
hash_append
(h, a.t_);
59
}
60
};
61
62
}
// namespace xrpl::detail
63
64
//------------------------------------------------------------------------------
65
66
namespace
xrpl
{
67
68
namespace
detail {
69
70
template
<
class
T>
71
using
TestHardenedUnorderedSet
=
std::unordered_set<T, HardenedHash<>
>;
72
73
template
<
class
T>
74
using
TestHardenedUnorderedMap
=
std::unordered_map<T, int, HardenedHash<>
>;
75
76
template
<
class
T>
77
using
TestHardenedUnorderedMultiset
=
std::unordered_multiset<T, HardenedHash<>
>;
78
79
template
<
class
T>
80
using
TestHardenedUnorderedMultimap
=
std::unordered_multimap<T, int, HardenedHash<>
>;
81
82
}
// namespace detail
83
84
template
<std::
size_t
Bits,
class
UInt = std::u
int
64_t>
85
class
UnsignedInteger
86
{
87
private
:
88
static_assert
(
89
std::is_integral_v<UInt>
&&
std::is_unsigned_v<UInt>
,
90
"UInt must be an unsigned integral type"
);
91
92
static_assert
(Bits % (8 *
sizeof
(UInt)) == 0,
"Bits must be a multiple of 8*sizeof(UInt)"
);
93
94
static_assert
(Bits >= (8 *
sizeof
(UInt)),
"Bits must be at least 8*sizeof(UInt)"
);
95
96
static
std::size_t
const
kSize
= Bits / (8 *
sizeof
(UInt));
97
98
std::array<UInt, kSize>
vec_
;
99
100
public
:
101
using
value_type
= UInt;
102
103
static
std::size_t
const
kBits
= Bits;
104
static
std::size_t
const
kBytes
=
kBits
/ 8;
105
106
template
<
class
Int>
107
static
UnsignedInteger
108
fronumber
(Int v)
109
{
110
UnsignedInteger
result;
111
for
(
std::size_t
i(1); i <
kSize
; ++i)
112
result.
vec_
[i] = 0;
113
result.
vec_
[0] = v;
114
return
result;
115
}
116
117
void
*
118
data
() noexcept
119
{
120
return
&
vec_
[0];
121
}
122
123
[[nodiscard]]
void
const
*
124
data
() const noexcept
125
{
126
return
&
vec_
[0];
127
}
128
129
template
<
class
Hasher>
130
friend
void
131
hash_append
(Hasher& h,
UnsignedInteger
const
& a)
noexcept
132
{
133
using
beast::hash_append
;
134
hash_append
(h, a.vec_);
135
}
136
137
friend
std::ostream
&
138
operator<<
(
std::ostream
& s,
UnsignedInteger
const
& v)
139
{
140
for
(
std::size_t
i(0); i <
kSize
; ++i)
141
s <<
std::hex
<<
std::setfill
(
'0'
) <<
std::setw
(2 *
sizeof
(UInt)) << v.
vec_
[i];
142
return
s;
143
}
144
};
145
146
using
Sha256T
=
UnsignedInteger<256, std::size_t>
;
147
148
#ifndef __INTELLISENSE__
149
static_assert
(
Sha256T::kBits
== 256,
"sha256_t must have 256 bits"
);
150
#endif
151
152
}
// namespace xrpl
153
154
//------------------------------------------------------------------------------
155
156
namespace
xrpl
{
157
158
class
HardenedHashTest
:
public
::testing::Test
159
{
160
public
:
161
template
<
class
T>
162
static
void
163
check
()
164
{
165
T t{};
166
HardenedHash<>
()(t);
167
SUCCEED();
168
}
169
170
template
<
template
<
class
T>
class
U>
171
static
void
172
checkUserType
()
173
{
174
check<U<bool>
>();
175
check<U<char>
>();
176
check<U<signed char>
>();
177
check<U<unsigned char>
>();
178
// These cause trouble for boost
179
// check <U <char16_t>> ();
180
// check <U <char32_t>> ();
181
check<U<wchar_t>
>();
182
check<U<short>
>();
183
check<U<unsigned short>
>();
184
check<U<int>
>();
185
check<U<unsigned int>
>();
186
check<U<long>
>();
187
check<U<long long>
>();
188
check<U<unsigned long>
>();
189
check<U<unsigned long long>
>();
190
check<U<float>
>();
191
check<U<double>
>();
192
check<U<long double>
>();
193
}
194
195
template
<
template
<
class
T>
class
C>
196
static
void
197
checkContainer
()
198
{
199
{
200
C<detail::TestUserTypeMember<std::string>>
const
c;
201
}
202
203
SUCCEED();
204
205
{
206
C<detail::TestUserTypeFree<std::string>>
const
c;
207
}
208
209
SUCCEED();
210
}
211
};
212
213
TEST_F
(
HardenedHashTest
, user_types)
214
{
215
checkUserType<detail::TestUserTypeMember>();
216
checkUserType<detail::TestUserTypeFree>();
217
}
218
219
TEST_F
(
HardenedHashTest
, containers)
220
{
221
checkContainer<detail::TestHardenedUnorderedSet>();
222
checkContainer<detail::TestHardenedUnorderedMap>();
223
checkContainer<detail::TestHardenedUnorderedMultiset>();
224
checkContainer<detail::TestHardenedUnorderedMultimap>();
225
}
226
227
}
// namespace xrpl
array
std::ostream
xrpl::HardenedHashTest
Definition
hardened_hash.cpp:159
xrpl::HardenedHashTest::check
static void check()
Definition
hardened_hash.cpp:163
xrpl::HardenedHashTest::checkContainer
static void checkContainer()
Definition
hardened_hash.cpp:197
xrpl::HardenedHashTest::checkUserType
static void checkUserType()
Definition
hardened_hash.cpp:172
xrpl::HardenedHash
Seed functor once per construction.
Definition
hardened_hash.h:72
xrpl::UnsignedInteger
Definition
hardened_hash.cpp:86
xrpl::UnsignedInteger::fronumber
static UnsignedInteger fronumber(Int v)
Definition
hardened_hash.cpp:108
xrpl::UnsignedInteger< 256, std::size_t >::kBits
static std::size_t const kBits
Definition
hardened_hash.cpp:103
xrpl::UnsignedInteger< 256, std::size_t >::kBytes
static std::size_t const kBytes
Definition
hardened_hash.cpp:104
xrpl::UnsignedInteger< 256, std::size_t >::vec_
std::array< std::size_t, kSize > vec_
Definition
hardened_hash.cpp:98
xrpl::UnsignedInteger::hash_append
friend void hash_append(Hasher &h, UnsignedInteger const &a) noexcept
Definition
hardened_hash.cpp:131
xrpl::UnsignedInteger::value_type
UInt value_type
Definition
hardened_hash.cpp:101
xrpl::UnsignedInteger::data
void const * data() const noexcept
Definition
hardened_hash.cpp:124
xrpl::UnsignedInteger::operator<<
friend std::ostream & operator<<(std::ostream &s, UnsignedInteger const &v)
Definition
hardened_hash.cpp:138
xrpl::UnsignedInteger< 256, std::size_t >::kSize
static std::size_t const kSize
Definition
hardened_hash.cpp:96
xrpl::UnsignedInteger::data
void * data() noexcept
Definition
hardened_hash.cpp:118
xrpl::detail::TestUserTypeFree::t_
T t_
Definition
hardened_hash.cpp:45
xrpl::detail::TestUserTypeFree::TestUserTypeFree
TestUserTypeFree(T const &t=T())
Definition
hardened_hash.cpp:48
xrpl::detail::TestUserTypeFree::hash_append
friend void hash_append(Hasher &h, TestUserTypeFree const &a) noexcept
Definition
hardened_hash.cpp:55
xrpl::detail::TestUserTypeMember::t_
T t_
Definition
hardened_hash.cpp:24
xrpl::detail::TestUserTypeMember::hash_append
friend void hash_append(Hasher &h, TestUserTypeMember const &a) noexcept
Definition
hardened_hash.cpp:34
xrpl::detail::TestUserTypeMember::TestUserTypeMember
TestUserTypeMember(T const &t=T())
Definition
hardened_hash.cpp:27
cstddef
cstdint
std::hex
T hex(T... args)
iomanip
ios
std::is_integral_v
T is_integral_v
std::is_unsigned_v
T is_unsigned_v
beast::hash_append
void hash_append(Hasher &h, T const &t) noexcept
Logically concatenate input data to a Hasher.
Definition
hash_append.h:206
xrpl::detail
Definition
base_uint.h:37
xrpl::detail::TestHardenedUnorderedMultiset
std::unordered_multiset< T, HardenedHash<> > TestHardenedUnorderedMultiset
Definition
hardened_hash.cpp:77
xrpl::detail::TestHardenedUnorderedMultimap
std::unordered_multimap< T, int, HardenedHash<> > TestHardenedUnorderedMultimap
Definition
hardened_hash.cpp:80
xrpl::detail::TestHardenedUnorderedSet
std::unordered_set< T, HardenedHash<> > TestHardenedUnorderedSet
Definition
hardened_hash.cpp:71
xrpl::detail::TestHardenedUnorderedMap
std::unordered_map< T, int, HardenedHash<> > TestHardenedUnorderedMap
Definition
hardened_hash.cpp:74
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::TEST_F
TEST_F(HardenedHashTest, user_types)
Definition
hardened_hash.cpp:213
xrpl::Sha256T
UnsignedInteger< 256, std::size_t > Sha256T
Definition
hardened_hash.cpp:146
ostream
std::setfill
T setfill(T... args)
std::setw
T setw(T... args)
std::size_t
string
type_traits
unordered_map
std::unordered_multimap
std::unordered_multiset
unordered_set
Generated by
1.17.0