25 #ifndef CRYPTO3_STATIC_DIGEST_HPP
26 #define CRYPTO3_STATIC_DIGEST_HPP
28 #include <boost/static_assert.hpp>
29 #include <boost/assert.hpp>
36 #include <nil/crypto3/detail/octet.hpp>
37 #include <nil/crypto3/detail/pack.hpp>
71 template<std::
size_t DigestBits>
72 class static_digest :
public std::array<octet_type, DigestBits / octet_bits> { };
75 template<std::
size_t DigestBits,
typename OutputIterator>
76 OutputIterator
to_ascii(
const static_digest<DigestBits> &d, OutputIterator it) {
77 for (std::size_t j = 0; j < DigestBits / octet_bits; ++j) {
79 *it++ =
"0123456789abcdef"[(b >> 4) & 0xF];
80 *it++ =
"0123456789abcdef"[(b >> 0) & 0xF];
85 template<std::
size_t DigestBits>
86 std::array<char, DigestBits / 4 + 1>
c_str(
const static_digest<DigestBits> &d) {
87 std::array<char, DigestBits / 4 + 1> s;
88 char *p = to_ascii<DigestBits>(d, s.data());
97 template<std::
size_t DigestBits>
100 return std::string(cstr.data(), cstr.size() - 1);
115 template<std::
size_t NewBits, std::
size_t OldBits>
116 static_digest<NewBits>
resize(
const static_digest<OldBits> &od) {
117 static_digest<NewBits> nd;
119 std::size_t bytes =
sizeof(
octet_type) * (NewBits < OldBits ? NewBits : OldBits) / octet_bits;
120 std::memcpy(nd.data(), od.data(), bytes);
134 template<std::
size_t NewBits, std::
size_t OldBits>
135 static_digest<NewBits>
truncate(
const static_digest<OldBits> &od) {
136 BOOST_STATIC_ASSERT(NewBits <= OldBits);
137 return resize<NewBits>(od);
140 template<std::
size_t DB1, std::
size_t DB2>
141 bool operator==(
const static_digest<DB1> &a,
const static_digest<DB2> &b) {
144 return static_cast<bool>(DB1 == DB2 ? std::equal(std::begin(a), std::end(a), std::begin(b), std::end(b)) :
148 template<std::
size_t DB1, std::
size_t DB2>
149 bool operator!=(
const static_digest<DB1> &a,
const static_digest<DB2> &b) {
153 template<std::
size_t DB1, std::
size_t DB2>
154 bool operator<(
const static_digest<DB1> &a,
const static_digest<DB2> &b) {
159 template<std::
size_t DB1, std::
size_t DB2>
160 bool operator>(
const static_digest<DB1> &a,
const static_digest<DB2> &b) {
164 template<std::
size_t DB1, std::
size_t DB2>
165 bool operator<=(
const static_digest<DB1> &a,
const static_digest<DB2> &b) {
169 template<std::
size_t DB1, std::
size_t DB2>
170 bool operator>=(
const static_digest<DB1> &a,
const static_digest<DB2> &b) {
174 template<std::
size_t DB>
175 bool operator!=(
const static_digest<DB> &a,
char const *b) {
176 BOOST_ASSERT(std::strlen(b) == DB / 4);
180 template<std::
size_t DB>
181 bool operator==(
const static_digest<DB> &a,
char const *b) {
185 template<std::
size_t DB>
186 bool operator!=(
char const *b,
const static_digest<DB> &a) {
190 template<std::
size_t DB>
191 bool operator==(
char const *b,
const static_digest<DB> &a) {
195 template<std::
size_t DigestBits>
196 std::ostream &
operator<<(std::ostream &sink,
const static_digest<DigestBits> &d) {
197 detail::to_ascii<DigestBits>(d, std::ostream_iterator<char>(sink));
201 template<std::
size_t DigestBits>
202 std::istream &
operator>>(std::istream &source, static_digest<DigestBits> &d) {
203 std::array<char, DigestBits / 4> a = {{}};
204 for (
unsigned i = 0; i < a.size(); ++i) {
206 if (!source.get(c)) {
207 source.setstate(std::ios::failbit);
210 if (!std::isxdigit(c, source.getloc())) {
212 source.setstate(std::ios::failbit);
216 if (std::isdigit(c, source.getloc())) {
219 a[i] = std::toupper(c, source.getloc()) -
'A' + 0xA;
222 detail::pack<stream_endian::big_bit, stream_endian::big_bit, 4, 8>(a.begin(), a.end(), d.begin());
std::string to_string(const nil::crypto3::digest< DigestBits > &d)
Definition: block/include/nil/crypto3/detail/digest.hpp:248
Definition: block/include/nil/crypto3/detail/static_digest.hpp:72
OutputIterator to_ascii(const digest< DigestBits > &d, OutputIterator it)
Definition: block/include/nil/crypto3/detail/digest.hpp:86
digest< DigestBits/4+1 > c_str(const digest< DigestBits > &d)
Definition: block/include/nil/crypto3/detail/digest.hpp:98
boost::uint_t< octet_bits >::least octet_type
Definition: algebra/include/nil/crypto3/detail/octet.hpp:33
std::istream & operator>>(std::istream &source, digest< DB > &d)
Definition: block/include/nil/crypto3/detail/digest.hpp:220
bool operator>(const digest< DB1 > &a, const digest< DB2 > &b)
Definition: block/include/nil/crypto3/detail/digest.hpp:178
bool operator<(const digest< DB1 > &a, const digest< DB2 > &b)
Definition: block/include/nil/crypto3/detail/digest.hpp:172
bool operator!=(const secure_allocator< T > &, const secure_allocator< U > &)
Definition: secure_allocator.hpp:98
std::ostream & operator<<(std::ostream &sink, digest< DB > const &d)
Definition: block/include/nil/crypto3/detail/digest.hpp:214
bool operator==(const secure_allocator< T > &, const secure_allocator< U > &)
Definition: secure_allocator.hpp:93
digest< DigestBits > resize(const digest< DigestBits > &od, std::size_t new_size)
Definition: block/include/nil/crypto3/detail/digest.hpp:131
digest< NewBits > truncate(const digest< OldBits > &od)
Definition: block/include/nil/crypto3/detail/digest.hpp:155
bool operator<=(const digest< DB1 > &a, const digest< DB2 > &b)
Definition: block/include/nil/crypto3/detail/digest.hpp:183
bool operator>=(const digest< DB1 > &a, const digest< DB2 > &b)
Definition: block/include/nil/crypto3/detail/digest.hpp:188