mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-12 06:58:57 +01:00
Introduce KeyOriginInfo for fingerprint + path
This commit is contained in:
@@ -20,6 +20,12 @@ class CTransaction;
|
||||
|
||||
struct CMutableTransaction;
|
||||
|
||||
struct KeyOriginInfo
|
||||
{
|
||||
unsigned char fingerprint[4];
|
||||
std::vector<uint32_t> path;
|
||||
};
|
||||
|
||||
/** An interface to be implemented by keystores that support signing. */
|
||||
class SigningProvider
|
||||
{
|
||||
@@ -155,7 +161,7 @@ void UnserializeFromVector(Stream& s, X&... args)
|
||||
|
||||
// Deserialize HD keypaths into a map
|
||||
template<typename Stream>
|
||||
void DeserializeHDKeypaths(Stream& s, const std::vector<unsigned char>& key, std::map<CPubKey, std::vector<uint32_t>>& hd_keypaths)
|
||||
void DeserializeHDKeypaths(Stream& s, const std::vector<unsigned char>& key, std::map<CPubKey, KeyOriginInfo>& hd_keypaths)
|
||||
{
|
||||
// Make sure that the key is the size of pubkey + 1
|
||||
if (key.size() != CPubKey::PUBLIC_KEY_SIZE + 1 && key.size() != CPubKey::COMPRESSED_PUBLIC_KEY_SIZE + 1) {
|
||||
@@ -172,25 +178,31 @@ void DeserializeHDKeypaths(Stream& s, const std::vector<unsigned char>& key, std
|
||||
|
||||
// Read in key path
|
||||
uint64_t value_len = ReadCompactSize(s);
|
||||
std::vector<uint32_t> keypath;
|
||||
for (unsigned int i = 0; i < value_len; i += sizeof(uint32_t)) {
|
||||
if (value_len % 4 || value_len == 0) {
|
||||
throw std::ios_base::failure("Invalid length for HD key path");
|
||||
}
|
||||
|
||||
KeyOriginInfo keypath;
|
||||
s >> keypath.fingerprint;
|
||||
for (unsigned int i = 4; i < value_len; i += sizeof(uint32_t)) {
|
||||
uint32_t index;
|
||||
s >> index;
|
||||
keypath.push_back(index);
|
||||
keypath.path.push_back(index);
|
||||
}
|
||||
|
||||
// Add to map
|
||||
hd_keypaths.emplace(pubkey, keypath);
|
||||
hd_keypaths.emplace(pubkey, std::move(keypath));
|
||||
}
|
||||
|
||||
// Serialize HD keypaths to a stream from a map
|
||||
template<typename Stream>
|
||||
void SerializeHDKeypaths(Stream& s, const std::map<CPubKey, std::vector<uint32_t>>& hd_keypaths, uint8_t type)
|
||||
void SerializeHDKeypaths(Stream& s, const std::map<CPubKey, KeyOriginInfo>& hd_keypaths, uint8_t type)
|
||||
{
|
||||
for (auto keypath_pair : hd_keypaths) {
|
||||
SerializeToVector(s, type, MakeSpan(keypath_pair.first));
|
||||
WriteCompactSize(s, keypath_pair.second.size() * sizeof(uint32_t));
|
||||
for (auto& path : keypath_pair.second) {
|
||||
WriteCompactSize(s, (keypath_pair.second.path.size() + 1) * sizeof(uint32_t));
|
||||
s << keypath_pair.second.fingerprint;
|
||||
for (const auto& path : keypath_pair.second.path) {
|
||||
s << path;
|
||||
}
|
||||
}
|
||||
@@ -205,7 +217,7 @@ struct PSBTInput
|
||||
CScript witness_script;
|
||||
CScript final_script_sig;
|
||||
CScriptWitness final_script_witness;
|
||||
std::map<CPubKey, std::vector<uint32_t>> hd_keypaths;
|
||||
std::map<CPubKey, KeyOriginInfo> hd_keypaths;
|
||||
std::map<CKeyID, SigPair> partial_sigs;
|
||||
std::map<std::vector<unsigned char>, std::vector<unsigned char>> unknown;
|
||||
int sighash_type = 0;
|
||||
@@ -413,7 +425,7 @@ struct PSBTOutput
|
||||
{
|
||||
CScript redeem_script;
|
||||
CScript witness_script;
|
||||
std::map<CPubKey, std::vector<uint32_t>> hd_keypaths;
|
||||
std::map<CPubKey, KeyOriginInfo> hd_keypaths;
|
||||
std::map<std::vector<unsigned char>, std::vector<unsigned char>> unknown;
|
||||
|
||||
bool IsNull() const;
|
||||
|
||||
Reference in New Issue
Block a user