Bitcoin Core  22.99.0
P2P Digital Currency
key.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2019 The Bitcoin Core developers
3 // Copyright (c) 2017 The Zcash developers
4 // Distributed under the MIT software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #ifndef BITCOIN_KEY_H
8 #define BITCOIN_KEY_H
9 
10 #include <pubkey.h>
11 #include <serialize.h>
13 #include <uint256.h>
14 
15 #include <stdexcept>
16 #include <vector>
17 
18 
23 typedef std::vector<unsigned char, secure_allocator<unsigned char> > CPrivKey;
24 
26 class CKey
27 {
28 public:
32  static const unsigned int SIZE = 279;
33  static const unsigned int COMPRESSED_SIZE = 214;
38  static_assert(
40  "COMPRESSED_SIZE is larger than SIZE");
41 
42 private:
45  bool fValid;
46 
49 
51  std::vector<unsigned char, secure_allocator<unsigned char> > keydata;
52 
54  bool static Check(const unsigned char* vch);
55 
56 public:
58  CKey() : fValid(false), fCompressed(false)
59  {
60  // Important: vch must be 32 bytes in length to not break serialization
61  keydata.resize(32);
62  }
63 
64  friend bool operator==(const CKey& a, const CKey& b)
65  {
66  return a.fCompressed == b.fCompressed &&
67  a.size() == b.size() &&
68  memcmp(a.keydata.data(), b.keydata.data(), a.size()) == 0;
69  }
70 
72  template <typename T>
73  void Set(const T pbegin, const T pend, bool fCompressedIn)
74  {
75  if (size_t(pend - pbegin) != keydata.size()) {
76  fValid = false;
77  } else if (Check(&pbegin[0])) {
78  memcpy(keydata.data(), (unsigned char*)&pbegin[0], keydata.size());
79  fValid = true;
80  fCompressed = fCompressedIn;
81  } else {
82  fValid = false;
83  }
84  }
85 
87  unsigned int size() const { return (fValid ? keydata.size() : 0); }
88  const unsigned char* begin() const { return keydata.data(); }
89  const unsigned char* end() const { return keydata.data() + size(); }
90 
92  bool IsValid() const { return fValid; }
93 
95  bool IsCompressed() const { return fCompressed; }
96 
98  void MakeNewKey(bool fCompressed);
99 
101  bool Negate();
102 
107  CPrivKey GetPrivKey() const;
108 
113  CPubKey GetPubKey() const;
114 
119  bool Sign(const uint256& hash, std::vector<unsigned char>& vchSig, bool grind = true, uint32_t test_case = 0) const;
120 
128  bool SignCompact(const uint256& hash, std::vector<unsigned char>& vchSig) const;
129 
145  bool SignSchnorr(const uint256& hash, Span<unsigned char> sig, const uint256* merkle_root = nullptr, const uint256* aux = nullptr) const;
146 
148  bool Derive(CKey& keyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode& cc) const;
149 
154  bool VerifyPubKey(const CPubKey& vchPubKey) const;
155 
157  bool Load(const CPrivKey& privkey, const CPubKey& vchPubKey, bool fSkipCheck);
158 };
159 
160 struct CExtKey {
161  unsigned char nDepth;
162  unsigned char vchFingerprint[4];
163  unsigned int nChild;
166 
167  friend bool operator==(const CExtKey& a, const CExtKey& b)
168  {
169  return a.nDepth == b.nDepth &&
170  memcmp(a.vchFingerprint, b.vchFingerprint, sizeof(vchFingerprint)) == 0 &&
171  a.nChild == b.nChild &&
172  a.chaincode == b.chaincode &&
173  a.key == b.key;
174  }
175 
176  void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const;
177  void Decode(const unsigned char code[BIP32_EXTKEY_SIZE]);
178  bool Derive(CExtKey& out, unsigned int nChild) const;
179  CExtPubKey Neuter() const;
180  void SetSeed(const unsigned char* seed, unsigned int nSeedLen);
181 };
182 
184 void ECC_Start();
185 
187 void ECC_Stop();
188 
190 bool ECC_InitSanityCheck();
191 
192 #endif // BITCOIN_KEY_H
CKey::IsCompressed
bool IsCompressed() const
Check whether the public key corresponding to this private key is (to be) compressed.
Definition: key.h:95
BIP32_EXTKEY_SIZE
const unsigned int BIP32_EXTKEY_SIZE
Definition: pubkey.h:19
CKey::operator==
friend bool operator==(const CKey &a, const CKey &b)
Definition: key.h:64
CKey::MakeNewKey
void MakeNewKey(bool fCompressed)
Generate a new private key using a cryptographic PRNG.
Definition: key.cpp:160
CExtKey::Derive
bool Derive(CExtKey &out, unsigned int nChild) const
Definition: key.cpp:314
CKey::GetPrivKey
CPrivKey GetPrivKey() const
Convert the private key to a CPrivKey (serialized OpenSSL private key data).
Definition: key.cpp:174
CExtKey::vchFingerprint
unsigned char vchFingerprint[4]
Definition: key.h:162
uint256.h
CKey::Set
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
Definition: key.h:73
CPrivKey
std::vector< unsigned char, secure_allocator< unsigned char > > CPrivKey
CPrivKey is a serialized private key, with all parameters included (SIZE bytes)
Definition: key.h:23
CKey::fCompressed
bool fCompressed
Whether the public key corresponding to this private key is (to be) compressed.
Definition: key.h:48
CExtKey::Encode
void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const
Definition: key.cpp:343
CKey::Derive
bool Derive(CKey &keyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode &cc) const
Derive BIP32 child key.
Definition: key.cpp:294
pubkey.h
ECC_InitSanityCheck
bool ECC_InitSanityCheck()
Check that required EC support is available at runtime.
Definition: key.cpp:362
CExtKey::nDepth
unsigned char nDepth
Definition: key.h:161
CKey::end
const unsigned char * end() const
Definition: key.h:89
CKey::CKey
CKey()
Construct an invalid private key.
Definition: key.h:58
CExtKey::operator==
friend bool operator==(const CExtKey &a, const CExtKey &b)
Definition: key.h:167
CKey::SignSchnorr
bool SignSchnorr(const uint256 &hash, Span< unsigned char > sig, const uint256 *merkle_root=nullptr, const uint256 *aux=nullptr) const
Create a BIP-340 Schnorr signature, for the xonly-pubkey corresponding to *this, optionally tweaked b...
Definition: key.cpp:264
CKey::SIZE
static const unsigned int SIZE
secp256k1:
Definition: key.h:32
Span
A Span is an object that can refer to a contiguous sequence of objects.
Definition: span.h:92
CKey::begin
const unsigned char * begin() const
Definition: key.h:88
CExtKey
Definition: key.h:160
CKey::SignCompact
bool SignCompact(const uint256 &hash, std::vector< unsigned char > &vchSig) const
Create a compact signature (65 bytes), which allows reconstructing the used public key.
Definition: key.cpp:249
CKey::IsValid
bool IsValid() const
Check whether this private key is valid.
Definition: key.h:92
CKey::Sign
bool Sign(const uint256 &hash, std::vector< unsigned char > &vchSig, bool grind=true, uint32_t test_case=0) const
Create a DER-serialized signature.
Definition: key.cpp:213
uint256
256-bit opaque blob.
Definition: uint256.h:124
CExtKey::nChild
unsigned int nChild
Definition: key.h:163
CKey::GetPubKey
CPubKey GetPubKey() const
Compute the public key from a private key.
Definition: key.cpp:187
CKey::Negate
bool Negate()
Negate private key.
Definition: key.cpp:168
secure.h
CExtKey::chaincode
ChainCode chaincode
Definition: key.h:164
CExtKey::SetSeed
void SetSeed(const unsigned char *seed, unsigned int nSeedLen)
Definition: key.cpp:322
CPubKey
An encapsulated public key.
Definition: pubkey.h:32
CKey::size
unsigned int size() const
Simple read-only vector-like interface.
Definition: key.h:87
CKey
An encapsulated private key.
Definition: key.h:26
CKey::VerifyPubKey
bool VerifyPubKey(const CPubKey &vchPubKey) const
Verify thoroughly whether a private key and a public key match.
Definition: key.cpp:235
CExtKey::Decode
void Decode(const unsigned char code[BIP32_EXTKEY_SIZE])
Definition: key.cpp:353
serialize.h
CKey::fValid
bool fValid
see www.keylength.com script supports up to 75 for single byte push
Definition: key.h:40
CKey::Load
bool Load(const CPrivKey &privkey, const CPubKey &vchPubKey, bool fSkipCheck)
Load private key and check that public key matches.
Definition: key.cpp:282
ECC_Stop
void ECC_Stop()
Deinitialize the elliptic curve support.
Definition: key.cpp:386
T
#define T(expected, seed, data)
CExtKey::Neuter
CExtPubKey Neuter() const
Definition: key.cpp:333
CKey::COMPRESSED_SIZE
static const unsigned int COMPRESSED_SIZE
Definition: key.h:33
CKey::Check
static bool Check(const unsigned char *vch)
Check whether the 32-byte array pointed to by vch is valid keydata.
Definition: key.cpp:156
CExtPubKey
Definition: pubkey.h:287
CExtKey::key
CKey key
Definition: key.h:165
ECC_Start
void ECC_Start()
Initialize the elliptic curve support.
Definition: key.cpp:369
CKey::keydata
std::vector< unsigned char, secure_allocator< unsigned char > > keydata
The actual byte data.
Definition: key.h:51