mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-12 06:58:57 +01:00
BIP32 derivation implementation
This commit is contained in:
46
src/key.h
46
src/key.h
@@ -161,6 +161,9 @@ public:
|
||||
|
||||
// Turn this public key into an uncompressed public key.
|
||||
bool Decompress();
|
||||
|
||||
// Derive BIP32 child pubkey.
|
||||
bool Derive(CPubKey& pubkeyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const;
|
||||
};
|
||||
|
||||
|
||||
@@ -201,6 +204,10 @@ public:
|
||||
UnlockObject(vch);
|
||||
}
|
||||
|
||||
friend bool operator==(const CKey &a, const CKey &b) {
|
||||
return a.fCompressed == b.fCompressed && memcmp(&a.vch[0], &b.vch[0], 32);
|
||||
}
|
||||
|
||||
// Initialize using begin and end iterators to byte data.
|
||||
template<typename T>
|
||||
void Set(const T pbegin, const T pend, bool fCompressedIn) {
|
||||
@@ -251,6 +258,45 @@ public:
|
||||
// 0x1D = second key with even y, 0x1E = second key with odd y,
|
||||
// add 0x04 for compressed keys.
|
||||
bool SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig) const;
|
||||
|
||||
// Derive BIP32 child key.
|
||||
bool Derive(CKey& keyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const;
|
||||
};
|
||||
|
||||
struct CExtPubKey {
|
||||
unsigned char nDepth;
|
||||
unsigned char vchFingerprint[4];
|
||||
unsigned int nChild;
|
||||
unsigned char vchChainCode[32];
|
||||
CPubKey pubkey;
|
||||
|
||||
friend bool operator==(const CExtPubKey &a, const CExtPubKey &b) {
|
||||
return a.nDepth == b.nDepth && memcmp(&a.vchFingerprint[0], &b.vchFingerprint[0], 4) == 0 && a.nChild == b.nChild &&
|
||||
memcmp(&a.vchChainCode[0], &b.vchChainCode[0], 32) == 0 && a.pubkey == b.pubkey;
|
||||
}
|
||||
|
||||
void Encode(unsigned char code[74]) const;
|
||||
void Decode(const unsigned char code[74]);
|
||||
bool Derive(CExtPubKey &out, unsigned int nChild) const;
|
||||
};
|
||||
|
||||
struct CExtKey {
|
||||
unsigned char nDepth;
|
||||
unsigned char vchFingerprint[4];
|
||||
unsigned int nChild;
|
||||
unsigned char vchChainCode[32];
|
||||
CKey key;
|
||||
|
||||
friend bool operator==(const CExtKey &a, const CExtKey &b) {
|
||||
return a.nDepth == b.nDepth && memcmp(&a.vchFingerprint[0], &b.vchFingerprint[0], 4) == 0 && a.nChild == b.nChild &&
|
||||
memcmp(&a.vchChainCode[0], &b.vchChainCode[0], 32) == 0 && a.key == b.key;
|
||||
}
|
||||
|
||||
void Encode(unsigned char code[74]) const;
|
||||
void Decode(const unsigned char code[74]);
|
||||
bool Derive(CExtKey &out, unsigned int nChild) const;
|
||||
CExtPubKey Neuter() const;
|
||||
void SetMaster(const unsigned char *seed, unsigned int nSeedLen);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user