rippled
PublicKey.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_PROTOCOL_PUBLICKEY_H_INCLUDED
21 #define RIPPLE_PROTOCOL_PUBLICKEY_H_INCLUDED
22 
23 #include <ripple/basics/Slice.h>
24 #include <ripple/protocol/KeyType.h>
25 #include <ripple/protocol/STExchange.h>
26 #include <ripple/protocol/UintTypes.h>
27 #include <ripple/protocol/json_get_or_throw.h>
28 #include <ripple/protocol/tokens.h>
29 
30 #include <algorithm>
31 #include <cstdint>
32 #include <cstring>
33 #include <optional>
34 #include <ostream>
35 #include <utility>
36 
37 namespace ripple {
38 
61 class PublicKey
62 {
63 protected:
64  // All the constructed public keys are valid, non-empty and contain 33
65  // bytes of data.
66  static constexpr std::size_t size_ = 33;
67  std::uint8_t buf_[size_]; // should be large enough
68 
69 public:
70  using const_iterator = std::uint8_t const*;
71 
72 public:
73  PublicKey() = delete;
74 
75  PublicKey(PublicKey const& other);
76  PublicKey&
77  operator=(PublicKey const& other);
78 
84  explicit PublicKey(Slice const& slice);
85 
86  std::uint8_t const*
87  data() const noexcept
88  {
89  return buf_;
90  }
91 
93  size() const noexcept
94  {
95  return size_;
96  }
97 
99  begin() const noexcept
100  {
101  return buf_;
102  }
103 
105  cbegin() const noexcept
106  {
107  return buf_;
108  }
109 
111  end() const noexcept
112  {
113  return buf_ + size_;
114  }
115 
117  cend() const noexcept
118  {
119  return buf_ + size_;
120  }
121 
122  Slice
123  slice() const noexcept
124  {
125  return {buf_, size_};
126  }
127 
128  operator Slice() const noexcept
129  {
130  return slice();
131  }
132 };
133 
137 operator<<(std::ostream& os, PublicKey const& pk);
138 
139 inline bool
140 operator==(PublicKey const& lhs, PublicKey const& rhs)
141 {
142  return std::memcmp(lhs.data(), rhs.data(), rhs.size()) == 0;
143 }
144 
145 inline bool
146 operator<(PublicKey const& lhs, PublicKey const& rhs)
147 {
149  lhs.data(),
150  lhs.data() + lhs.size(),
151  rhs.data(),
152  rhs.data() + rhs.size());
153 }
154 
155 template <class Hasher>
156 void
157 hash_append(Hasher& h, PublicKey const& pk)
158 {
159  h(pk.data(), pk.size());
160 }
161 
162 template <>
164 {
165  explicit STExchange() = default;
166 
168 
169  static void
171  {
172  t.emplace(Slice(u.data(), u.size()));
173  }
174 
176  set(SField const& f, PublicKey const& t)
177  {
178  return std::make_unique<STBlob>(f, t.data(), t.size());
179  }
180 };
181 
182 //------------------------------------------------------------------------------
183 
184 inline std::string
185 toBase58(TokenType type, PublicKey const& pk)
186 {
187  return encodeBase58Token(type, pk.data(), pk.size());
188 }
189 
190 template <>
192 parseBase58(TokenType type, std::string const& s);
193 
195 
222 ecdsaCanonicality(Slice const& sig);
223 
230 [[nodiscard]] std::optional<KeyType>
231 publicKeyType(Slice const& slice);
232 
233 [[nodiscard]] inline std::optional<KeyType>
234 publicKeyType(PublicKey const& publicKey)
235 {
236  return publicKeyType(publicKey.slice());
237 }
241 [[nodiscard]] bool
243  PublicKey const& publicKey,
244  uint256 const& digest,
245  Slice const& sig,
246  bool mustBeFullyCanonical = true) noexcept;
247 
252 [[nodiscard]] bool
253 verify(
254  PublicKey const& publicKey,
255  Slice const& m,
256  Slice const& sig,
257  bool mustBeFullyCanonical = true) noexcept;
258 
260 NodeID
261 calcNodeID(PublicKey const&);
262 
263 // VFALCO This belongs in AccountID.h but
264 // is here because of header issues
265 AccountID
266 calcAccountID(PublicKey const& pk);
267 
268 } // namespace ripple
269 
270 //------------------------------------------------------------------------------
271 
272 namespace Json {
273 template <>
274 inline ripple::PublicKey
275 getOrThrow(Json::Value const& v, ripple::SField const& field)
276 {
277  using namespace ripple;
278  std::string const b58 = getOrThrow<std::string>(v, field);
279  if (auto pubKeyBlob = strUnHex(b58); publicKeyType(makeSlice(*pubKeyBlob)))
280  {
281  return PublicKey{makeSlice(*pubKeyBlob)};
282  }
283  for (auto const tokenType :
285  {
286  if (auto const pk = parseBase58<PublicKey>(tokenType, b58))
287  return *pk;
288  }
289  Throw<JsonTypeMismatchError>(field.getJsonName(), "PublicKey");
290 }
291 } // namespace Json
292 
293 #endif
ripple::PublicKey::data
std::uint8_t const * data() const noexcept
Definition: PublicKey.h:87
ripple::makeSlice
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
Definition: Slice.h:241
ripple::Dir::const_iterator
Definition: Directory.h:49
std::string
STL class.
utility
ripple::calcNodeID
NodeID calcNodeID(PublicKey const &pk)
Calculate the 160-bit node ID from a node public key.
Definition: PublicKey.cpp:303
ripple::NodeID
base_uint< 160, detail::NodeIDTag > NodeID
NodeID is a 160-bit hash representing one node.
Definition: UintTypes.h:59
cstring
ripple::Slice
An immutable linear range of bytes.
Definition: Slice.h:44
ripple::verify
bool verify(PublicKey const &publicKey, Slice const &m, Slice const &sig, bool mustBeFullyCanonical) noexcept
Verify a signature on a message.
Definition: PublicKey.cpp:272
ripple::PublicKey::cend
const_iterator cend() const noexcept
Definition: PublicKey.h:117
ripple::toBase58
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Definition: AccountID.cpp:104
ripple::ECDSACanonicality
ECDSACanonicality
Definition: PublicKey.h:194
std::optional::emplace
T emplace(T... args)
ripple::PublicKey::slice
Slice slice() const noexcept
Definition: PublicKey.h:123
ripple::operator<<
std::ostream & operator<<(std::ostream &os, TOffer< TIn, TOut > const &offer)
Definition: Offer.h:303
ripple::ECDSACanonicality::fullyCanonical
@ fullyCanonical
algorithm
ripple::operator==
bool operator==(Manifest const &lhs, Manifest const &rhs)
Definition: Manifest.h:189
ripple::uint256
base_uint< 256 > uint256
Definition: base_uint.h:550
ripple::digest
static Hasher::result_type digest(void const *data, std::size_t size) noexcept
Definition: tokens.cpp:152
ripple::publicKeyType
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Definition: PublicKey.cpp:207
ripple::STExchange< STBlob, PublicKey >::set
static std::unique_ptr< STBlob > set(SField const &f, PublicKey const &t)
Definition: PublicKey.h:176
Json
JSON (JavaScript Object Notation).
Definition: DeliverMax.h:28
ripple::PublicKey::const_iterator
std::uint8_t const * const_iterator
Definition: PublicKey.h:70
ripple::PublicKey
A public key.
Definition: PublicKey.h:61
ripple::TokenType
TokenType
Definition: tokens.h:38
ripple::operator<
bool operator<(CanonicalTXSet::Key const &lhs, CanonicalTXSet::Key const &rhs)
Definition: CanonicalTXSet.cpp:25
ripple::PublicKey::size
std::size_t size() const noexcept
Definition: PublicKey.h:93
std::ostream
STL class.
std::lexicographical_compare
T lexicographical_compare(T... args)
ripple::calcAccountID
AccountID calcAccountID(PublicKey const &pk)
Definition: AccountID.cpp:158
ripple::ecdsaCanonicality
std::optional< ECDSACanonicality > ecdsaCanonicality(Slice const &sig)
Determine whether a signature is canonical.
Definition: PublicKey.cpp:113
ripple::STExchange< STBlob, PublicKey >::get
static void get(std::optional< value_type > &t, STBlob const &u)
Definition: PublicKey.h:170
ripple::STExchange
Convert between serialized type U and C++ type T.
Definition: STExchange.h:41
cstdint
std::uint8_t
ripple::PublicKey::buf_
std::uint8_t buf_[size_]
Definition: PublicKey.h:67
ripple::PublicKey::operator=
PublicKey & operator=(PublicKey const &other)
Definition: PublicKey.cpp:194
ripple::STBlob::size
std::size_t size() const
Definition: STBlob.h:112
ripple::ECDSACanonicality::canonical
@ canonical
beast::field
field_t< CharT, Traits, Allocator > field(std::basic_string< CharT, Traits, Allocator > const &text, int width=8, int pad=0, bool right=false)
Definition: iosformat.h:162
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::PublicKey::PublicKey
PublicKey()=delete
ripple::encodeBase58Token
std::string encodeBase58Token(TokenType type, void const *token, std::size_t size)
Encode data in Base58Check format using XRPL alphabet.
Definition: tokens.cpp:195
ripple::SField
Identifies fields.
Definition: SField.h:141
ripple::PublicKey::size_
static constexpr std::size_t size_
Definition: PublicKey.h:66
ripple::verifyDigest
bool verifyDigest(PublicKey const &publicKey, uint256 const &digest, Slice const &sig, bool mustBeFullyCanonical) noexcept
Verify a secp256k1 signature on the digest of a message.
Definition: PublicKey.cpp:222
ripple::PublicKey::begin
const_iterator begin() const noexcept
Definition: PublicKey.h:99
ripple::TokenType::AccountPublic
@ AccountPublic
ripple::TokenType::NodePublic
@ NodePublic
optional
std::size_t
ripple::PublicKey::end
const_iterator end() const noexcept
Definition: PublicKey.h:111
std::memcmp
T memcmp(T... args)
ostream
ripple::hash_append
void hash_append(Hasher &h, ValidatorBlobInfo const &blobInfo)
Definition: ValidatorList.h:909
ripple::parseBase58
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
Definition: AccountID.cpp:114
std::unique_ptr
STL class.
ripple::PublicKey::cbegin
const_iterator cbegin() const noexcept
Definition: PublicKey.h:105
ripple::strUnHex
std::optional< Blob > strUnHex(std::size_t strSize, Iterator begin, Iterator end)
Definition: StringUtilities.h:52
ripple::STBlob
Definition: STBlob.h:35
ripple::AccountID
base_uint< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition: AccountID.h:49
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::STBlob::data
std::uint8_t const * data() const
Definition: STBlob.h:118