Scorum
types.cpp
Go to the documentation of this file.
3 
4 #include <fc/crypto/base58.hpp>
5 #include <fc/crypto/ripemd160.hpp>
6 #include <fc/exception/exception.hpp>
7 #include <fc/io/raw.hpp>
8 #include <boost/uuid/uuid.hpp>
9 #include <boost/uuid/uuid_io.hpp>
10 #include <boost/uuid/uuid_generators.hpp>
11 
12 namespace scorum {
13 namespace protocol {
14 
16  : key_data(){};
17 
18 public_key_type::public_key_type(const fc::ecc::public_key_data& data)
19  : key_data(data){};
20 
21 public_key_type::public_key_type(const fc::ecc::public_key& pubkey)
22  : key_data(pubkey){};
23 
24 public_key_type::public_key_type(const std::string& base58str)
25 {
26  // TODO: Refactor syntactic checks into static is_valid()
27  // to make public_key_type API more similar to address API
28  std::string prefix(SCORUM_ADDRESS_PREFIX);
29 
30  const size_t prefix_len = prefix.size();
31  FC_ASSERT(base58str.size() > prefix_len);
32  FC_ASSERT(base58str.substr(0, prefix_len) == prefix, "", ("base58str", base58str));
33  auto bin = fc::from_base58(base58str.substr(prefix_len));
34  auto bin_key = fc::raw::unpack<binary_key>(bin);
35  key_data = bin_key.data;
36  FC_ASSERT(fc::ripemd160::hash(key_data.data, key_data.size())._hash[0] == bin_key.check);
37 };
38 
39 public_key_type::operator fc::ecc::public_key_data() const
40 {
41  return key_data;
42 };
43 
44 public_key_type::operator fc::ecc::public_key() const
45 {
46  return fc::ecc::public_key(key_data);
47 };
48 
49 public_key_type::operator std::string() const
50 {
51  binary_key k;
52  k.data = key_data;
53  k.check = fc::ripemd160::hash(k.data.data, k.data.size())._hash[0];
54  auto data = fc::raw::pack(k);
55  return SCORUM_ADDRESS_PREFIX + fc::to_base58(data.data(), data.size());
56 }
57 
58 bool operator==(const public_key_type& p1, const fc::ecc::public_key& p2)
59 {
60  return p1.key_data == p2.serialize();
61 }
62 
63 bool operator==(const public_key_type& p1, const public_key_type& p2)
64 {
65  return p1.key_data == p2.key_data;
66 }
67 
68 bool operator!=(const public_key_type& p1, const public_key_type& p2)
69 {
70  return p1.key_data != p2.key_data;
71 }
72 
73 // extended_public_key_type
74 
76  : key_data(){};
77 
78 extended_public_key_type::extended_public_key_type(const fc::ecc::extended_key_data& data)
79  : key_data(data){};
80 
81 extended_public_key_type::extended_public_key_type(const fc::ecc::extended_public_key& extpubkey)
82 {
83  key_data = extpubkey.serialize_extended();
84 };
85 
87 {
88  std::string prefix(SCORUM_ADDRESS_PREFIX);
89 
90  const size_t prefix_len = prefix.size();
91  FC_ASSERT(base58str.size() > prefix_len);
92  FC_ASSERT(base58str.substr(0, prefix_len) == prefix, "", ("base58str", base58str));
93  auto bin = fc::from_base58(base58str.substr(prefix_len));
94  auto bin_key = fc::raw::unpack<binary_key>(bin);
95  FC_ASSERT(fc::ripemd160::hash(bin_key.data.data, bin_key.data.size())._hash[0] == bin_key.check);
96  key_data = bin_key.data;
97 }
98 
99 extended_public_key_type::operator fc::ecc::extended_public_key() const
100 {
101  return fc::ecc::extended_public_key::deserialize(key_data);
102 }
103 
104 extended_public_key_type::operator std::string() const
105 {
106  binary_key k;
107  k.data = key_data;
108  k.check = fc::ripemd160::hash(k.data.data, k.data.size())._hash[0];
109  auto data = fc::raw::pack(k);
110  return SCORUM_ADDRESS_PREFIX + fc::to_base58(data.data(), data.size());
111 }
112 
113 bool operator==(const extended_public_key_type& p1, const fc::ecc::extended_public_key& p2)
114 {
115  return p1.key_data == p2.serialize_extended();
116 }
117 
119 {
120  return p1.key_data == p2.key_data;
121 }
122 
124 {
125  return p1.key_data != p2.key_data;
126 }
127 
128 // extended_private_key_type
129 
131  : key_data(){};
132 
133 extended_private_key_type::extended_private_key_type(const fc::ecc::extended_key_data& data)
134  : key_data(data){};
135 
136 extended_private_key_type::extended_private_key_type(const fc::ecc::extended_private_key& extprivkey)
137 {
138  key_data = extprivkey.serialize_extended();
139 };
140 
142 {
143  std::string prefix(SCORUM_ADDRESS_PREFIX);
144 
145  const size_t prefix_len = prefix.size();
146  FC_ASSERT(base58str.size() > prefix_len);
147  FC_ASSERT(base58str.substr(0, prefix_len) == prefix, "", ("base58str", base58str));
148  auto bin = fc::from_base58(base58str.substr(prefix_len));
149  auto bin_key = fc::raw::unpack<binary_key>(bin);
150  FC_ASSERT(fc::ripemd160::hash(bin_key.data.data, bin_key.data.size())._hash[0] == bin_key.check);
151  key_data = bin_key.data;
152 }
153 
154 extended_private_key_type::operator fc::ecc::extended_private_key() const
155 {
156  return fc::ecc::extended_private_key::deserialize(key_data);
157 }
158 
159 extended_private_key_type::operator std::string() const
160 {
161  binary_key k;
162  k.data = key_data;
163  k.check = fc::ripemd160::hash(k.data.data, k.data.size())._hash[0];
164  auto data = fc::raw::pack(k);
165  return SCORUM_ADDRESS_PREFIX + fc::to_base58(data.data(), data.size());
166 }
167 
168 bool operator==(const extended_private_key_type& p1, const fc::ecc::extended_public_key& p2)
169 {
170  return p1.key_data == p2.serialize_extended();
171 }
172 
174 {
175  return p1.key_data == p2.key_data;
176 }
177 
179 {
180  return p1.key_data != p2.key_data;
181 }
182 }
183 } // scorum::protocol
184 
185 namespace fc {
186 
187 void to_variant(const scorum::protocol::public_key_type& var, fc::variant& vo)
188 {
189  vo = std::string(var);
190 }
191 
192 void from_variant(const fc::variant& var, scorum::protocol::public_key_type& vo)
193 {
194  vo = scorum::protocol::public_key_type(var.as_string());
195 }
196 
198 {
199  vo = std::string(var);
200 }
201 
203 {
204  vo = scorum::protocol::extended_public_key_type(var.as_string());
205 }
206 
208 {
209  vo = std::string(var);
210 }
211 
213 {
214  vo = scorum::protocol::extended_private_key_type(var.as_string());
215 }
216 
217 void to_variant(const boost::uuids::uuid& id, fc::variant& var)
218 {
219  var = boost::uuids::to_string(id);
220 }
221 
222 void from_variant(const fc::variant& var, boost::uuids::uuid& id)
223 {
224  id = boost::uuids::string_generator()(var.as_string());
225 }
226 } // fc
#define SCORUM_ADDRESS_PREFIX
Definition: config.hpp:95
Definition: game.cpp:4
void to_variant(const game_type &game, fc::variant &var)
Definition: game.cpp:8
void from_variant(const fc::variant &var, game_type &game)
Definition: game.cpp:12
bool operator!=(const public_key_type &p1, const public_key_type &p2)
Definition: types.cpp:68
bool operator==(const authority &a, const authority &b)
Definition: authority.cpp:98
Definition: asset.cpp:15
fc::ecc::extended_key_data key_data
Definition: types.hpp:137
fc::ecc::extended_key_data key_data
Definition: types.hpp:113
friend bool operator!=(const extended_public_key_type &p1, const extended_public_key_type &p2)
Definition: types.cpp:123
fc::ecc::public_key_data key_data
Definition: types.hpp:85