Bitcoin ABC 0.30.5
P2P Digital Currency
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
40int ec_privkey_import_der(const secp256k1_context *ctx, uint8_t *out32,
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 */
62 ptrdiff_t len =
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 }
78 ptrdiff_t oslen = privkey[1];
79 privkey += 2;
80 if (oslen > 32 || end - privkey < oslen) {
81 return 0;
82 }
83 memcpy(out32 + (32 - oslen), privkey, oslen);
84 if (!secp256k1_ec_seckey_verify(ctx, out32)) {
85 memset(out32, 0, 32);
86 return 0;
87 }
88 return 1;
89}
90
101int ec_privkey_export_der(const secp256k1_context *ctx, uint8_t *privkey,
102 size_t *privkeylen, const uint8_t *key32,
103 bool compressed) {
104 assert(*privkeylen >= CKey::SIZE);
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;
141 assert(*privkeylen == CKey::COMPRESSED_SIZE);
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;
174 assert(*privkeylen == CKey::SIZE);
175 }
176 return 1;
177}
178
179bool CKey::Check(const uint8_t *vch) {
181}
182
183void CKey::MakeNewKey(bool fCompressedIn) {
184 do {
186 } while (!Check(keydata.data()));
187 fValid = true;
188 fCompressed = fCompressedIn;
189}
190
192 assert(fValid);
194}
195
197 assert(fValid);
198 CPrivKey privkey;
199 int ret;
200 size_t privkeylen;
201 privkey.resize(SIZE);
202 privkeylen = SIZE;
203 ret = ec_privkey_export_der(secp256k1_context_sign, privkey.data(),
204 &privkeylen, begin(), fCompressed);
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
228 uint8_t compact_sig[64];
230 compact_sig, sig);
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 }
247 vchSig.resize(CPubKey::SIGNATURE_SIZE);
248 size_t nSigLen = CPubKey::SIGNATURE_SIZE;
249 uint8_t extra_entropy[32] = {0};
250 WriteLE32(extra_entropy, test_case);
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) {
260 WriteLE32(extra_entropy, ++counter);
263 extra_entropy);
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,
273 uint32_t test_case) {
274 if (!key.IsValid()) {
275 return false;
276 }
277
278 uint8_t extra_entropy[32] = {0};
279 WriteLE32(extra_entropy, test_case);
280
281 int ret = secp256k1_schnorr_sign(
282 secp256k1_context_sign, buf, hash.begin(), key.begin(),
283 secp256k1_nonce_function_rfc6979, test_case ? extra_entropy : nullptr);
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 }
298 vchSig.resize(CPubKey::SCHNORR_SIZE);
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";
308 GetRandBytes(rnd);
309 uint256 hash;
310 CHash256().Write(MakeUCharSpan(str)).Write(rnd).Finalize(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 }
321 vchSig.resize(CPubKey::COMPACT_SIGNATURE_SIZE);
322 int rec = -1;
327 assert(ret);
329 secp256k1_context_sign, &vchSig[1], &rec, &sig);
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);
386 CHMAC_SHA512{hashkey, sizeof(hashkey)}
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;
393 memset(vchFingerprint, 0, sizeof(vchFingerprint));
394}
395
397 CExtPubKey ret;
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
406void CExtKey::Encode(uint8_t code[BIP32_EXTKEY_SIZE]) const {
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
419void CExtKey::Decode(const uint8_t code[BIP32_EXTKEY_SIZE]) {
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);
443 GetRandBytes(vseed);
444 bool ret = secp256k1_context_randomize(ctx, vseed.data());
445 assert(ret);
446 }
447
449}
450
451void ECC_Stop() {
453 secp256k1_context_sign = nullptr;
454
455 if (ctx) {
457 }
458}
459
460static CKey validKey(bool compressed) {
461 CKey ret;
462 ret.MakeNewKey(compressed);
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
Definition: processor.cpp:498
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
#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
ChainCode chaincode
Definition: pubkey.h:197
uint8_t vchFingerprint[4]
Definition: pubkey.h:195
CPubKey pubkey
Definition: pubkey.h:198
unsigned int nChild
Definition: pubkey.h:196
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())