xrpld
Loading...
Searching...
No Matches
PublicKey.h
1#pragma once
2
3#include <xrpl/basics/Slice.h>
4#include <xrpl/basics/StringUtilities.h>
5#include <xrpl/basics/base_uint.h>
6#include <xrpl/basics/contract.h>
7#include <xrpl/beast/net/IPEndpoint.h>
8#include <xrpl/json/json_value.h>
9#include <xrpl/protocol/AccountID.h>
10#include <xrpl/protocol/KeyType.h>
11#include <xrpl/protocol/SField.h>
12#include <xrpl/protocol/STBlob.h>
13#include <xrpl/protocol/STExchange.h>
14#include <xrpl/protocol/UintTypes.h>
15#include <xrpl/protocol/json_get_or_throw.h>
16#include <xrpl/protocol/tokens.h>
17
18#include <algorithm>
19#include <cstdint>
20#include <cstring>
21#include <memory>
22#include <optional>
23#include <ostream>
24#include <sstream>
25#include <string>
26
27namespace xrpl {
28
53{
54protected:
55 // All the constructed public keys are valid, non-empty and contain 33
56 // bytes of data.
57 static constexpr std::size_t kSize = 33;
58 std::uint8_t buf_[kSize]{}; // should be large enough
59
60public:
62
63public:
64 PublicKey() = delete;
65
66 PublicKey(PublicKey const& other);
68 operator=(PublicKey const& other);
69
76 explicit PublicKey(Slice const& slice);
77
78 [[nodiscard]] std::uint8_t const*
79 data() const noexcept
80 {
81 return buf_;
82 }
83
84 static std::size_t
85 size() noexcept
86 {
87 return kSize;
88 }
89
90 [[nodiscard]] const_iterator
91 begin() const noexcept
92 {
93 return buf_;
94 }
95
96 [[nodiscard]] const_iterator
97 cbegin() const noexcept
98 {
99 return buf_;
100 }
101
102 [[nodiscard]] const_iterator
103 end() const noexcept
104 {
105 return buf_ + kSize;
106 }
107
108 [[nodiscard]] const_iterator
109 cend() const noexcept
110 {
111 return buf_ + kSize;
112 }
113
114 [[nodiscard]] Slice
115 slice() const noexcept
116 {
117 return {buf_, kSize};
118 }
119
120 operator Slice() const noexcept
121 {
122 return slice();
123 }
124};
125
130operator<<(std::ostream& os, PublicKey const& pk);
131
132inline bool
133operator==(PublicKey const& lhs, PublicKey const& rhs)
134{
135 return std::memcmp(lhs.data(), rhs.data(), rhs.size()) == 0;
136}
137
138inline bool
139operator<(PublicKey const& lhs, PublicKey const& rhs)
140{
142 lhs.data(), lhs.data() + lhs.size(), rhs.data(), rhs.data() + rhs.size());
143}
144
145template <class Hasher>
146void
147hash_append(Hasher& h, PublicKey const& pk)
148{
149 h(pk.data(), pk.size());
150}
151
152template <>
154{
155 explicit STExchange() = default;
156
158
159 static void
161 {
162 t.emplace(Slice(u.data(), u.size()));
163 }
164
166 set(SField const& f, PublicKey const& t)
167 {
168 return std::make_unique<STBlob>(f, t.data(), t.size());
169 }
170};
171
172//------------------------------------------------------------------------------
173
174inline std::string
176{
177 return encodeBase58Token(type, pk.data(), pk.size());
178}
179
180template <>
182parseBase58(TokenType type, std::string const& s);
183
185
213ecdsaCanonicality(Slice const& sig);
214
222[[nodiscard]] std::optional<KeyType>
223publicKeyType(Slice const& slice);
224
225[[nodiscard]] inline std::optional<KeyType>
226publicKeyType(PublicKey const& publicKey)
227{
228 return publicKeyType(publicKey.slice());
229}
230
231
235[[nodiscard]] bool
237 PublicKey const& publicKey,
238 uint256 const& digest,
239 Slice const& sig,
240 bool mustBeFullyCanonical = true) noexcept;
241
247[[nodiscard]] bool
248verify(PublicKey const& publicKey, Slice const& m, Slice const& sig) noexcept;
249
253NodeID
254calcNodeID(PublicKey const&);
255
256// VFALCO This belongs in AccountID.h but
257// is here because of header issues
259calcAccountID(PublicKey const& pk);
260
261inline std::string
263 beast::ip::Endpoint const& address,
264 std::optional<PublicKey> const& publicKey = std::nullopt,
265 std::optional<std::string> const& id = std::nullopt)
266{
268 ss << "IP Address: " << address;
269 if (publicKey.has_value())
270 {
271 ss << ", Public Key: " << toBase58(TokenType::NodePublic, *publicKey);
272 }
273 if (id.has_value())
274 {
275 ss << ", Id: " << id.value();
276 }
277 return ss.str();
278}
279} // namespace xrpl
280
281//------------------------------------------------------------------------------
282
283namespace json {
284template <>
285inline xrpl::PublicKey
286getOrThrow(json::Value const& v, xrpl::SField const& field)
287{
288 using namespace xrpl;
289 std::string const b58 = getOrThrow<std::string>(v, field);
290 if (auto pubKeyBlob = strUnHex(b58);
291 pubKeyBlob.has_value() && publicKeyType(makeSlice(*pubKeyBlob)))
292 {
293 return PublicKey{makeSlice(*pubKeyBlob)};
294 }
295 for (auto const tokenType : {TokenType::NodePublic, TokenType::AccountPublic})
296 {
297 if (auto const pk = parseBase58<PublicKey>(tokenType, b58))
298 return *pk;
299 }
300 Throw<JsonTypeMismatchError>(field.getJsonName(), "PublicKey");
301}
302} // namespace json
Represents a JSON value.
Definition json_value.h:117
A public key.
Definition PublicKey.h:53
const_iterator cbegin() const noexcept
Definition PublicKey.h:97
const_iterator begin() const noexcept
Definition PublicKey.h:91
std::uint8_t const * data() const noexcept
Definition PublicKey.h:79
const_iterator end() const noexcept
Definition PublicKey.h:103
static std::size_t size() noexcept
Definition PublicKey.h:85
std::uint8_t buf_[kSize]
Definition PublicKey.h:58
std::uint8_t const * const_iterator
Definition PublicKey.h:61
static constexpr std::size_t kSize
Definition PublicKey.h:57
Slice slice() const noexcept
Definition PublicKey.h:115
PublicKey()=delete
const_iterator cend() const noexcept
Definition PublicKey.h:109
PublicKey & operator=(PublicKey const &other)
Identifies fields.
Definition SField.h:132
json::StaticString const & getJsonName() const
Definition SField.h:210
std::size_t size() const
Definition STBlob.h:94
std::uint8_t const * data() const
Definition STBlob.h:100
An immutable linear range of bytes.
Definition Slice.h:28
T emplace(T... args)
T lexicographical_compare(T... args)
T make_unique(T... args)
T memcmp(T... args)
JSON (JavaScript Object Notation).
Definition json_errors.h:5
xrpl::AccountID getOrThrow(json::Value const &v, xrpl::SField const &field)
Definition AccountID.h:126
STL namespace.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
bool operator<(Slice const &lhs, Slice const &rhs) noexcept
Definition Slice.h:212
constexpr bool operator==(BaseUInt< Bits, Tag > const &lhs, BaseUInt< Bits, Tag > const &rhs)
Definition base_uint.h:606
static Hasher::result_type digest(void const *data, std::size_t size) noexcept
Definition tokens.cpp:140
bool verifyDigest(PublicKey const &publicKey, uint256 const &digest, Slice const &sig, bool mustBeFullyCanonical=true) noexcept
Verify a secp256k1 signature on the digest of a message.
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
bool verify(PublicKey const &publicKey, Slice const &m, Slice const &sig) noexcept
Verify a signature on a message.
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Definition AccountID.cpp:95
std::optional< ECDSACanonicality > ecdsaCanonicality(Slice const &sig)
Determines the canonicality of a signature.
std::ostream & operator<<(std::ostream &out, BaseUInt< Bits, Tag > const &u)
Definition base_uint.h:666
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Slice makeSlice(std::array< T, N > const &a)
Definition Slice.h:228
Dir::ConstIterator const_iterator
Definition Dir.cpp:16
std::optional< Blob > strUnHex(std::size_t strSize, Iterator begin, Iterator end)
NodeID calcNodeID(PublicKey const &)
Calculate the 160-bit node ID from a node public key.
AccountID calcAccountID(PublicKey const &pk)
TokenType
Definition tokens.h:19
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition AccountID.h:34
void hash_append(Hasher &h, Slice const &v)
Definition Slice.h:194
ECDSACanonicality
Definition PublicKey.h:184
std::string getFingerprint(beast::ip::Endpoint const &address, std::optional< PublicKey > const &publicKey=std::nullopt, std::optional< std::string > const &id=std::nullopt)
Definition PublicKey.h:262
std::string encodeBase58Token(TokenType type, void const *token, std::size_t size)
Encode data in Base58Check format using XRPL alphabet.
Definition tokens.cpp:181
BaseUInt< 256 > uint256
Definition base_uint.h:580
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
Definition contract.h:52
BaseUInt< 160, detail::NodeIDTag > NodeID
NodeID is a 160-bit hash representing one node.
Definition UintTypes.h:47
T str(T... args)
static std::unique_ptr< STBlob > set(SField const &f, PublicKey const &t)
Definition PublicKey.h:166
static void get(std::optional< value_type > &t, STBlob const &u)
Definition PublicKey.h:160