Bitcoin Core  27.99.0
P2P Digital Currency
pubkey.cpp
Go to the documentation of this file.
1 // Copyright (c) 2009-2022 The Bitcoin Core developers
2 // Copyright (c) 2017 The Zcash developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #include <pubkey.h>
7 
8 #include <hash.h>
9 #include <secp256k1.h>
10 #include <secp256k1_ellswift.h>
11 #include <secp256k1_extrakeys.h>
12 #include <secp256k1_recovery.h>
13 #include <secp256k1_schnorrsig.h>
14 #include <span.h>
15 #include <uint256.h>
16 #include <util/strencodings.h>
17 
18 #include <algorithm>
19 #include <cassert>
20 
21 namespace {
22 
23 struct Secp256k1SelfTester
24 {
25  Secp256k1SelfTester() {
26  /* Run libsecp256k1 self-test before using the secp256k1_context_static. */
28  }
29 } SECP256K1_SELFTESTER;
30 
31 } // namespace
32 
43 int ecdsa_signature_parse_der_lax(secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) {
44  size_t rpos, rlen, spos, slen;
45  size_t pos = 0;
46  size_t lenbyte;
47  unsigned char tmpsig[64] = {0};
48  int overflow = 0;
49 
50  /* Hack to initialize sig with a correctly-parsed but invalid signature. */
52 
53  /* Sequence tag byte */
54  if (pos == inputlen || input[pos] != 0x30) {
55  return 0;
56  }
57  pos++;
58 
59  /* Sequence length bytes */
60  if (pos == inputlen) {
61  return 0;
62  }
63  lenbyte = input[pos++];
64  if (lenbyte & 0x80) {
65  lenbyte -= 0x80;
66  if (lenbyte > inputlen - pos) {
67  return 0;
68  }
69  pos += lenbyte;
70  }
71 
72  /* Integer tag byte for R */
73  if (pos == inputlen || input[pos] != 0x02) {
74  return 0;
75  }
76  pos++;
77 
78  /* Integer length for R */
79  if (pos == inputlen) {
80  return 0;
81  }
82  lenbyte = input[pos++];
83  if (lenbyte & 0x80) {
84  lenbyte -= 0x80;
85  if (lenbyte > inputlen - pos) {
86  return 0;
87  }
88  while (lenbyte > 0 && input[pos] == 0) {
89  pos++;
90  lenbyte--;
91  }
92  static_assert(sizeof(size_t) >= 4, "size_t too small");
93  if (lenbyte >= 4) {
94  return 0;
95  }
96  rlen = 0;
97  while (lenbyte > 0) {
98  rlen = (rlen << 8) + input[pos];
99  pos++;
100  lenbyte--;
101  }
102  } else {
103  rlen = lenbyte;
104  }
105  if (rlen > inputlen - pos) {
106  return 0;
107  }
108  rpos = pos;
109  pos += rlen;
110 
111  /* Integer tag byte for S */
112  if (pos == inputlen || input[pos] != 0x02) {
113  return 0;
114  }
115  pos++;
116 
117  /* Integer length for S */
118  if (pos == inputlen) {
119  return 0;
120  }
121  lenbyte = input[pos++];
122  if (lenbyte & 0x80) {
123  lenbyte -= 0x80;
124  if (lenbyte > inputlen - pos) {
125  return 0;
126  }
127  while (lenbyte > 0 && input[pos] == 0) {
128  pos++;
129  lenbyte--;
130  }
131  static_assert(sizeof(size_t) >= 4, "size_t too small");
132  if (lenbyte >= 4) {
133  return 0;
134  }
135  slen = 0;
136  while (lenbyte > 0) {
137  slen = (slen << 8) + input[pos];
138  pos++;
139  lenbyte--;
140  }
141  } else {
142  slen = lenbyte;
143  }
144  if (slen > inputlen - pos) {
145  return 0;
146  }
147  spos = pos;
148 
149  /* Ignore leading zeroes in R */
150  while (rlen > 0 && input[rpos] == 0) {
151  rlen--;
152  rpos++;
153  }
154  /* Copy R value */
155  if (rlen > 32) {
156  overflow = 1;
157  } else {
158  memcpy(tmpsig + 32 - rlen, input + rpos, rlen);
159  }
160 
161  /* Ignore leading zeroes in S */
162  while (slen > 0 && input[spos] == 0) {
163  slen--;
164  spos++;
165  }
166  /* Copy S value */
167  if (slen > 32) {
168  overflow = 1;
169  } else {
170  memcpy(tmpsig + 64 - slen, input + spos, slen);
171  }
172 
173  if (!overflow) {
175  }
176  if (overflow) {
177  /* Overwrite the result again with a correctly-parsed but invalid
178  signature if parsing failed. */
179  memset(tmpsig, 0, 64);
181  }
182  return 1;
183 }
184 
193 static const std::vector<unsigned char> NUMS_H_DATA{ParseHex("50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0")};
195 
197 {
198  assert(bytes.size() == 32);
199  std::copy(bytes.begin(), bytes.end(), m_keydata.begin());
200 }
201 
202 std::vector<CKeyID> XOnlyPubKey::GetKeyIDs() const
203 {
204  std::vector<CKeyID> out;
205  // For now, use the old full pubkey-based key derivation logic. As it is indexed by
206  // Hash160(full pubkey), we need to return both a version prefixed with 0x02, and one
207  // with 0x03.
208  unsigned char b[33] = {0x02};
209  std::copy(m_keydata.begin(), m_keydata.end(), b + 1);
210  CPubKey fullpubkey;
211  fullpubkey.Set(b, b + 33);
212  out.push_back(fullpubkey.GetID());
213  b[0] = 0x03;
214  fullpubkey.Set(b, b + 33);
215  out.push_back(fullpubkey.GetID());
216  return out;
217 }
218 
220 {
221  unsigned char full_key[CPubKey::COMPRESSED_SIZE] = {0x02};
222  std::copy(begin(), end(), full_key + 1);
223  return CPubKey{full_key};
224 }
225 
227 {
228  secp256k1_xonly_pubkey pubkey;
230 }
231 
233 {
234  assert(sigbytes.size() == 64);
235  secp256k1_xonly_pubkey pubkey;
237  return secp256k1_schnorrsig_verify(secp256k1_context_static, sigbytes.data(), msg.begin(), 32, &pubkey);
238 }
239 
240 static const HashWriter HASHER_TAPTWEAK{TaggedHash("TapTweak")};
241 
243 {
244  if (merkle_root == nullptr) {
245  // We have no scripts. The actual tweak does not matter, but follow BIP341 here to
246  // allow for reproducible tweaking.
247  return (HashWriter{HASHER_TAPTWEAK} << m_keydata).GetSHA256();
248  } else {
249  return (HashWriter{HASHER_TAPTWEAK} << m_keydata << *merkle_root).GetSHA256();
250  }
251 }
252 
253 bool XOnlyPubKey::CheckTapTweak(const XOnlyPubKey& internal, const uint256& merkle_root, bool parity) const
254 {
255  secp256k1_xonly_pubkey internal_key;
256  if (!secp256k1_xonly_pubkey_parse(secp256k1_context_static, &internal_key, internal.data())) return false;
257  uint256 tweak = internal.ComputeTapTweakHash(&merkle_root);
258  return secp256k1_xonly_pubkey_tweak_add_check(secp256k1_context_static, m_keydata.begin(), parity, &internal_key, tweak.begin());
259 }
260 
261 std::optional<std::pair<XOnlyPubKey, bool>> XOnlyPubKey::CreateTapTweak(const uint256* merkle_root) const
262 {
263  secp256k1_xonly_pubkey base_point;
264  if (!secp256k1_xonly_pubkey_parse(secp256k1_context_static, &base_point, data())) return std::nullopt;
266  uint256 tweak = ComputeTapTweakHash(merkle_root);
267  if (!secp256k1_xonly_pubkey_tweak_add(secp256k1_context_static, &out, &base_point, tweak.data())) return std::nullopt;
268  int parity = -1;
269  std::pair<XOnlyPubKey, bool> ret;
270  secp256k1_xonly_pubkey out_xonly;
271  if (!secp256k1_xonly_pubkey_from_pubkey(secp256k1_context_static, &out_xonly, &parity, &out)) return std::nullopt;
273  assert(parity == 0 || parity == 1);
274  ret.second = parity;
275  return ret;
276 }
277 
278 
279 bool CPubKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchSig) const {
280  if (!IsValid())
281  return false;
282  secp256k1_pubkey pubkey;
285  return false;
286  }
287  if (!ecdsa_signature_parse_der_lax(&sig, vchSig.data(), vchSig.size())) {
288  return false;
289  }
290  /* libsecp256k1's ECDSA verification requires lower-S signatures, which have
291  * not historically been enforced in Bitcoin, so normalize them first. */
293  return secp256k1_ecdsa_verify(secp256k1_context_static, &sig, hash.begin(), &pubkey);
294 }
295 
296 bool CPubKey::RecoverCompact(const uint256 &hash, const std::vector<unsigned char>& vchSig) {
297  if (vchSig.size() != COMPACT_SIGNATURE_SIZE)
298  return false;
299  int recid = (vchSig[0] - 27) & 3;
300  bool fComp = ((vchSig[0] - 27) & 4) != 0;
301  secp256k1_pubkey pubkey;
304  return false;
305  }
306  if (!secp256k1_ecdsa_recover(secp256k1_context_static, &pubkey, &sig, hash.begin())) {
307  return false;
308  }
309  unsigned char pub[SIZE];
310  size_t publen = SIZE;
312  Set(pub, pub + publen);
313  return true;
314 }
315 
316 bool CPubKey::IsFullyValid() const {
317  if (!IsValid())
318  return false;
319  secp256k1_pubkey pubkey;
321 }
322 
324  if (!IsValid())
325  return false;
326  secp256k1_pubkey pubkey;
328  return false;
329  }
330  unsigned char pub[SIZE];
331  size_t publen = SIZE;
333  Set(pub, pub + publen);
334  return true;
335 }
336 
337 bool CPubKey::Derive(CPubKey& pubkeyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode& cc) const {
338  assert(IsValid());
339  assert((nChild >> 31) == 0);
341  unsigned char out[64];
342  BIP32Hash(cc, nChild, *begin(), begin()+1, out);
343  memcpy(ccChild.begin(), out+32, 32);
344  secp256k1_pubkey pubkey;
346  return false;
347  }
349  return false;
350  }
351  unsigned char pub[COMPRESSED_SIZE];
352  size_t publen = COMPRESSED_SIZE;
354  pubkeyChild.Set(pub, pub + publen);
355  return true;
356 }
357 
359 {
360  assert(ellswift.size() == SIZE);
361  std::copy(ellswift.begin(), ellswift.end(), m_pubkey.begin());
362 }
363 
365 {
366  secp256k1_pubkey pubkey;
368 
369  size_t sz = CPubKey::COMPRESSED_SIZE;
370  std::array<uint8_t, CPubKey::COMPRESSED_SIZE> vch_bytes;
371 
373  assert(sz == vch_bytes.size());
374 
375  return CPubKey{vch_bytes.begin(), vch_bytes.end()};
376 }
377 
378 void CExtPubKey::Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const {
379  code[0] = nDepth;
380  memcpy(code+1, vchFingerprint, 4);
381  WriteBE32(code+5, nChild);
382  memcpy(code+9, chaincode.begin(), 32);
384  memcpy(code+41, pubkey.begin(), CPubKey::COMPRESSED_SIZE);
385 }
386 
387 void CExtPubKey::Decode(const unsigned char code[BIP32_EXTKEY_SIZE]) {
388  nDepth = code[0];
389  memcpy(vchFingerprint, code+1, 4);
390  nChild = ReadBE32(code+5);
391  memcpy(chaincode.begin(), code+9, 32);
392  pubkey.Set(code+41, code+BIP32_EXTKEY_SIZE);
393  if ((nDepth == 0 && (nChild != 0 || ReadLE32(vchFingerprint) != 0)) || !pubkey.IsFullyValid()) pubkey = CPubKey();
394 }
395 
397 {
398  memcpy(code, version, 4);
399  Encode(&code[4]);
400 }
401 
403 {
404  memcpy(version, code, 4);
405  Decode(&code[4]);
406 }
407 
408 bool CExtPubKey::Derive(CExtPubKey &out, unsigned int _nChild) const {
409  if (nDepth == std::numeric_limits<unsigned char>::max()) return false;
410  out.nDepth = nDepth + 1;
411  CKeyID id = pubkey.GetID();
412  memcpy(out.vchFingerprint, &id, 4);
413  out.nChild = _nChild;
414  return pubkey.Derive(out.pubkey, out.chaincode, _nChild, chaincode);
415 }
416 
417 /* static */ bool CPubKey::CheckLowS(const std::vector<unsigned char>& vchSig) {
419  if (!ecdsa_signature_parse_der_lax(&sig, vchSig.data(), vchSig.size())) {
420  return false;
421  }
423 }
int ret
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:24
An encapsulated public key.
Definition: pubkey.h:34
bool RecoverCompact(const uint256 &hash, const std::vector< unsigned char > &vchSig)
Recover a public key from a compact signature.
Definition: pubkey.cpp:296
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
Definition: pubkey.h:164
static constexpr unsigned int COMPRESSED_SIZE
Definition: pubkey.h:40
static bool CheckLowS(const std::vector< unsigned char > &vchSig)
Check whether a signature is normalized (lower-S).
Definition: pubkey.cpp:417
bool IsValid() const
Definition: pubkey.h:189
bool Decompress()
Turn this public key into an uncompressed public key.
Definition: pubkey.cpp:323
bool Verify(const uint256 &hash, const std::vector< unsigned char > &vchSig) const
Verify a DER signature (~72 bytes).
Definition: pubkey.cpp:279
static constexpr unsigned int SIZE
secp256k1:
Definition: pubkey.h:39
bool IsFullyValid() const
fully validate whether this is a valid public key (more expensive than IsValid())
Definition: pubkey.cpp:316
unsigned int size() const
Simple read-only vector-like interface to the pubkey data.
Definition: pubkey.h:112
const unsigned char * begin() const
Definition: pubkey.h:114
unsigned char vch[SIZE]
see www.keylength.com script supports up to 75 for single byte push
Definition: pubkey.h:49
bool Derive(CPubKey &pubkeyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode &cc) const
Derive BIP32 child pubkey.
Definition: pubkey.cpp:337
static constexpr unsigned int COMPACT_SIGNATURE_SIZE
Definition: pubkey.h:42
void Set(const T pbegin, const T pend)
Initialize a public key using begin/end iterators to byte data.
Definition: pubkey.h:89
A writer stream (for serialization) that computes a 256-bit hash.
Definition: hash.h:101
constexpr std::size_t size() const noexcept
Definition: span.h:187
constexpr C * data() const noexcept
Definition: span.h:174
constexpr C * end() const noexcept
Definition: span.h:176
constexpr C * begin() const noexcept
Definition: span.h:175
std::optional< std::pair< XOnlyPubKey, bool > > CreateTapTweak(const uint256 *merkle_root) const
Construct a Taproot tweaked output point with this point as internal key.
Definition: pubkey.cpp:261
const unsigned char * begin() const
Definition: pubkey.h:295
bool CheckTapTweak(const XOnlyPubKey &internal, const uint256 &merkle_root, bool parity) const
Verify that this is a Taproot tweaked output point, against a specified internal key,...
Definition: pubkey.cpp:253
CPubKey GetEvenCorrespondingCPubKey() const
Definition: pubkey.cpp:219
uint256 m_keydata
Definition: pubkey.h:233
bool IsFullyValid() const
Determine if this pubkey is fully valid.
Definition: pubkey.cpp:226
bool VerifySchnorr(const uint256 &msg, Span< const unsigned char > sigbytes) const
Verify a Schnorr signature against this public key.
Definition: pubkey.cpp:232
std::vector< CKeyID > GetKeyIDs() const
Returns a list of CKeyIDs for the CPubKeys that could have been used to create this XOnlyPubKey.
Definition: pubkey.cpp:202
static const XOnlyPubKey NUMS_H
Nothing Up My Sleeve point H Used as an internal key for provably disabling the key path spend see BI...
Definition: pubkey.h:239
uint256 ComputeTapTweakHash(const uint256 *merkle_root) const
Compute the Taproot tweak as specified in BIP341, with *this as internal key:
Definition: pubkey.cpp:242
XOnlyPubKey()=default
Construct an empty x-only pubkey.
const unsigned char * data() const
Definition: pubkey.h:294
const unsigned char * end() const
Definition: pubkey.h:296
constexpr unsigned char * end()
Definition: uint256.h:72
constexpr const unsigned char * data() const
Definition: uint256.h:68
constexpr unsigned char * begin()
Definition: uint256.h:71
256-bit opaque blob.
Definition: uint256.h:127
static uint32_t ReadLE32(const unsigned char *ptr)
Definition: common.h:20
static void WriteBE32(unsigned char *ptr, uint32_t x)
Definition: common.h:73
static uint32_t ReadBE32(const unsigned char *ptr)
Definition: common.h:59
void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64])
Definition: hash.cpp:71
HashWriter TaggedHash(const std::string &tag)
Return a HashWriter primed for tagged hashes (as specified in BIP 340).
Definition: hash.cpp:85
static const HashWriter HASHER_TAPTWEAK
Definition: pubkey.cpp:240
static const std::vector< unsigned char > NUMS_H_DATA
Nothing Up My Sleeve (NUMS) point.
Definition: pubkey.cpp:193
int ecdsa_signature_parse_der_lax(secp256k1_ecdsa_signature *sig, const unsigned char *input, size_t inputlen)
This function is taken from the libsecp256k1 distribution and implements DER parsing for ECDSA signat...
Definition: pubkey.cpp:43
const unsigned int BIP32_EXTKEY_WITH_VERSION_SIZE
Definition: pubkey.h:20
const unsigned int BIP32_EXTKEY_SIZE
Definition: pubkey.h:19
SECP256K1_API int secp256k1_ecdsa_signature_parse_compact(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *input64) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse an ECDSA signature in compact (64 bytes) format.
Definition: secp256k1.c:397
SECP256K1_API int secp256k1_ec_pubkey_serialize(const secp256k1_context *ctx, unsigned char *output, size_t *outputlen, const secp256k1_pubkey *pubkey, unsigned int flags) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Serialize a pubkey object into a serialized byte sequence.
Definition: secp256k1.c:280
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *input, size_t inputlen) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a variable-length public key into the pubkey object.
Definition: secp256k1.c:262
SECP256K1_API void secp256k1_selftest(void)
Perform basic self tests (to be used in conjunction with secp256k1_context_static)
Definition: secp256k1.c:86
#define SECP256K1_EC_COMPRESSED
Flag to pass to secp256k1_ec_pubkey_serialize.
Definition: secp256k1.h:215
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify(const secp256k1_context *ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msghash32, const secp256k1_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Verify an ECDSA signature.
Definition: secp256k1.c:462
SECP256K1_API int secp256k1_ecdsa_signature_normalize(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sigout, const secp256k1_ecdsa_signature *sigin) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3)
Convert a signature to a normalized lower-S form.
Definition: secp256k1.c:443
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a public key by adding tweak times the generator to it.
Definition: secp256k1.c:704
#define SECP256K1_EC_UNCOMPRESSED
Definition: secp256k1.h:216
SECP256K1_API const secp256k1_context * secp256k1_context_static
A built-in constant secp256k1 context object with static storage duration, to be used in conjunction ...
Definition: secp256k1.h:236
SECP256K1_API int secp256k1_ellswift_decode(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *ell64) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Decode a 64-bytes ElligatorSwift encoded public key.
Definition: main_impl.h:489
SECP256K1_API int secp256k1_xonly_pubkey_serialize(const secp256k1_context *ctx, unsigned char *output32, const secp256k1_xonly_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Serialize an xonly_pubkey object into a 32-byte sequence.
Definition: main_impl.h:44
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_xonly_pubkey_tweak_add_check(const secp256k1_context *ctx, const unsigned char *tweaked_pubkey32, int tweaked_pk_parity, const secp256k1_xonly_pubkey *internal_pubkey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5)
Checks that a tweaked pubkey is the result of calling secp256k1_xonly_pubkey_tweak_add with internal_...
Definition: main_impl.h:135
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_xonly_pubkey_from_pubkey(const secp256k1_context *ctx, secp256k1_xonly_pubkey *xonly_pubkey, int *pk_parity, const secp256k1_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4)
Converts a secp256k1_pubkey into a secp256k1_xonly_pubkey.
Definition: main_impl.h:99
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_xonly_pubkey_tweak_add(const secp256k1_context *ctx, secp256k1_pubkey *output_pubkey, const secp256k1_xonly_pubkey *internal_pubkey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Tweak an x-only public key by adding the generator multiplied with tweak32 to it.
Definition: main_impl.h:118
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_xonly_pubkey_parse(const secp256k1_context *ctx, secp256k1_xonly_pubkey *pubkey, const unsigned char *input32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a 32-byte sequence into a xonly_pubkey object.
Definition: main_impl.h:22
SECP256K1_API int secp256k1_ecdsa_recoverable_signature_parse_compact(const secp256k1_context *ctx, secp256k1_ecdsa_recoverable_signature *sig, const unsigned char *input64, int recid) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Parse a compact ECDSA signature (64 bytes + recovery id).
Definition: main_impl.h:38
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *sig, const unsigned char *msghash32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Recover an ECDSA public key from a signature.
Definition: main_impl.h:137
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_schnorrsig_verify(const secp256k1_context *ctx, const unsigned char *sig64, const unsigned char *msg, size_t msglen, const secp256k1_xonly_pubkey *pubkey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(5)
Verify a Schnorr signature.
Definition: main_impl.h:219
unsigned char * UCharCast(char *c)
Definition: span.h:288
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
Definition: strencodings.h:66
unsigned char version[4]
Definition: pubkey.h:343
void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const
Definition: pubkey.cpp:378
ChainCode chaincode
Definition: pubkey.h:347
bool Derive(CExtPubKey &out, unsigned int nChild) const
Definition: pubkey.cpp:408
void DecodeWithVersion(const unsigned char code[BIP32_EXTKEY_WITH_VERSION_SIZE])
Definition: pubkey.cpp:402
void EncodeWithVersion(unsigned char code[BIP32_EXTKEY_WITH_VERSION_SIZE]) const
Definition: pubkey.cpp:396
unsigned char vchFingerprint[4]
Definition: pubkey.h:345
unsigned char nDepth
Definition: pubkey.h:344
void Decode(const unsigned char code[BIP32_EXTKEY_SIZE])
Definition: pubkey.cpp:387
CPubKey pubkey
Definition: pubkey.h:348
unsigned int nChild
Definition: pubkey.h:346
std::array< std::byte, SIZE > m_pubkey
Definition: pubkey.h:313
CPubKey Decode() const
Decode to normal compressed CPubKey (for debugging purposes).
Definition: pubkey.cpp:364
EllSwiftPubKey() noexcept=default
Default constructor creates all-zero pubkey (which is valid).
Opaque data structured that holds a parsed ECDSA signature, supporting pubkey recovery.
Opaque data structured that holds a parsed ECDSA signature.
Definition: secp256k1.h:87
unsigned char data[64]
Definition: secp256k1.h:88
Opaque data structure that holds a parsed and valid public key.
Definition: secp256k1.h:74
Opaque data structure that holds a parsed and valid "x-only" public key.
assert(!tx.IsCoinBase())