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/tokens.h>
28 #include <algorithm>
29 #include <cstdint>
30 #include <cstring>
31 #include <optional>
32 #include <ostream>
33 #include <utility>
34 
35 namespace ripple {
36 
59 class PublicKey
60 {
61 protected:
63  std::uint8_t buf_[33]; // should be large enough
64 
65 public:
66  using const_iterator = std::uint8_t const*;
67 
68  PublicKey() = default;
69  PublicKey(PublicKey const& other);
70  PublicKey&
71  operator=(PublicKey const& other);
72 
78  explicit PublicKey(Slice const& slice);
79 
80  std::uint8_t const*
81  data() const noexcept
82  {
83  return buf_;
84  }
85 
87  size() const noexcept
88  {
89  return size_;
90  }
91 
93  begin() const noexcept
94  {
95  return buf_;
96  }
97 
99  cbegin() const noexcept
100  {
101  return buf_;
102  }
103 
105  end() const noexcept
106  {
107  return buf_ + size_;
108  }
109 
111  cend() const noexcept
112  {
113  return buf_ + size_;
114  }
115 
116  bool
117  empty() const noexcept
118  {
119  return size_ == 0;
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 lhs.size() == rhs.size() &&
143  std::memcmp(lhs.data(), rhs.data(), rhs.size()) == 0;
144 }
145 
146 inline bool
147 operator<(PublicKey const& lhs, PublicKey const& rhs)
148 {
150  lhs.data(),
151  lhs.data() + lhs.size(),
152  rhs.data(),
153  rhs.data() + rhs.size());
154 }
155 
156 template <class Hasher>
157 void
158 hash_append(Hasher& h, PublicKey const& pk)
159 {
160  h(pk.data(), pk.size());
161 }
162 
163 template <>
165 {
166  explicit STExchange() = default;
167 
169 
170  static void
172  {
173  t.emplace(Slice(u.data(), u.size()));
174  }
175 
177  set(SField const& f, PublicKey const& t)
178  {
179  return std::make_unique<STBlob>(f, t.data(), t.size());
180  }
181 };
182 
183 //------------------------------------------------------------------------------
184 
185 inline std::string
186 toBase58(TokenType type, PublicKey const& pk)
187 {
188  return encodeBase58Token(type, pk.data(), pk.size());
189 }
190 
191 template <>
193 parseBase58(TokenType type, std::string const& s);
194 
196 
223 ecdsaCanonicality(Slice const& sig);
224 
231 [[nodiscard]] std::optional<KeyType>
232 publicKeyType(Slice const& slice);
233 
234 [[nodiscard]] inline std::optional<KeyType>
235 publicKeyType(PublicKey const& publicKey)
236 {
237  return publicKeyType(publicKey.slice());
238 }
242 [[nodiscard]] bool
244  PublicKey const& publicKey,
245  uint256 const& digest,
246  Slice const& sig,
247  bool mustBeFullyCanonical = true) noexcept;
248 
253 [[nodiscard]] bool
254 verify(
255  PublicKey const& publicKey,
256  Slice const& m,
257  Slice const& sig,
258  bool mustBeFullyCanonical = true) noexcept;
259 
261 NodeID
262 calcNodeID(PublicKey const&);
263 
264 // VFALCO This belongs in AccountID.h but
265 // is here because of header issues
266 AccountID
267 calcAccountID(PublicKey const& pk);
268 
269 } // namespace ripple
270 
271 #endif
ripple::PublicKey::data
std::uint8_t const * data() const noexcept
Definition: PublicKey.h:81
ripple::PublicKey::PublicKey
PublicKey()=default
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::empty
bool empty() const noexcept
Definition: PublicKey.h:117
ripple::PublicKey::cend
const_iterator cend() const noexcept
Definition: PublicKey.h:111
ripple::toBase58
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Definition: AccountID.cpp:104
ripple::ECDSACanonicality
ECDSACanonicality
Definition: PublicKey.h:195
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:242
ripple::ECDSACanonicality::fullyCanonical
@ fullyCanonical
algorithm
ripple::operator==
bool operator==(Manifest const &lhs, Manifest const &rhs)
Definition: Manifest.h:165
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:47
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:177
ripple::PublicKey::const_iterator
std::uint8_t const * const_iterator
Definition: PublicKey.h:66
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::TokenType
TokenType
Definition: tokens.h:29
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:87
std::ostream
STL class.
ripple::PublicKey::size_
std::size_t size_
Definition: PublicKey.h:62
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:114
ripple::STExchange< STBlob, PublicKey >::get
static void get(std::optional< value_type > &t, STBlob const &u)
Definition: PublicKey.h:171
ripple::STExchange
Convert between serialized type U and C++ type T.
Definition: STExchange.h:41
cstdint
std::uint8_t
ripple::PublicKey::operator=
PublicKey & operator=(PublicKey const &other)
Definition: PublicKey.cpp:192
ripple::STBlob::size
std::size_t size() const
Definition: STBlob.h:110
ripple::ECDSACanonicality::canonical
@ canonical
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
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:199
ripple::SField
Identifies fields.
Definition: SField.h:112
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:93
optional
ripple::PublicKey::buf_
std::uint8_t buf_[33]
Definition: PublicKey.h:63
std::size_t
ripple::PublicKey::end
const_iterator end() const noexcept
Definition: PublicKey.h:105
std::memcmp
T memcmp(T... args)
ostream
ripple::hash_append
void hash_append(Hasher &h, ValidatorBlobInfo const &blobInfo)
Definition: ValidatorList.h:897
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:99
ripple::STBlob
Definition: STBlob.h:33
ripple::AccountID
base_uint< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition: AccountID.h:47
ripple::STBlob::data
std::uint8_t const * data() const
Definition: STBlob.h:116