Bitcoin ABC 0.26.3
P2P Digital Currency
Loading...
Searching...
No Matches
key.cpp
Go to the documentation of this file.
1// Copyright (c) 2009-2016 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 <key.h>
7
8#include <crypto/common.h>
10#include <random.h>
11
12#include <secp256k1.h>
13#include <secp256k1_recovery.h>
14#include <secp256k1_schnorr.h>
15
17
41 const uint8_t *privkey, size_t privkeylen) {
42 const uint8_t *end = privkey + privkeylen;
43 memset(out32, 0, 32);
44 /* sequence header */
45 if (end - privkey < 1 || *privkey != 0x30u) {
46 return 0;
47 }
48 privkey++;
49 /* sequence length constructor */
50 if (end - privkey < 1 || !(*privkey & 0x80u)) {
51 return 0;
52 }
53 ptrdiff_t lenb = *privkey & ~0x80u;
54 privkey++;
55 if (lenb < 1 || lenb > 2) {
56 return 0;
57 }
58 if (end - privkey < lenb) {
59 return 0;
60 }
61 /* sequence length */
63 privkey[lenb - 1] | (lenb > 1 ? privkey[lenb - 2] << 8 : 0u);
64 privkey += lenb;
65 if (end - privkey < len) {
66 return 0;
67 }
68 /* sequence element 0: version number (=1) */
69 if (end - privkey < 3 || privkey[0] != 0x02u || privkey[1] != 0x01u ||
70 privkey[2] != 0x01u) {
71 return 0;
72 }
73 privkey += 3;
74 /* sequence element 1: octet string, up to 32 bytes */
75 if (end - privkey < 2 || privkey[0] != 0x04u) {
76 return 0;
77 }
79 privkey += 2;
80 if (oslen > 32 || end - privkey < oslen) {
81 return 0;
82 }
83 memcpy(out32 + (32 - oslen), privkey, oslen);
85 memset(out32, 0, 32);
86 return 0;
87 }
88 return 1;
89}
90
102 size_t *privkeylen, const uint8_t *key32,
103 bool compressed) {
105 secp256k1_pubkey pubkey;
106 size_t pubkeylen = 0;
107 if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) {
108 *privkeylen = 0;
109 return 0;
110 }
111
112 if (compressed) {
113 static const uint8_t begin[] = {0x30, 0x81, 0xD3, 0x02,
114 0x01, 0x01, 0x04, 0x20};
115 static const uint8_t middle[] = {
116 0xA0, 0x81, 0x85, 0x30, 0x81, 0x82, 0x02, 0x01, 0x01, 0x30, 0x2C,
117 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x01, 0x01, 0x02, 0x21,
118 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
119 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
120 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x2F,
121 0x30, 0x06, 0x04, 0x01, 0x00, 0x04, 0x01, 0x07, 0x04, 0x21, 0x02,
122 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62,
123 0x95, 0xCE, 0x87, 0x0B, 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE,
124 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98, 0x02,
125 0x21, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
126 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, 0xE6,
127 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41,
128 0x41, 0x02, 0x01, 0x01, 0xA1, 0x24, 0x03, 0x22, 0x00};
129 uint8_t *ptr = privkey;
130 memcpy(ptr, begin, sizeof(begin));
131 ptr += sizeof(begin);
132 memcpy(ptr, key32, 32);
133 ptr += 32;
134 memcpy(ptr, middle, sizeof(middle));
135 ptr += sizeof(middle);
136 pubkeylen = CPubKey::COMPRESSED_SIZE;
137 secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey,
139 ptr += pubkeylen;
140 *privkeylen = ptr - privkey;
142 } else {
143 static const uint8_t begin[] = {0x30, 0x82, 0x01, 0x13, 0x02,
144 0x01, 0x01, 0x04, 0x20};
145 static const uint8_t middle[] = {
146 0xA0, 0x81, 0xA5, 0x30, 0x81, 0xA2, 0x02, 0x01, 0x01, 0x30, 0x2C,
147 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x01, 0x01, 0x02, 0x21,
148 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
149 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
150 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x2F,
151 0x30, 0x06, 0x04, 0x01, 0x00, 0x04, 0x01, 0x07, 0x04, 0x41, 0x04,
152 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62,
153 0x95, 0xCE, 0x87, 0x0B, 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE,
154 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98, 0x48,
155 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC,
156 0x0E, 0x11, 0x08, 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54,
157 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, 0xB8, 0x02, 0x21,
158 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
159 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, 0xE6, 0xAF,
160 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41,
161 0x02, 0x01, 0x01, 0xA1, 0x44, 0x03, 0x42, 0x00};
162 uint8_t *ptr = privkey;
163 memcpy(ptr, begin, sizeof(begin));
164 ptr += sizeof(begin);
165 memcpy(ptr, key32, 32);
166 ptr += 32;
167 memcpy(ptr, middle, sizeof(middle));
168 ptr += sizeof(middle);
169 pubkeylen = CPubKey::SIZE;
170 secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey,
172 ptr += pubkeylen;
173 *privkeylen = ptr - privkey;
175 }
176 return 1;
177}
178
182
184 do {
186 } while (!Check(keydata.data()));
187 fValid = true;
189}
190
195
197 assert(fValid);
199 int ret;
200 size_t privkeylen;
201 privkey.resize(SIZE);
205 assert(ret);
206 privkey.resize(privkeylen);
207 return privkey;
208}
209
211 assert(fValid);
212 secp256k1_pubkey pubkey;
213 size_t clen = CPubKey::SIZE;
214 CPubKey result;
215 int ret =
217 assert(ret);
219 secp256k1_context_sign, (uint8_t *)result.begin(), &clen, &pubkey,
221 assert(result.size() == clen);
222 assert(result.IsValid());
223 return result;
224}
225
226// Check that the sig has a low R value and will be less than 71 bytes
231
232 // In DER serialization, all values are interpreted as big-endian, signed
233 // integers. The highest bit in the integer indicates its signed-ness; 0 is
234 // positive, 1 is negative. When the value is interpreted as a negative
235 // integer, it must be converted to a positive value by prepending a 0x00
236 // byte so that the highest bit is 0. We can avoid this prepending by
237 // ensuring that our highest bit is always 0, and thus we must check that
238 // the first byte is less than 0x80.
239 return compact_sig[0] < 0x80;
240}
241
242bool CKey::SignECDSA(const uint256 &hash, std::vector<uint8_t> &vchSig,
243 bool grind, uint32_t test_case) const {
244 if (!fValid) {
245 return false;
246 }
249 uint8_t extra_entropy[32] = {0};
252 uint32_t counter = 0;
253 int ret =
256 (!grind && test_case) ? extra_entropy : nullptr);
257
258 // Grind for low R
259 while (ret && !SigHasLowR(&sig) && grind) {
264 }
265 assert(ret);
267 vchSig.data(), &nSigLen, &sig);
268 vchSig.resize(nSigLen);
269 return true;
270}
271
272static bool DoSignSchnorr(const CKey &key, const uint256 &hash, uint8_t *buf,
274 if (!key.IsValid()) {
275 return false;
276 }
277
278 uint8_t extra_entropy[32] = {0};
280
282 secp256k1_context_sign, buf, hash.begin(), key.begin(),
284 assert(ret);
285 return true;
286}
287
289 uint32_t test_case) const {
290 return DoSignSchnorr(*this, hash, sig.data(), test_case);
291}
292
293bool CKey::SignSchnorr(const uint256 &hash, std::vector<uint8_t> &vchSig,
294 uint32_t test_case) const {
295 if (!fValid) {
296 return false;
297 }
299 return DoSignSchnorr(*this, hash, vchSig.data(), test_case);
300}
301
302bool CKey::VerifyPubKey(const CPubKey &pubkey) const {
303 if (pubkey.IsCompressed() != fCompressed) {
304 return false;
305 }
306 uint8_t rnd[8];
307 std::string str = "Bitcoin key verification\n";
309 uint256 hash;
311 std::vector<uint8_t> vchSig;
312 SignECDSA(hash, vchSig);
313 return pubkey.VerifyECDSA(hash, vchSig);
314}
315
316bool CKey::SignCompact(const uint256 &hash,
317 std::vector<uint8_t> &vchSig) const {
318 if (!fValid) {
319 return false;
320 }
322 int rec = -1;
327 assert(ret);
330 assert(ret);
331 assert(rec != -1);
332 vchSig[0] = 27 + rec + (fCompressed ? 4 : 0);
333 return true;
334}
335
336bool CKey::Load(const CPrivKey &privkey, const CPubKey &vchPubKey,
337 bool fSkipCheck = false) {
339 privkey.data(), privkey.size())) {
340 return false;
341 }
342 fCompressed = vchPubKey.IsCompressed();
343 fValid = true;
344
345 if (fSkipCheck) {
346 return true;
347 }
348
349 return VerifyPubKey(vchPubKey);
350}
351
352bool CKey::Derive(CKey &keyChild, ChainCode &ccChild, unsigned int nChild,
353 const ChainCode &cc) const {
354 assert(IsValid());
356 std::vector<uint8_t, secure_allocator<uint8_t>> vout(64);
357 if ((nChild >> 31) == 0) {
358 CPubKey pubkey = GetPubKey();
360 BIP32Hash(cc, nChild, *pubkey.begin(), pubkey.begin() + 1, vout.data());
361 } else {
362 assert(size() == 32);
363 BIP32Hash(cc, nChild, 0, begin(), vout.data());
364 }
365 memcpy(ccChild.begin(), vout.data() + 32, 32);
366 memcpy((uint8_t *)keyChild.begin(), begin(), 32);
368 secp256k1_context_sign, (uint8_t *)keyChild.begin(), vout.data());
369 keyChild.fCompressed = true;
370 keyChild.fValid = ret;
371 return ret;
372}
373
374bool CExtKey::Derive(CExtKey &out, unsigned int _nChild) const {
375 out.nDepth = nDepth + 1;
376 CKeyID id = key.GetPubKey().GetID();
377 memcpy(out.vchFingerprint, &id, 4);
378 out.nChild = _nChild;
379 return key.Derive(out.key, out.chaincode, _nChild, chaincode);
380}
381
383 static const uint8_t hashkey[] = {'B', 'i', 't', 'c', 'o', 'i',
384 'n', ' ', 's', 'e', 'e', 'd'};
385 std::vector<uint8_t, secure_allocator<uint8_t>> vout(64);
387 .Write(UCharCast(seed.data()), seed.size())
388 .Finalize(vout.data());
389 key.Set(vout.data(), vout.data() + 32, true);
390 memcpy(chaincode.begin(), vout.data() + 32, 32);
391 nDepth = 0;
392 nChild = 0;
394}
395
398 ret.nDepth = nDepth;
399 memcpy(ret.vchFingerprint, vchFingerprint, 4);
400 ret.nChild = nChild;
401 ret.pubkey = key.GetPubKey();
402 ret.chaincode = chaincode;
403 return ret;
404}
405
407 code[0] = nDepth;
408 memcpy(code + 1, vchFingerprint, 4);
409 code[5] = (nChild >> 24) & 0xFF;
410 code[6] = (nChild >> 16) & 0xFF;
411 code[7] = (nChild >> 8) & 0xFF;
412 code[8] = (nChild >> 0) & 0xFF;
413 memcpy(code + 9, chaincode.begin(), 32);
414 code[41] = 0;
415 assert(key.size() == 32);
416 memcpy(code + 42, key.begin(), 32);
417}
418
420 nDepth = code[0];
421 memcpy(vchFingerprint, code + 1, 4);
422 nChild = (code[5] << 24) | (code[6] << 16) | (code[7] << 8) | code[8];
423 memcpy(chaincode.begin(), code + 9, 32);
424 key.Set(code + 42, code + BIP32_EXTKEY_SIZE, true);
425}
426
428 CKey key;
429 key.MakeNewKey(true);
430 CPubKey pubkey = key.GetPubKey();
431 return key.VerifyPubKey(pubkey);
432}
433
434void ECC_Start() {
435 assert(secp256k1_context_sign == nullptr);
436
438 assert(ctx != nullptr);
439
440 {
441 // Pass in a random blinding seed to the secp256k1 context.
442 std::vector<uint8_t, secure_allocator<uint8_t>> vseed(32);
445 assert(ret);
446 }
447
449}
450
451void ECC_Stop() {
453 secp256k1_context_sign = nullptr;
454
455 if (ctx) {
457 }
458}
459
461 CKey ret;
463 return ret;
464}
465
467 return validKey(true);
468}
469
471 return validKey(false);
472}
secp256k1_context * ctx
A hasher class for HMAC-SHA-512.
Definition hmac_sha512.h:14
CHMAC_SHA512 & Write(const uint8_t *data, size_t len)
Definition hmac_sha512.h:23
A hasher class for Bitcoin's 256-bit hash (double SHA-256).
Definition hash.h:22
CHash256 & Write(Span< const uint8_t > input)
Definition hash.h:36
void Finalize(Span< uint8_t > output)
Definition hash.h:29
An encapsulated secp256k1 private key.
Definition key.h:28
static bool Check(const uint8_t *vch)
Check whether the 32-byte array pointed to by vch is valid keydata.
Definition key.cpp:179
bool Negate()
Negate private key.
Definition key.cpp:191
static const unsigned int SIZE
secp256k1:
Definition key.h:33
bool SignCompact(const uint256 &hash, std::vector< uint8_t > &vchSig) const
Create a compact ECDSA signature (65 bytes), which allows reconstructing the used public key.
Definition key.cpp:316
unsigned int size() const
Simple read-only vector-like interface.
Definition key.h:89
bool IsValid() const
Check whether this private key is valid.
Definition key.h:97
static CKey MakeCompressedKey()
Produce a valid compressed key.
Definition key.cpp:466
bool SignECDSA(const uint256 &hash, std::vector< uint8_t > &vchSig, bool grind=true, uint32_t test_case=0) const
Create a DER-serialized ECDSA signature.
Definition key.cpp:242
bool fValid
see www.keylength.com script supports up to 75 for single byte push
Definition key.h:46
static CKey MakeUncompressedKey()
Produce a valid uncompressed key.
Definition key.cpp:470
const uint8_t * begin() const
Definition key.h:93
CPrivKey GetPrivKey() const
Convert the private key to a CPrivKey (serialized OpenSSL private key data).
Definition key.cpp:196
static const unsigned int COMPRESSED_SIZE
Definition key.h:34
bool IsCompressed() const
Check whether the public key corresponding to this private key is (to be) compressed.
Definition key.h:101
void MakeNewKey(bool fCompressed)
Generate a new private key using a cryptographic PRNG.
Definition key.cpp:183
bool fCompressed
Whether the public key corresponding to this private key is (to be) compressed.
Definition key.h:50
CPubKey GetPubKey() const
Compute the public key from a private key.
Definition key.cpp:210
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
Definition key.h:76
bool SignSchnorr(const uint256 &hash, SchnorrSig &sig, uint32_t test_case=0) const
Create a Schnorr signature.
Definition key.cpp:288
bool VerifyPubKey(const CPubKey &vchPubKey) const
Verify thoroughly whether a private key and a public key match.
Definition key.cpp:302
bool Load(const CPrivKey &privkey, const CPubKey &vchPubKey, bool fSkipCheck)
Load private key and check that public key matches.
Definition key.cpp:336
bool Derive(CKey &keyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode &cc) const
Derive BIP32 child key.
Definition key.cpp:352
std::vector< uint8_t, secure_allocator< uint8_t > > keydata
The actual byte data.
Definition key.h:53
A reference to a CKey: the Hash160 of its serialized public key.
Definition pubkey.h:22
An encapsulated public key.
Definition pubkey.h:31
bool IsCompressed() const
Check whether this is a compressed public key.
Definition pubkey.h:154
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
Definition pubkey.h:137
static constexpr unsigned int SCHNORR_SIZE
Definition pubkey.h:38
static constexpr unsigned int COMPRESSED_SIZE
Definition pubkey.h:37
bool VerifyECDSA(const uint256 &hash, const std::vector< uint8_t > &vchSig) const
Verify a DER-serialized ECDSA signature (~72 bytes).
Definition pubkey.cpp:172
bool IsValid() const
Definition pubkey.h:147
static constexpr unsigned int SIZE
secp256k1:
Definition pubkey.h:36
unsigned int size() const
Simple read-only vector-like interface to the pubkey data.
Definition pubkey.h:98
const uint8_t * begin() const
Definition pubkey.h:100
static constexpr unsigned int SIGNATURE_SIZE
Definition pubkey.h:39
static constexpr unsigned int COMPACT_SIGNATURE_SIZE
Definition pubkey.h:40
A Span is an object that can refer to a contiguous sequence of objects.
Definition span.h:93
constexpr std::size_t size() const noexcept
Definition span.h:209
constexpr C * data() const noexcept
Definition span.h:198
uint8_t * begin()
Definition uint256.h:85
const uint8_t * data() const
Definition uint256.h:82
256-bit opaque blob.
Definition uint256.h:129
static void WriteLE32(uint8_t *ptr, uint32_t x)
Definition common.h:40
void BIP32Hash(const ChainCode &chainCode, uint32_t nChild, uint8_t header, const uint8_t data[32], uint8_t output[64])
Definition hash.cpp:72
int ec_privkey_export_der(const secp256k1_context *ctx, uint8_t *privkey, size_t *privkeylen, const uint8_t *key32, bool compressed)
This serializes to a DER encoding of the ECPrivateKey type from section C.4 of SEC 1 http://www....
Definition key.cpp:101
static bool DoSignSchnorr(const CKey &key, const uint256 &hash, uint8_t *buf, uint32_t test_case)
Definition key.cpp:272
int ec_privkey_import_der(const secp256k1_context *ctx, uint8_t *out32, const uint8_t *privkey, size_t privkeylen)
These functions are taken from the libsecp256k1 distribution and are very ugly.
Definition key.cpp:40
static secp256k1_context * secp256k1_context_sign
Definition key.cpp:16
static CKey validKey(bool compressed)
Definition key.cpp:460
bool SigHasLowR(const secp256k1_ecdsa_signature *sig)
Definition key.cpp:227
bool ECC_InitSanityCheck()
Check that required EC support is available at runtime.
Definition key.cpp:427
void ECC_Start()
Initialize the elliptic curve support.
Definition key.cpp:434
void ECC_Stop()
Deinitialize the elliptic curve support.
Definition key.cpp:451
std::array< uint8_t, CPubKey::SCHNORR_SIZE > SchnorrSig
a Schnorr signature
Definition key.h:25
std::vector< uint8_t, secure_allocator< uint8_t > > CPrivKey
secure_allocator is defined in allocators.h CPrivKey is a serialized private key, with all parameters...
Definition key.h:22
SchnorrSig sig
const unsigned int BIP32_EXTKEY_SIZE
Definition pubkey.h:19
void GetRandBytes(Span< uint8_t > bytes) noexcept
Overall design of the RNG and entropy sources.
Definition random.cpp:639
void GetStrongRandBytes(Span< uint8_t > bytes) noexcept
Gather entropy from various sources, feed it into the internal PRNG, and generate random data using i...
Definition random.cpp:642
T GetRand(T nMax=std::numeric_limits< T >::max()) noexcept
Generate a uniform random integer of type T in the range [0..nMax) nMax defaults to std::numeric_limi...
Definition random.h:85
#define SECP256K1_CONTEXT_SIGN
Definition secp256k1.h:174
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize(secp256k1_context *ctx, const unsigned char *seed32) SECP256K1_ARG_NONNULL(1)
Updates the context randomization to protect against side-channel leakage.
Definition secp256k1.c:756
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:296
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify(const secp256k1_context *ctx, const unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Verify an ECDSA secret key.
Definition secp256k1.c:576
SECP256K1_API secp256k1_context * secp256k1_context_create(unsigned int flags) SECP256K1_WARN_UNUSED_RESULT
Create a secp256k1 context object (in dynamically allocated memory).
Definition secp256k1.c:152
SECP256K1_API int secp256k1_ecdsa_sign(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *msghash32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void *ndata) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Create an ECDSA signature.
Definition secp256k1.c:561
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_negate(const secp256k1_context *ctx, unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Same as secp256k1_ec_seckey_negate, but DEPRECATED.
Definition secp256k1.c:632
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Compute the public key for a secret key.
Definition secp256k1.c:599
#define SECP256K1_EC_COMPRESSED
Flag to pass to secp256k1_ec_pubkey_serialize.
Definition secp256k1.h:179
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(const secp256k1_context *ctx, unsigned char *seckey, const unsigned char *tweak32) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Same as secp256k1_ec_seckey_tweak_add, but DEPRECATED.
Definition secp256k1.c:679
#define SECP256K1_EC_UNCOMPRESSED
Definition secp256k1.h:180
SECP256K1_API const secp256k1_nonce_function secp256k1_nonce_function_rfc6979
An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function.
Definition secp256k1.c:502
SECP256K1_API int secp256k1_ecdsa_signature_serialize_der(const secp256k1_context *ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature *sig) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Serialize an ECDSA signature in DER format.
Definition secp256k1.c:406
SECP256K1_API void secp256k1_context_destroy(secp256k1_context *ctx)
Destroy a secp256k1 context object (created in dynamically allocated memory).
Definition secp256k1.c:196
SECP256K1_API int secp256k1_ecdsa_signature_serialize_compact(const secp256k1_context *ctx, unsigned char *output64, const secp256k1_ecdsa_signature *sig) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Serialize an ECDSA signature in compact (64 byte) format.
Definition secp256k1.c:418
SECP256K1_API int secp256k1_ecdsa_recoverable_signature_serialize_compact(const secp256k1_context *ctx, unsigned char *output64, int *recid, const secp256k1_ecdsa_recoverable_signature *sig) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Serialize an ECDSA signature in compact format (64 bytes + recovery id).
Definition main_impl.h:60
SECP256K1_API int secp256k1_ecdsa_sign_recoverable(const secp256k1_context *ctx, secp256k1_ecdsa_recoverable_signature *sig, const unsigned char *msghash32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void *ndata) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Create a recoverable ECDSA signature.
Definition main_impl.h:123
SECP256K1_API int secp256k1_schnorr_sign(const secp256k1_context *ctx, unsigned char *sig64, const unsigned char *msghash32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void *ndata) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Create a signature using a custom EC-Schnorr-SHA256 construction.
Definition main_impl.h:33
uint8_t * UCharCast(char *c)
Definition span.h:309
constexpr auto MakeUCharSpan(V &&v) -> decltype(UCharSpanCast(Span{std::forward< V >(v)}))
Like the Span constructor, but for (const) uint8_t member types only.
Definition span.h:337
Definition key.h:167
void Encode(uint8_t code[BIP32_EXTKEY_SIZE]) const
Definition key.cpp:406
CExtPubKey Neuter() const
Definition key.cpp:396
bool Derive(CExtKey &out, unsigned int nChild) const
Definition key.cpp:374
uint8_t nDepth
Definition key.h:168
CKey key
Definition key.h:172
void Decode(const uint8_t code[BIP32_EXTKEY_SIZE])
Definition key.cpp:419
ChainCode chaincode
Definition key.h:171
unsigned int nChild
Definition key.h:170
uint8_t vchFingerprint[4]
Definition key.h:169
void SetSeed(Span< const std::byte > seed)
Definition key.cpp:382
uint8_t nDepth
Definition pubkey.h:194
Opaque data structured that holds a parsed ECDSA signature, supporting pubkey recovery.
Opaque data structured that holds a parsed ECDSA signature.
Definition secp256k1.h:83
Opaque data structure that holds a parsed and valid public key.
Definition secp256k1.h:70
assert(!tx.IsCoinBase())