BSHA3  0.17.99
P2P Blockchain, based on Bitcoin
sign.cpp
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2018 The Bitcoin Core 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 <script/sign.h>
7 
8 #include <key.h>
9 #include <policy/policy.h>
10 #include <primitives/transaction.h>
11 #include <script/standard.h>
12 #include <uint256.h>
13 
14 typedef std::vector<unsigned char> valtype;
15 
16 MutableTransactionSignatureCreator::MutableTransactionSignatureCreator(const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn) : txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {}
17 
18 bool MutableTransactionSignatureCreator::CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& address, const CScript& scriptCode, SigVersion sigversion) const
19 {
20  CKey key;
21  if (!provider.GetKey(address, key))
22  return false;
23 
24  // Signing with uncompressed keys is disabled in witness scripts
25  if (sigversion == SigVersion::WITNESS_V0 && !key.IsCompressed())
26  return false;
27 
28  uint256 hash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion);
29  if (!key.Sign(hash, vchSig))
30  return false;
31  vchSig.push_back((unsigned char)nHashType);
32  return true;
33 }
34 
35 static bool GetCScript(const SigningProvider& provider, const SignatureData& sigdata, const CScriptID& scriptid, CScript& script)
36 {
37  if (provider.GetCScript(scriptid, script)) {
38  return true;
39  }
40  // Look for scripts in SignatureData
41  if (CScriptID(sigdata.redeem_script) == scriptid) {
42  script = sigdata.redeem_script;
43  return true;
44  } else if (CScriptID(sigdata.witness_script) == scriptid) {
45  script = sigdata.witness_script;
46  return true;
47  }
48  return false;
49 }
50 
51 static bool GetPubKey(const SigningProvider& provider, SignatureData& sigdata, const CKeyID& address, CPubKey& pubkey)
52 {
53  // Look for pubkey in all partial sigs
54  const auto it = sigdata.signatures.find(address);
55  if (it != sigdata.signatures.end()) {
56  pubkey = it->second.first;
57  return true;
58  }
59  // Look for pubkey in pubkey list
60  const auto& pk_it = sigdata.misc_pubkeys.find(address);
61  if (pk_it != sigdata.misc_pubkeys.end()) {
62  pubkey = pk_it->second.first;
63  return true;
64  }
65  // Query the underlying provider
66  if (provider.GetPubKey(address, pubkey)) {
67  KeyOriginInfo info;
68  if (provider.GetKeyOrigin(address, info)) {
69  sigdata.misc_pubkeys.emplace(address, std::make_pair(pubkey, std::move(info)));
70  }
71  return true;
72  }
73  return false;
74 }
75 
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)
77 {
78  CKeyID keyid = pubkey.GetID();
79  const auto it = sigdata.signatures.find(keyid);
80  if (it != sigdata.signatures.end()) {
81  sig_out = it->second.second;
82  return true;
83  }
84  KeyOriginInfo info;
85  if (provider.GetKeyOrigin(keyid, info)) {
86  sigdata.misc_pubkeys.emplace(keyid, std::make_pair(pubkey, std::move(info)));
87  }
88  if (creator.CreateSig(provider, sig_out, keyid, scriptcode, sigversion)) {
89  auto i = sigdata.signatures.emplace(keyid, SigPair(pubkey, sig_out));
90  assert(i.second);
91  return true;
92  }
93  return false;
94 }
95 
102 static bool SignStep(const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& scriptPubKey,
103  std::vector<valtype>& ret, txnouttype& whichTypeRet, SigVersion sigversion, SignatureData& sigdata)
104 {
105  CScript scriptRet;
106  uint160 h160;
107  ret.clear();
108  std::vector<unsigned char> sig;
109 
110  std::vector<valtype> vSolutions;
111  whichTypeRet = Solver(scriptPubKey, vSolutions);
112 
113  switch (whichTypeRet)
114  {
115  case TX_NONSTANDARD:
116  case TX_NULL_DATA:
117  case TX_WITNESS_UNKNOWN:
118  return false;
119  case TX_PUBKEY:
120  if (!CreateSig(creator, sigdata, provider, sig, CPubKey(vSolutions[0]), scriptPubKey, sigversion)) return false;
121  ret.push_back(std::move(sig));
122  return true;
123  case TX_PUBKEYHASH: {
124  CKeyID keyID = CKeyID(uint160(vSolutions[0]));
125  CPubKey pubkey;
126  GetPubKey(provider, sigdata, keyID, pubkey);
127  if (!CreateSig(creator, sigdata, provider, sig, pubkey, scriptPubKey, sigversion)) return false;
128  ret.push_back(std::move(sig));
129  ret.push_back(ToByteVector(pubkey));
130  return true;
131  }
132  case TX_SCRIPTHASH:
133  if (GetCScript(provider, sigdata, uint160(vSolutions[0]), scriptRet)) {
134  ret.push_back(std::vector<unsigned char>(scriptRet.begin(), scriptRet.end()));
135  return true;
136  }
137  return false;
138 
139  case TX_MULTISIG: {
140  size_t required = vSolutions.front()[0];
141  ret.push_back(valtype()); // workaround CHECKMULTISIG bug
142  for (size_t i = 1; i < vSolutions.size() - 1; ++i) {
143  CPubKey pubkey = CPubKey(vSolutions[i]);
144  if (ret.size() < required + 1 && CreateSig(creator, sigdata, provider, sig, pubkey, scriptPubKey, sigversion)) {
145  ret.push_back(std::move(sig));
146  }
147  }
148  bool ok = ret.size() == required + 1;
149  for (size_t i = 0; i + ret.size() < required + 1; ++i) {
150  ret.push_back(valtype());
151  }
152  return ok;
153  }
155  ret.push_back(vSolutions[0]);
156  return true;
157 
159  CRIPEMD160().Write(&vSolutions[0][0], vSolutions[0].size()).Finalize(h160.begin());
160  if (GetCScript(provider, sigdata, h160, scriptRet)) {
161  ret.push_back(std::vector<unsigned char>(scriptRet.begin(), scriptRet.end()));
162  return true;
163  }
164  return false;
165 
166  default:
167  return false;
168  }
169 }
170 
171 static CScript PushAll(const std::vector<valtype>& values)
172 {
173  CScript result;
174  for (const valtype& v : values) {
175  if (v.size() == 0) {
176  result << OP_0;
177  } else if (v.size() == 1 && v[0] >= 1 && v[0] <= 16) {
178  result << CScript::EncodeOP_N(v[0]);
179  } else {
180  result << v;
181  }
182  }
183  return result;
184 }
185 
186 bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata)
187 {
188  if (sigdata.complete) return true;
189 
190  std::vector<valtype> result;
191  txnouttype whichType;
192  bool solved = SignStep(provider, creator, fromPubKey, result, whichType, SigVersion::BASE, sigdata);
193  bool P2SH = false;
194  CScript subscript;
195  sigdata.scriptWitness.stack.clear();
196 
197  if (solved && whichType == TX_SCRIPTHASH)
198  {
199  // Solver returns the subscript that needs to be evaluated;
200  // the final scriptSig is the signatures from that
201  // and then the serialized subscript:
202  subscript = CScript(result[0].begin(), result[0].end());
203  sigdata.redeem_script = subscript;
204  solved = solved && SignStep(provider, creator, subscript, result, whichType, SigVersion::BASE, sigdata) && whichType != TX_SCRIPTHASH;
205  P2SH = true;
206  }
207 
208  if (solved && whichType == TX_WITNESS_V0_KEYHASH)
209  {
210  CScript witnessscript;
211  witnessscript << OP_DUP << OP_HASH360 << ToByteVector(result[0]) << OP_EQUALVERIFY << OP_CHECKSIG;
212  txnouttype subType;
213  solved = solved && SignStep(provider, creator, witnessscript, result, subType, SigVersion::WITNESS_V0, sigdata);
214  sigdata.scriptWitness.stack = result;
215  sigdata.witness = true;
216  result.clear();
217  }
218  else if (solved && whichType == TX_WITNESS_V0_SCRIPTHASH)
219  {
220  CScript witnessscript(result[0].begin(), result[0].end());
221  sigdata.witness_script = witnessscript;
222  txnouttype subType;
223  solved = solved && SignStep(provider, creator, witnessscript, result, subType, SigVersion::WITNESS_V0, sigdata) && subType != TX_SCRIPTHASH && subType != TX_WITNESS_V0_SCRIPTHASH && subType != TX_WITNESS_V0_KEYHASH;
224  result.push_back(std::vector<unsigned char>(witnessscript.begin(), witnessscript.end()));
225  sigdata.scriptWitness.stack = result;
226  sigdata.witness = true;
227  result.clear();
228  } else if (solved && whichType == TX_WITNESS_UNKNOWN) {
229  sigdata.witness = true;
230  }
231 
232  if (P2SH) {
233  result.push_back(std::vector<unsigned char>(subscript.begin(), subscript.end()));
234  }
235  sigdata.scriptSig = PushAll(result);
236 
237  // Test solution
238  sigdata.complete = solved && VerifyScript(sigdata.scriptSig, fromPubKey, &sigdata.scriptWitness, STANDARD_SCRIPT_VERIFY_FLAGS, creator.Checker());
239  return sigdata.complete;
240 }
241 
242 bool SignPSBTInput(const SigningProvider& provider, const CMutableTransaction& tx, PSBTInput& input, int index, int sighash)
243 {
244  // if this input has a final scriptsig or scriptwitness, don't do anything with it
245  if (!input.final_script_sig.empty() || !input.final_script_witness.IsNull()) {
246  return true;
247  }
248 
249  // Fill SignatureData with input info
250  SignatureData sigdata;
251  input.FillSignatureData(sigdata);
252 
253  // Get UTXO
254  bool require_witness_sig = false;
255  CTxOut utxo;
256  if (input.non_witness_utxo) {
257  // If we're taking our information from a non-witness UTXO, verify that it matches the prevout.
258  if (input.non_witness_utxo->GetHash() != tx.vin[index].prevout.hash) return false;
259  // If both witness and non-witness UTXO are provided, verify that they match. This check shouldn't
260  // matter, as the PSBT deserializer enforces only one of both is provided, and the only way both
261  // can be present is when they're added simultaneously by FillPSBT (in which case they always match).
262  // Still, check in order to not rely on callers to enforce this.
263  if (!input.witness_utxo.IsNull() && input.non_witness_utxo->vout[tx.vin[index].prevout.n] != input.witness_utxo) return false;
264  utxo = input.non_witness_utxo->vout[tx.vin[index].prevout.n];
265  } else if (!input.witness_utxo.IsNull()) {
266  utxo = input.witness_utxo;
267  // When we're taking our information from a witness UTXO, we can't verify it is actually data from
268  // the output being spent. This is safe in case a witness signature is produced (which includes this
269  // information directly in the hash), but not for non-witness signatures. Remember that we require
270  // a witness signature in this situation.
271  require_witness_sig = true;
272  } else {
273  return false;
274  }
275 
276  MutableTransactionSignatureCreator creator(&tx, index, utxo.nValue, sighash);
277  sigdata.witness = false;
278  bool sig_complete = ProduceSignature(provider, creator, utxo.scriptPubKey, sigdata);
279  // Verify that a witness signature was produced in case one was required.
280  if (require_witness_sig && !sigdata.witness) return false;
281  input.FromSignatureData(sigdata);
282 
283  if (sigdata.witness) {
284  assert(!utxo.IsNull());
285  input.witness_utxo = utxo;
286  }
287 
288  // If both UTXO types are present, drop the unnecessary one.
289  if (input.non_witness_utxo && !input.witness_utxo.IsNull()) {
290  if (sigdata.witness) {
291  input.non_witness_utxo = nullptr;
292  } else {
293  input.witness_utxo.SetNull();
294  }
295  }
296 
297  return sig_complete;
298 }
299 
301 {
302 private:
305 
306 public:
308  bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const override;
309 };
310 
311 bool SignatureExtractorChecker::CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const
312 {
313  if (checker.CheckSig(scriptSig, vchPubKey, scriptCode, sigversion)) {
314  CPubKey pubkey(vchPubKey);
315  sigdata.signatures.emplace(pubkey.GetID(), SigPair(pubkey, scriptSig));
316  return true;
317  }
318  return false;
319 }
320 
321 namespace
322 {
323 struct Stacks
324 {
325  std::vector<valtype> script;
326  std::vector<valtype> witness;
327 
328  Stacks() = delete;
329  Stacks(const Stacks&) = delete;
330  explicit Stacks(const SignatureData& data) : witness(data.scriptWitness.stack) {
332  }
333 };
334 }
335 
336 // Extracts signatures and scripts from incomplete scriptSigs. Please do not extend this, use PSBT instead
337 SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn, const CTxOut& txout)
338 {
339  SignatureData data;
340  assert(tx.vin.size() > nIn);
341  data.scriptSig = tx.vin[nIn].scriptSig;
342  data.scriptWitness = tx.vin[nIn].scriptWitness;
343  Stacks stack(data);
344 
345  // Get signatures
346  MutableTransactionSignatureChecker tx_checker(&tx, nIn, txout.nValue);
347  SignatureExtractorChecker extractor_checker(data, tx_checker);
348  if (VerifyScript(data.scriptSig, txout.scriptPubKey, &data.scriptWitness, STANDARD_SCRIPT_VERIFY_FLAGS, extractor_checker)) {
349  data.complete = true;
350  return data;
351  }
352 
353  // Get scripts
354  std::vector<std::vector<unsigned char>> solutions;
355  txnouttype script_type = Solver(txout.scriptPubKey, solutions);
356  SigVersion sigversion = SigVersion::BASE;
357  CScript next_script = txout.scriptPubKey;
358 
359  if (script_type == TX_SCRIPTHASH && !stack.script.empty() && !stack.script.back().empty()) {
360  // Get the redeemScript
361  CScript redeem_script(stack.script.back().begin(), stack.script.back().end());
362  data.redeem_script = redeem_script;
363  next_script = std::move(redeem_script);
364 
365  // Get redeemScript type
366  script_type = Solver(next_script, solutions);
367  stack.script.pop_back();
368  }
369  if (script_type == TX_WITNESS_V0_SCRIPTHASH && !stack.witness.empty() && !stack.witness.back().empty()) {
370  // Get the witnessScript
371  CScript witness_script(stack.witness.back().begin(), stack.witness.back().end());
372  data.witness_script = witness_script;
373  next_script = std::move(witness_script);
374 
375  // Get witnessScript type
376  script_type = Solver(next_script, solutions);
377  stack.witness.pop_back();
378  stack.script = std::move(stack.witness);
379  stack.witness.clear();
380  sigversion = SigVersion::WITNESS_V0;
381  }
382  if (script_type == TX_MULTISIG && !stack.script.empty()) {
383  // Build a map of pubkey -> signature by matching sigs to pubkeys:
384  assert(solutions.size() > 1);
385  unsigned int num_pubkeys = solutions.size()-2;
386  unsigned int last_success_key = 0;
387  for (const valtype& sig : stack.script) {
388  for (unsigned int i = last_success_key; i < num_pubkeys; ++i) {
389  const valtype& pubkey = solutions[i+1];
390  // We either have a signature for this pubkey, or we have found a signature and it is valid
391  if (data.signatures.count(CPubKey(pubkey).GetID()) || extractor_checker.CheckSig(sig, pubkey, next_script, sigversion)) {
392  last_success_key = i + 1;
393  break;
394  }
395  }
396  }
397  }
398 
399  return data;
400 }
401 
402 void UpdateInput(CTxIn& input, const SignatureData& data)
403 {
404  input.scriptSig = data.scriptSig;
405  input.scriptWitness = data.scriptWitness;
406 }
407 
409 {
410  if (complete) return;
411  if (sigdata.complete) {
412  *this = std::move(sigdata);
413  return;
414  }
415  if (redeem_script.empty() && !sigdata.redeem_script.empty()) {
416  redeem_script = sigdata.redeem_script;
417  }
418  if (witness_script.empty() && !sigdata.witness_script.empty()) {
419  witness_script = sigdata.witness_script;
420  }
421  signatures.insert(std::make_move_iterator(sigdata.signatures.begin()), std::make_move_iterator(sigdata.signatures.end()));
422 }
423 
424 bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType)
425 {
426  assert(nIn < txTo.vin.size());
427 
428  MutableTransactionSignatureCreator creator(&txTo, nIn, amount, nHashType);
429 
430  SignatureData sigdata;
431  bool ret = ProduceSignature(provider, creator, fromPubKey, sigdata);
432  UpdateInput(txTo.vin.at(nIn), sigdata);
433  return ret;
434 }
435 
436 bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType)
437 {
438  assert(nIn < txTo.vin.size());
439  CTxIn& txin = txTo.vin[nIn];
440  assert(txin.prevout.n < txFrom.vout.size());
441  const CTxOut& txout = txFrom.vout[txin.prevout.n];
442 
443  return SignSignature(provider, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType);
444 }
445 
446 namespace {
448 class DummySignatureChecker final : public BaseSignatureChecker
449 {
450 public:
451  DummySignatureChecker() {}
452  bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const override { return true; }
453 };
454 const DummySignatureChecker DUMMY_CHECKER;
455 
456 class DummySignatureCreator final : public BaseSignatureCreator {
457 private:
458  char m_r_len = 32;
459  char m_s_len = 32;
460 public:
461  DummySignatureCreator(char r_len, char s_len) : m_r_len(r_len), m_s_len(s_len) {}
462  const BaseSignatureChecker& Checker() const override { return DUMMY_CHECKER; }
463  bool CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const override
464  {
465  // Create a dummy signature that is a valid DER-encoding
466  vchSig.assign(m_r_len + m_s_len + 7, '\000');
467  vchSig[0] = 0x30;
468  vchSig[1] = m_r_len + m_s_len + 4;
469  vchSig[2] = 0x02;
470  vchSig[3] = m_r_len;
471  vchSig[4] = 0x01;
472  vchSig[4 + m_r_len] = 0x02;
473  vchSig[5 + m_r_len] = m_s_len;
474  vchSig[6 + m_r_len] = 0x01;
475  vchSig[6 + m_r_len + m_s_len] = SIGHASH_ALL;
476  return true;
477  }
478 };
479 
480 template<typename M, typename K, typename V>
481 bool LookupHelper(const M& map, const K& key, V& value)
482 {
483  auto it = map.find(key);
484  if (it != map.end()) {
485  value = it->second;
486  return true;
487  }
488  return false;
489 }
490 
491 }
492 
493 const BaseSignatureCreator& DUMMY_SIGNATURE_CREATOR = DummySignatureCreator(32, 32);
494 const BaseSignatureCreator& DUMMY_MAXIMUM_SIGNATURE_CREATOR = DummySignatureCreator(33, 32);
496 
497 bool IsSolvable(const SigningProvider& provider, const CScript& script)
498 {
499  // This check is to make sure that the script we created can actually be solved for and signed by us
500  // if we were to have the private keys. This is just to make sure that the script is valid and that,
501  // if found in a transaction, we would still accept and relay that transaction. In particular,
502  // it will reject witness outputs that require signing with an uncompressed public key.
503  SignatureData sigs;
504  // Make sure that STANDARD_SCRIPT_VERIFY_FLAGS includes SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, the most
505  // important property this function is designed to test for.
506  static_assert(STANDARD_SCRIPT_VERIFY_FLAGS & SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, "IsSolvable requires standard script flags to include WITNESS_PUBKEYTYPE");
507  if (ProduceSignature(provider, DUMMY_SIGNATURE_CREATOR, script, sigs)) {
508  // VerifyScript check is just defensive, and should never fail.
509  bool verified = VerifyScript(sigs.scriptSig, script, &sigs.scriptWitness, STANDARD_SCRIPT_VERIFY_FLAGS, DUMMY_CHECKER);
510  assert(verified);
511  return true;
512  }
513  return false;
514 }
515 
517 {
518  return !tx && inputs.empty() && outputs.empty() && unknown.empty();
519 }
520 
522 {
523  for (unsigned int i = 0; i < inputs.size(); ++i) {
524  inputs[i].Merge(psbt.inputs[i]);
525  }
526  for (unsigned int i = 0; i < outputs.size(); ++i) {
527  outputs[i].Merge(psbt.outputs[i]);
528  }
529  unknown.insert(psbt.unknown.begin(), psbt.unknown.end());
530 }
531 
533 {
534  for (PSBTInput input : inputs) {
535  if (!input.IsSane()) return false;
536  }
537  return true;
538 }
539 
540 bool PSBTInput::IsNull() const
541 {
542  return !non_witness_utxo && witness_utxo.IsNull() && partial_sigs.empty() && unknown.empty() && hd_keypaths.empty() && redeem_script.empty() && witness_script.empty();
543 }
544 
546 {
547  if (!final_script_sig.empty()) {
548  sigdata.scriptSig = final_script_sig;
549  sigdata.complete = true;
550  }
551  if (!final_script_witness.IsNull()) {
553  sigdata.complete = true;
554  }
555  if (sigdata.complete) {
556  return;
557  }
558 
559  sigdata.signatures.insert(partial_sigs.begin(), partial_sigs.end());
560  if (!redeem_script.empty()) {
561  sigdata.redeem_script = redeem_script;
562  }
563  if (!witness_script.empty()) {
564  sigdata.witness_script = witness_script;
565  }
566  for (const auto& key_pair : hd_keypaths) {
567  sigdata.misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
568  }
569 }
570 
572 {
573  if (sigdata.complete) {
574  partial_sigs.clear();
575  hd_keypaths.clear();
578 
579  if (!sigdata.scriptSig.empty()) {
580  final_script_sig = sigdata.scriptSig;
581  }
582  if (!sigdata.scriptWitness.IsNull()) {
584  }
585  return;
586  }
587 
588  partial_sigs.insert(sigdata.signatures.begin(), sigdata.signatures.end());
589  if (redeem_script.empty() && !sigdata.redeem_script.empty()) {
590  redeem_script = sigdata.redeem_script;
591  }
592  if (witness_script.empty() && !sigdata.witness_script.empty()) {
593  witness_script = sigdata.witness_script;
594  }
595  for (const auto& entry : sigdata.misc_pubkeys) {
596  hd_keypaths.emplace(entry.second);
597  }
598 }
599 
600 void PSBTInput::Merge(const PSBTInput& input)
601 {
603  if (witness_utxo.IsNull() && !input.witness_utxo.IsNull()) {
604  witness_utxo = input.witness_utxo;
605  non_witness_utxo = nullptr; // Clear out any non-witness utxo when we set a witness one.
606  }
607 
608  partial_sigs.insert(input.partial_sigs.begin(), input.partial_sigs.end());
609  hd_keypaths.insert(input.hd_keypaths.begin(), input.hd_keypaths.end());
610  unknown.insert(input.unknown.begin(), input.unknown.end());
611 
616 }
617 
618 bool PSBTInput::IsSane() const
619 {
620  // Cannot have both witness and non-witness utxos
621  if (!witness_utxo.IsNull() && non_witness_utxo) return false;
622 
623  // If we have a witness_script or a scriptWitness, we must also have a witness utxo
624  if (!witness_script.empty() && witness_utxo.IsNull()) return false;
625  if (!final_script_witness.IsNull() && witness_utxo.IsNull()) return false;
626 
627  return true;
628 }
629 
631 {
632  if (!redeem_script.empty()) {
633  sigdata.redeem_script = redeem_script;
634  }
635  if (!witness_script.empty()) {
636  sigdata.witness_script = witness_script;
637  }
638  for (const auto& key_pair : hd_keypaths) {
639  sigdata.misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
640  }
641 }
642 
644 {
645  if (redeem_script.empty() && !sigdata.redeem_script.empty()) {
646  redeem_script = sigdata.redeem_script;
647  }
648  if (witness_script.empty() && !sigdata.witness_script.empty()) {
649  witness_script = sigdata.witness_script;
650  }
651  for (const auto& entry : sigdata.misc_pubkeys) {
652  hd_keypaths.emplace(entry.second);
653  }
654 }
655 
656 bool PSBTOutput::IsNull() const
657 {
658  return redeem_script.empty() && witness_script.empty() && hd_keypaths.empty() && unknown.empty();
659 }
660 
661 void PSBTOutput::Merge(const PSBTOutput& output)
662 {
663  hd_keypaths.insert(output.hd_keypaths.begin(), output.hd_keypaths.end());
664  unknown.insert(output.unknown.begin(), output.unknown.end());
665 
666  if (redeem_script.empty() && !output.redeem_script.empty()) redeem_script = output.redeem_script;
668 }
669 
670 bool HidingSigningProvider::GetCScript(const CScriptID& scriptid, CScript& script) const
671 {
672  return m_provider->GetCScript(scriptid, script);
673 }
674 
675 bool HidingSigningProvider::GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const
676 {
677  return m_provider->GetPubKey(keyid, pubkey);
678 }
679 
680 bool HidingSigningProvider::GetKey(const CKeyID& keyid, CKey& key) const
681 {
682  if (m_hide_secret) return false;
683  return m_provider->GetKey(keyid, key);
684 }
685 
687 {
688  if (m_hide_origin) return false;
689  return m_provider->GetKeyOrigin(keyid, info);
690 }
691 
692 bool FlatSigningProvider::GetCScript(const CScriptID& scriptid, CScript& script) const { return LookupHelper(scripts, scriptid, script); }
693 bool FlatSigningProvider::GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const { return LookupHelper(pubkeys, keyid, pubkey); }
694 bool FlatSigningProvider::GetKeyOrigin(const CKeyID& keyid, KeyOriginInfo& info) const { return LookupHelper(origins, keyid, info); }
695 bool FlatSigningProvider::GetKey(const CKeyID& keyid, CKey& key) const { return LookupHelper(keys, keyid, key); }
696 
698 {
700  ret.scripts = a.scripts;
701  ret.scripts.insert(b.scripts.begin(), b.scripts.end());
702  ret.pubkeys = a.pubkeys;
703  ret.pubkeys.insert(b.pubkeys.begin(), b.pubkeys.end());
704  ret.keys = a.keys;
705  ret.keys.insert(b.keys.begin(), b.keys.end());
706  return ret;
707 }
CAmount nValue
Definition: transaction.h:134
bool IsNull() const
Definition: sign.cpp:656
void SetNull()
Definition: transaction.h:152
bool CheckSig(const std::vector< unsigned char > &scriptSig, const std::vector< unsigned char > &vchPubKey, const CScript &scriptCode, SigVersion sigversion) const override
Definition: sign.cpp:311
unspendable OP_RETURN script that carries data
Definition: standard.h:64
CScript scriptPubKey
Definition: transaction.h:135
CScript witness_script
The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.
Definition: sign.h:111
boost::optional< CMutableTransaction > tx
Definition: sign.h:559
const SigningProvider * m_provider
Definition: sign.h:47
virtual bool CreateSig(const SigningProvider &provider, std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode, SigVersion sigversion) const =0
Create a singular (non-script) signature.
BaseSignatureChecker & checker
Definition: sign.cpp:304
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, const CScriptWitness *witness, unsigned int flags, const BaseSignatureChecker &checker, ScriptError *serror)
CScript scriptSig
The scriptSig of an input. Contains complete signatures or the traditional partial signatures format...
Definition: sign.h:109
std::vector< CTxIn > vin
Definition: transaction.h:362
std::map< CKeyID, CKey > keys
Definition: sign.h:62
CScriptWitness scriptWitness
Only serialized through CTransaction.
Definition: transaction.h:67
UniValue ret(UniValue::VARR)
Definition: rpcwallet.cpp:1140
Interface for signature creators.
Definition: sign.h:73
bool IsSane() const
Definition: sign.cpp:532
const BaseSignatureCreator & DUMMY_SIGNATURE_CREATOR
A signature creator that just produces 71-byte empty signatures.
Definition: sign.cpp:493
std::map< CKeyID, KeyOriginInfo > origins
Definition: sign.h:61
std::vector< std::vector< unsigned char > > stack
Definition: script.h:566
const BaseSignatureCreator & DUMMY_MAXIMUM_SIGNATURE_CREATOR
A signature creator that just produces 72-byte empty signatures.
Definition: sign.cpp:494
void Merge(const PSBTOutput &output)
Definition: sign.cpp:661
void FromSignatureData(const SignatureData &sigdata)
Definition: sign.cpp:571
txnouttype Solver(const CScript &scriptPubKey, std::vector< std::vector< unsigned char >> &vSolutionsRet)
Parse a scriptPubKey and identify script type for standard scripts.
Definition: standard.cpp:90
A version of CTransaction with the PSBT format.
Definition: sign.h:557
std::map< CKeyID, std::pair< CPubKey, KeyOriginInfo > > misc_pubkeys
Definition: sign.h:114
CTxOut witness_utxo
Definition: sign.h:222
A signature creator for transactions.
Definition: sign.h:83
bool IsNull() const
Definition: script.h:571
unsigned char * begin()
Definition: uint256.h:56
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
Definition: sign.cpp:670
CScript redeem_script
Definition: sign.h:223
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
Definition: pubkey.h:155
void Merge(const PSBTInput &input)
Definition: sign.cpp:600
bool SignSignature(const SigningProvider &provider, const CScript &fromPubKey, CMutableTransaction &txTo, unsigned int nIn, const CAmount &amount, int nHashType)
Produce a script signature for a transaction.
Definition: sign.cpp:424
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
Definition: sign.cpp:694
void FromSignatureData(const SignatureData &sigdata)
Definition: sign.cpp:643
bool IsNull() const
Definition: transaction.h:158
bool CreateSig(const SigningProvider &provider, std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode, SigVersion sigversion) const override
Create a singular (non-script) signature.
Definition: sign.cpp:18
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
A structure for PSBTs which contains per output information.
Definition: sign.h:444
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:205
std::vector< PSBTOutput > outputs
Definition: sign.h:561
iterator end()
Definition: prevector.h:303
std::map< CPubKey, KeyOriginInfo > hd_keypaths
Definition: sign.h:448
SignatureExtractorChecker(SignatureData &sigdata, BaseSignatureChecker &checker)
Definition: sign.cpp:307
if(!params[0].isNull()) nMinDepth
bool push_back(const UniValue &val)
Definition: univalue.cpp:108
Only for Witness versions not already defined above.
Definition: standard.h:67
const bool m_hide_origin
Definition: sign.h:46
virtual bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const
Definition: sign.h:35
std::map< CScriptID, CScript > scripts
Definition: sign.h:59
An input of a transaction.
Definition: transaction.h:61
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
Definition: sign.h:229
virtual bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const
Definition: sign.h:37
bool GetPubKey(const CKeyID &keyid, CPubKey &pubkey) const override
Definition: sign.cpp:675
std::map< CPubKey, KeyOriginInfo > hd_keypaths
Definition: sign.h:227
bool IsNull() const
Definition: sign.cpp:516
std::map< CKeyID, SigPair > partial_sigs
Definition: sign.h:228
An encapsulated public key.
Definition: pubkey.h:30
bool GetKey(const CKeyID &keyid, CKey &key) const override
Definition: sign.cpp:680
std::map< CKeyID, CPubKey > pubkeys
Definition: sign.h:60
std::pair< CPubKey, std::vector< unsigned char > > SigPair
Definition: sign.h:101
const std::vector< CTxOut > vout
Definition: transaction.h:282
CScriptWitness final_script_witness
Definition: sign.h:226
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
Definition: sign.h:449
auto end
Definition: rpcwallet.cpp:1068
A structure for PSBTs which contain per-input information.
Definition: sign.h:219
An output of a transaction.
Definition: transaction.h:131
void MergeSignatureData(SignatureData sigdata)
Definition: sign.cpp:408
bool IsCompressed() const
Check whether the public key corresponding to this private key is (to be) compressed.
Definition: key.h:96
bool EvalScript(std::vector< std::vector< unsigned char > > &stack, const CScript &script, unsigned int flags, const BaseSignatureChecker &checker, SigVersion sigversion, ScriptError *serror)
std::vector< PSBTInput > inputs
Definition: sign.h:560
virtual bool GetCScript(const CScriptID &scriptid, CScript &script) const
Definition: sign.h:34
CScriptWitness scriptWitness
The scriptWitness of an input. Contains complete signatures or the traditional partial signatures for...
Definition: sign.h:112
virtual bool GetKey(const CKeyID &address, CKey &key) const
Definition: sign.h:36
bool IsSolvable(const SigningProvider &provider, const CScript &script)
Definition: sign.cpp:497
CRIPEMD160 & Write(const unsigned char *data, size_t len)
Definition: ripemd160.cpp:247
CScript scriptSig
Definition: transaction.h:65
const bool m_hide_secret
Definition: sign.h:45
txnouttype
Definition: standard.h:56
256-bit opaque blob.
Definition: uint256.h:122
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
Definition: sign.cpp:692
bool IsSane() const
Definition: sign.cpp:618
bool GetKey(const CKeyID &keyid, CKey &key) const override
Definition: sign.cpp:695
void FillSignatureData(SignatureData &sigdata) const
Definition: sign.cpp:630
SignatureData & sigdata
Definition: sign.cpp:303
An interface to be implemented by keystores that support signing.
Definition: sign.h:30
static opcodetype EncodeOP_N(int n)
Definition: script.h:510
SignatureData DataFromTransaction(const CMutableTransaction &tx, unsigned int nIn, const CTxOut &txout)
Extract signature data from a transaction input, and insert it.
Definition: sign.cpp:337
CScript witness_script
Definition: sign.h:447
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:384
CScript redeem_script
Definition: sign.h:446
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
Definition: sign.cpp:686
bool empty() const
Definition: prevector.h:297
CTransactionRef non_witness_utxo
Definition: sign.h:221
A reference to a CKey: the Hash360 of its serialized public key.
Definition: pubkey.h:20
void UpdateInput(CTxIn &input, const SignatureData &data)
Definition: sign.cpp:402
uint256 SignatureHash(const CScript &scriptCode, const T &txTo, unsigned int nIn, int nHashType, const CAmount &amount, SigVersion sigversion, const PrecomputedTransactionData *cache)
virtual bool CheckSig(const std::vector< unsigned char > &scriptSig, const std::vector< unsigned char > &vchPubKey, const CScript &scriptCode, SigVersion sigversion) const
Definition: interpreter.h:147
160-bit opaque blob.
Definition: uint256.h:111
std::vector< std::string > keys
Definition: univalue.h:158
std::vector< unsigned char > valtype
Definition: interpreter.cpp:15
std::vector< unsigned char > valtype
Definition: sign.cpp:14
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
Definition: sign.cpp:186
iterator begin()
Definition: prevector.h:301
A reference to a CScript: the Hash360 of its serialization (see script.h)
Definition: standard.h:22
A mutable version of CTransaction.
Definition: transaction.h:360
void clear()
Definition: univalue.cpp:15
size_t size() const
Definition: univalue.h:69
An encapsulated private key.
Definition: key.h:27
CScript final_script_sig
Definition: sign.h:225
const SigningProvider & DUMMY_SIGNING_PROVIDER
Definition: sign.cpp:495
The basic transaction that is broadcasted on the network and contained in blocks. ...
Definition: transaction.h:264
void Merge(const PartiallySignedTransaction &psbt)
Definition: sign.cpp:521
void FillSignatureData(SignatureData &sigdata) const
Definition: sign.cpp:545
MutableTransactionSignatureCreator(const CMutableTransaction *txToIn, unsigned int nInIn, const CAmount &amountIn, int nHashTypeIn=SIGHASH_ALL)
Definition: sign.cpp:16
bool SignPSBTInput(const SigningProvider &provider, const CMutableTransaction &tx, PSBTInput &input, int index, int sighash)
Signs a PSBTInput, verifying that all provided data matches what is being signed. ...
Definition: sign.cpp:242
void Finalize(unsigned char hash[OUTPUT_SIZE])
Definition: ripemd160.cpp:273
bool complete
Stores whether the scriptSig and scriptWitness are complete.
Definition: sign.h:107
CScript witness_script
Definition: sign.h:224
Definition: script.h:51
FlatSigningProvider Merge(const FlatSigningProvider &a, const FlatSigningProvider &b)
Definition: sign.cpp:697
void clear()
Definition: script.h:554
bool GetPubKey(const CKeyID &keyid, CPubKey &pubkey) const override
Definition: sign.cpp:693
CScript redeem_script
The redeemScript (if any) for the input.
Definition: sign.h:110
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
Definition: sign.h:562
bool witness
Stores whether the input this SigData corresponds to is a witness input.
Definition: sign.h:108
std::map< CKeyID, SigPair > signatures
BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a ...
Definition: sign.h:113
A hasher class for RIPEMD-160.
Definition: ripemd160.h:12
bool IsNull() const
Definition: sign.cpp:540
Definition: script.h:100
virtual const BaseSignatureChecker & Checker() const =0
const CMutableTransaction * txTo
Definition: sign.h:84
std::vector< unsigned char > ToByteVector(const T &in)
Definition: script.h:42
SigVersion
Definition: interpreter.h:131