1#include <xrpl/basics/Slice.h>
2#include <xrpl/basics/base_uint.h>
3#include <xrpl/basics/contract.h>
4#include <xrpl/basics/strHex.h>
5#include <xrpl/protocol/KeyType.h>
6#include <xrpl/protocol/PublicKey.h>
7#include <xrpl/protocol/UintTypes.h>
8#include <xrpl/protocol/detail/secp256k1.h>
9#include <xrpl/protocol/digest.h>
10#include <xrpl/protocol/tokens.h>
12#include <boost/multiprecision/fwd.hpp>
13#include <boost/multiprecision/number.hpp>
51 if (buf.
size() < 3 || buf[0] != 0x02)
53 auto const len = buf[1];
55 if (len > buf.
size() || len < 1 || len > 33)
58 if ((buf[0] & 0x80) != 0)
66 if ((buf[1] & 0x80) == 0)
88 for (
int i = 0; i < slice.
size(); ++i)
90 constexpr char hex[] =
"0123456789ABCDEF";
91 s += hex[((slice[i] & 0xf0) >> 4)];
92 s += hex[((slice[i] & 0x0f) >> 0)];
112 using uint264 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<
115 boost::multiprecision::signed_magnitude,
116 boost::multiprecision::unchecked,
119 static uint264
const G(
"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141");
123 if ((sig.
size() < 8) || (sig.
size() > 72))
125 if ((sig[0] != 0x30) || (sig[1] != (sig.
size() - 2)))
130 if (!r || !s || !p.
empty())
143 auto const Sp = G - S;
152 if (sig.
size() != 64)
156 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xDE, 0xF9, 0xDE, 0xA2, 0xF7,
158 0x9C, 0xD6, 0x58, 0x12, 0x63, 0x1A, 0x5C, 0xF5, 0xD3, 0xED,
162 auto const le = sig.
data() + 32;
175 "PublicKey::PublicKey - Input slice cannot be an undersized "
179 LogicError(
"PublicKey::PublicKey invalid type");
204 if (slice.
size() == 33)
206 if (slice[0] == 0xED)
209 if (slice[0] == 0x02 || slice[0] == 0x03)
221 bool mustBeFullyCanonical)
noexcept
224 LogicError(
"sign: secp256k1 required for digest signing");
231 secp256k1_pubkey pubkey_imp;
232 if (secp256k1_ec_pubkey_parse(
235 reinterpret_cast<unsigned char const*
>(publicKey.data()),
236 publicKey.size()) != 1)
239 secp256k1_ecdsa_signature sig_imp;
240 if (secp256k1_ecdsa_signature_parse_der(
243 reinterpret_cast<unsigned char const*
>(sig.data()),
248 secp256k1_ecdsa_signature sig_norm;
249 if (secp256k1_ecdsa_signature_normalize(
secp256k1Context(), &sig_norm, &sig_imp) != 1)
251 return secp256k1_ecdsa_verify(
254 reinterpret_cast<unsigned char const*
>(
digest.data()),
257 return secp256k1_ecdsa_verify(
260 reinterpret_cast<unsigned char const*
>(
digest.data()),
282 return ed25519_sign_open(m.data(), m.size(), publicKey.data() + 1, sig.data()) == 0;
std::uint8_t const * data() const noexcept
std::size_t size() const noexcept
Slice slice() const noexcept
PublicKey & operator=(PublicKey const &other)
static constexpr std::size_t size_
An immutable linear range of bytes.
bool empty() const noexcept
Return true if the byte range is empty.
std::uint8_t const * data() const noexcept
Return a pointer to beginning of the storage.
std::size_t size() const noexcept
Returns the number of bytes in the storage.
static std::size_t constexpr bytes
T lexicographical_compare(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
base_uint< 160, detail::NodeIDTag > NodeID
NodeID is a 160-bit hash representing one node.
void LogicError(std::string const &how) noexcept
Called when faulty logic causes a broken invariant.
static Hasher::result_type digest(void const *data, std::size_t size) noexcept
static bool ed25519Canonical(Slice const &sig)
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.
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
std::string strHex(FwdIt begin, FwdIt end)
bool verify(PublicKey const &publicKey, Slice const &m, Slice const &sig) noexcept
Verify a signature on a message.
std::optional< ECDSACanonicality > ecdsaCanonicality(Slice const &sig)
Determines the canonicality of a signature.
std::ostream & operator<<(std::ostream &out, base_uint< Bits, Tag > const &u)
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
NodeID calcNodeID(PublicKey const &)
Calculate the 160-bit node ID from a node public key.
static std::optional< Slice > sigPart(Slice &buf)
secp256k1_context const * secp256k1Context()
static std::string sliceToHex(Slice const &slice)
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)
std::string decodeBase58Token(std::string const &s, TokenType type)
T reverse_copy(T... args)
Returns the RIPEMD-160 digest of the SHA256 hash of the message.
std::array< std::uint8_t, 20 > result_type