Skip to content

Commit 2a2cac7

Browse files
committed
Merge #14424: Stop requiring imported pubkey to sign non-PKH schemes
2f6b466 Stop requiring imported pubkey to sign non-PKH schemes (Pieter Wuille) Pull request description: ... This is a fix for #14415 Tree-SHA512: 113b4ddfbdfcce7dbaa15c565ac7ec68d16127aa4d47628e0801f2437cbe369e0fa8beb0de191d43dcb2f8cbb6f1bf8d79a5db0f4e352f38fe7280124475710a
2 parents be99270 + 2f6b466 commit 2a2cac7

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

src/script/sign.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,18 @@ static bool GetPubKey(const SigningProvider& provider, SignatureData& sigdata, c
7373
return false;
7474
}
7575

76-
static bool CreateSig(const BaseSignatureCreator& creator, SignatureData& sigdata, const SigningProvider& provider, std::vector<unsigned char>& sig_out, const CKeyID& keyid, const CScript& scriptcode, SigVersion sigversion)
76+
static bool CreateSig(const BaseSignatureCreator& creator, SignatureData& sigdata, const SigningProvider& provider, std::vector<unsigned char>& sig_out, const CPubKey& pubkey, const CScript& scriptcode, SigVersion sigversion)
7777
{
78+
CKeyID keyid = pubkey.GetID();
7879
const auto it = sigdata.signatures.find(keyid);
7980
if (it != sigdata.signatures.end()) {
8081
sig_out = it->second.second;
8182
return true;
8283
}
83-
CPubKey pubkey;
84-
GetPubKey(provider, sigdata, keyid, pubkey);
84+
KeyOriginInfo info;
85+
if (provider.GetKeyOrigin(keyid, info)) {
86+
sigdata.misc_pubkeys.emplace(keyid, std::make_pair(pubkey, std::move(info)));
87+
}
8588
if (creator.CreateSig(provider, sig_out, keyid, scriptcode, sigversion)) {
8689
auto i = sigdata.signatures.emplace(keyid, SigPair(pubkey, sig_out));
8790
assert(i.second);
@@ -114,15 +117,15 @@ static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator
114117
case TX_WITNESS_UNKNOWN:
115118
return false;
116119
case TX_PUBKEY:
117-
if (!CreateSig(creator, sigdata, provider, sig, CPubKey(vSolutions[0]).GetID(), scriptPubKey, sigversion)) return false;
120+
if (!CreateSig(creator, sigdata, provider, sig, CPubKey(vSolutions[0]), scriptPubKey, sigversion)) return false;
118121
ret.push_back(std::move(sig));
119122
return true;
120123
case TX_PUBKEYHASH: {
121124
CKeyID keyID = CKeyID(uint160(vSolutions[0]));
122-
if (!CreateSig(creator, sigdata, provider, sig, keyID, scriptPubKey, sigversion)) return false;
123-
ret.push_back(std::move(sig));
124125
CPubKey pubkey;
125126
GetPubKey(provider, sigdata, keyID, pubkey);
127+
if (!CreateSig(creator, sigdata, provider, sig, pubkey, scriptPubKey, sigversion)) return false;
128+
ret.push_back(std::move(sig));
126129
ret.push_back(ToByteVector(pubkey));
127130
return true;
128131
}
@@ -138,7 +141,7 @@ static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator
138141
ret.push_back(valtype()); // workaround CHECKMULTISIG bug
139142
for (size_t i = 1; i < vSolutions.size() - 1; ++i) {
140143
CPubKey pubkey = CPubKey(vSolutions[i]);
141-
if (ret.size() < required + 1 && CreateSig(creator, sigdata, provider, sig, pubkey.GetID(), scriptPubKey, sigversion)) {
144+
if (ret.size() < required + 1 && CreateSig(creator, sigdata, provider, sig, pubkey, scriptPubKey, sigversion)) {
142145
ret.push_back(std::move(sig));
143146
}
144147
}

0 commit comments

Comments
 (0)