plebble
ripemd160.h
Go to the documentation of this file.
1 /*
2 -------------------------------------------------------------------------------
3  PLEBBLE
4 -------------------------------------------------------------------------------
5  Copyright (C) 2019-2020 KATLAS Technology. (http://katlastechnology.com)
6  Copyright (C) 2017-2020 Marcos Mayorga. (mm@mm-studios.com)
7 
8  This file is part of our Plebble(R) Platform.
9 
10  The code below cannot be copied, used for any purpose other than the one
11  agreed and/or distributed without the express permission of
12  KATLAS Technology.
13 -------------------------------------------------------------------------------
14 
15 
16 */
17 #ifndef USGOV_5a3346e45d07feaf4864a3e08a47717c8da7429ee7accc342f7bc496c9fdb846
18 #define USGOV_5a3346e45d07feaf4864a3e08a47717c8da7429ee7accc342f7bc496c9fdb846
19 
20 #include <stdint.h>
21 #include <stdlib.h>
22 #include <string>
23 #include <cassert>
24 #include <cstring>
25 #include <array>
26 #include <iostream>
27 #include <vector>
28 #include <us/gov/config.h>
29 
30 namespace us { namespace gov {
31 namespace crypto {
32 using namespace std;
33 
34  class ripemd160 {
35  public:
36  static constexpr size_t output_size = 20;
37 
38  struct value_type:array<unsigned char,output_size> {
39  typedef array<unsigned char,output_size> b;
40  typedef ripemd160 hasher_t;
43  value_type(unsigned int i);
44  value_type(const string& b58);
45 
46  bool operator == (const value_type& other) const;
47  bool operator != (const value_type& other) const;
48  bool operator < (const value_type& other) const;
49  void set(unsigned int i);
50  value_type& operator = (const string& b58);
51  value_type& operator = (unsigned int i);
52  bool is_zero() const;
53  bool is_not_zero() const;
54  void zero();
55  string to_b58() const;
56  string to_hex() const;
57  static value_type from_b58(const string&);
58  static value_type from_hex(const string&);
59  bool set_b58(const string&);
60  bool set_hex(const string&);
61  uint32_t uint32() const;
62 
63  template<typename T>
64  static value_type compute(const T& o) {
65  ripemd160 hasher;
66  hasher.write(o);
67  value_type r;
68  hasher.finalize(r);
69  return move(r);
70  }
71 
72  template<typename T1, typename T2>
73  static value_type compute(const T1& o1, const T2& o2) {
74  ripemd160 hasher;
75  hasher.write(o1);
76  hasher.write(o2);
77  value_type r;
78  hasher.finalize(r);
79  return move(r);
80  }
81  };
82 
84 
85  void write(const vector<unsigned char>&);
86  void write(const unsigned char* data, size_t len);
87  void write(const value_type&);
88  void write(const string&);
89  void write(const uint64_t&);
90  void write(const int64_t&);
91  void write(const uint32_t&);
92  void write(const int32_t&);
93  void write(bool);
94  void write(const double&);
95  void finalize(unsigned char hash[output_size]);
97  void reset();
98  static pair<ko, value_type> digest_file(const string& file);
99  static value_type digest(const vector<unsigned char>& buf);
100 
101 
102  private:
103  uint32_t s[5];
104  unsigned char buf[64];
105  uint64_t bytes;
106  static const unsigned char pad[64];
107 
108  };
109 
110 
111  inline ostream& operator << (ostream& os, const us::gov::crypto::ripemd160::value_type& v) {
112  os << v.to_b58();
113  return os;
114  }
115 
116  template<typename T>
118  h.write(v);
119  return h;
120  }
121 
122  inline istream& operator >> (istream& is, us::gov::crypto::ripemd160::value_type& v) {
123  string s;
124  is >> s;
125  if (!v.set_b58(s)) is.setstate(ios_base::failbit);
126  return is;
127  }
128 
129 }
130 }}
131 
132 namespace std {
133 
134  template <>
135  struct hash<us::gov::crypto::ripemd160::value_type> {
137  return *reinterpret_cast<const size_t*>(&k[0]);
138 
139  }
140  };
141 
142 }
143 
144 #endif
anonymous_namespace{ripemd160.cpp}::f5
uint32_t f5(uint32_t x, uint32_t y, uint32_t z)
Definition: ripemd160.cpp:38
anonymous_namespace{ripemd160.cpp}::f2
uint32_t f2(uint32_t x, uint32_t y, uint32_t z)
Definition: ripemd160.cpp:35
us::gov::crypto::ripemd160::write
void write(bool)
us::gov::crypto::ripemd160::value_type::value_type
value_type(unsigned int i)
us::gov::crypto::ripemd160::value_type::b
array< unsigned char, output_size > b
Definition: ripemd160.h:39
anonymous_namespace{ripemd160.cpp}::f1
uint32_t f1(uint32_t x, uint32_t y, uint32_t z)
Definition: ripemd160.cpp:34
us::gov::crypto::ripemd160::digest_file
static pair< ko, value_type > digest_file(const string &file)
anonymous_namespace{ripemd160.cpp}::f4
uint32_t f4(uint32_t x, uint32_t y, uint32_t z)
Definition: ripemd160.cpp:37
endian_rw.h
anonymous_namespace{ripemd160.cpp}::R31
void R31(uint32_t &a, uint32_t b, uint32_t &c, uint32_t d, uint32_t e, uint32_t x, int r)
Definition: ripemd160.cpp:57
us::gov::crypto::ripemd160::value_type::is_zero
bool is_zero() const
us::gov::crypto::ripemd160::value_type::compute
static value_type compute(const T &o)
Definition: ripemd160.h:64
us::gov::crypto::ripemd160::value_type::zero
void zero()
us::gov::crypto::ripemd160::write
void write(const int32_t &)
us::gov::crypto::ripemd160::finalize
void finalize(value_type &)
us::gov::crypto::ripemd160::write
void write(const uint64_t &)
us::gov::crypto::ripemd160::finalize
void finalize(unsigned char hash[output_size])
us::gov::crypto::ripemd160::bytes
uint64_t bytes
Definition: ripemd160.h:105
anonymous_namespace{ripemd160.cpp}::R32
void R32(uint32_t &a, uint32_t b, uint32_t &c, uint32_t d, uint32_t e, uint32_t x, int r)
Definition: ripemd160.cpp:63
cfg0.h
us::gov::crypto::ripemd160::value_type::to_hex
string to_hex() const
us::gov::crypto::ripemd160::write
void write(const value_type &)
us
Definition: daemon.h:22
us::gov::crypto::ripemd160::value_type::to_b58
string to_b58() const
us::gov::crypto::ripemd160::value_type
Definition: ripemd160.h:38
unlikely
#define unlikely(x)
Definition: likely.h:30
std::hash< us::gov::crypto::ripemd160::value_type >::operator()
size_t operator()(const us::gov::crypto::ripemd160::value_type &k) const
Definition: ripemd160.h:136
us::gov::crypto::operator<<
ostream & operator<<(ostream &os, const ec::keys::pub_t &k)
Definition: ec.h:147
us::gov::crypto::ripemd160::value_type::value_type
value_type()
anonymous_namespace{ripemd160.cpp}::R12
void R12(uint32_t &a, uint32_t b, uint32_t &c, uint32_t d, uint32_t e, uint32_t x, int r)
Definition: ripemd160.cpp:61
us::gov::crypto::ripemd160::reset
void reset()
us::gov::crypto::ripemd160::value_type::from_hex
static value_type from_hex(const string &)
us::gov::crypto::ripemd160::value_type::value_type
value_type(const value_type &)
likely.h
anonymous_namespace{ripemd160.cpp}::R42
void R42(uint32_t &a, uint32_t b, uint32_t &c, uint32_t d, uint32_t e, uint32_t x, int r)
Definition: ripemd160.cpp:64
us::gov::io::read_file
bool read_file(const string &filename, vector< unsigned char > &)
Definition: cfg0.cpp:150
anonymous_namespace{ripemd160.cpp}::R11
void R11(uint32_t &a, uint32_t b, uint32_t &c, uint32_t d, uint32_t e, uint32_t x, int r)
Definition: ripemd160.cpp:55
anonymous_namespace{ripemd160.cpp}::rol
uint32_t rol(uint32_t x, int i)
Definition: ripemd160.cpp:48
us::gov::crypto::ripemd160::value_type::uint32
uint32_t uint32() const
anonymous_namespace{ripemd160.cpp}::Initialize
void Initialize(uint32_t *s)
Definition: ripemd160.cpp:40
anonymous_namespace{ripemd160.cpp}::Transform
void Transform(uint32_t *s, const unsigned char *chunk)
Definition: ripemd160.cpp:67
us::gov::crypto::WriteLE64
static void WriteLE64(unsigned char *ptr, uint64_t x)
Definition: endian_rw.h:21
us::gov::crypto::b58::decode
std::vector< unsigned char > decode(const std::string &s)
Definition: base58.cpp:54
us::gov::crypto::ripemd160::value_type::set_hex
bool set_hex(const string &)
us::gov::crypto::ripemd160::write
void write(const uint32_t &)
us::gov::crypto::ripemd160::digest
static value_type digest(const vector< unsigned char > &buf)
us::gov::crypto::ripemd160::value_type::set
void set(unsigned int i)
us::gov::crypto::ripemd160::value_type::compute
static value_type compute(const T1 &o1, const T2 &o2)
Definition: ripemd160.h:73
c
us::gov::crypto::ripemd160 c
Definition: ripemd160.cpp:31
us::gov::crypto::ripemd160::value_type::is_not_zero
bool is_not_zero() const
us::ko
const ko_t * ko
Definition: ko.h:27
us::gov::crypto::ripemd160
Definition: ripemd160.h:34
ripemd160.h
us::gov::crypto::ripemd160::value_type::hasher_t
ripemd160 hasher_t
Definition: ripemd160.h:40
c
Definition: client.cpp:417
us::ok
static constexpr ko ok
Definition: ko.h:28
anonymous_namespace{ripemd160.cpp}::R22
void R22(uint32_t &a, uint32_t b, uint32_t &c, uint32_t d, uint32_t e, uint32_t x, int r)
Definition: ripemd160.cpp:62
anonymous_namespace{ripemd160.cpp}::R51
void R51(uint32_t &a, uint32_t b, uint32_t &c, uint32_t d, uint32_t e, uint32_t x, int r)
Definition: ripemd160.cpp:59
anonymous_namespace{ripemd160.cpp}::R52
void R52(uint32_t &a, uint32_t b, uint32_t &c, uint32_t d, uint32_t e, uint32_t x, int r)
Definition: ripemd160.cpp:65
us::gov::crypto::ripemd160::write
void write(const double &)
std
Definition: app.h:380
anonymous_namespace{ripemd160.cpp}::R41
void R41(uint32_t &a, uint32_t b, uint32_t &c, uint32_t d, uint32_t e, uint32_t x, int r)
Definition: ripemd160.cpp:58
us::gov::crypto::b58::encode
std::string encode(const std::string &s)
Definition: base58.cpp:62
us::gov::crypto::ripemd160::value_type::from_b58
static value_type from_b58(const string &)
config.h
base58.h
us::gov::crypto
Definition: base58.cpp:19
anonymous_namespace{ripemd160.cpp}::f3
uint32_t f3(uint32_t x, uint32_t y, uint32_t z)
Definition: ripemd160.cpp:36
us::gov::crypto::ripemd160::write
void write(const int64_t &)
us::gov::crypto::ripemd160::write
void write(const string &)
us::gov::crypto::ripemd160::write
void write(const vector< unsigned char > &)
us::gov::crypto::ripemd160::ripemd160
ripemd160()
us::gov::crypto::ReadLE32
static uint32_t ReadLE32(const unsigned char *ptr)
Definition: endian_rw.h:17
anonymous_namespace{ripemd160.cpp}::R21
void R21(uint32_t &a, uint32_t b, uint32_t &c, uint32_t d, uint32_t e, uint32_t x, int r)
Definition: ripemd160.cpp:56
us::gov::crypto::ripemd160::value_type::value_type
value_type(const string &b58)
us::gov::crypto::WriteLE32
static void WriteLE32(unsigned char *ptr, uint32_t x)
Definition: endian_rw.h:20
anonymous_namespace{ripemd160.cpp}::Round
void Round(uint32_t &a, uint32_t b, uint32_t &c, uint32_t d, uint32_t e, uint32_t f, uint32_t x, uint32_t k, int r)
Definition: ripemd160.cpp:50
us.pair
Definition: pair.java:19
gov.h
us::gov::crypto::ripemd160::value_type::set_b58
bool set_b58(const string &)
us::gov::crypto::operator>>
istream & operator>>(istream &is, ec::keys::pub_t &k)
Definition: ec.h:152
us::gov::crypto::ripemd160::write
void write(const unsigned char *data, size_t len)