Coverage Report

Created: 2024-09-19 18:47

/root/bitcoin/src/script/sign.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-2022 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
#ifndef BITCOIN_SCRIPT_SIGN_H
7
#define BITCOIN_SCRIPT_SIGN_H
8
9
#include <attributes.h>
10
#include <coins.h>
11
#include <hash.h>
12
#include <pubkey.h>
13
#include <script/interpreter.h>
14
#include <script/keyorigin.h>
15
#include <script/signingprovider.h>
16
#include <uint256.h>
17
18
class CKey;
19
class CKeyID;
20
class CScript;
21
class CTransaction;
22
class SigningProvider;
23
24
struct bilingual_str;
25
struct CMutableTransaction;
26
27
/** Interface for signature creators. */
28
class BaseSignatureCreator {
29
public:
30
0
    virtual ~BaseSignatureCreator() = default;
31
    virtual const BaseSignatureChecker& Checker() const =0;
32
33
    /** Create a singular (non-script) signature. */
34
    virtual bool CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const =0;
35
    virtual bool CreateSchnorrSig(const SigningProvider& provider, std::vector<unsigned char>& sig, const XOnlyPubKey& pubkey, const uint256* leaf_hash, const uint256* merkle_root, SigVersion sigversion) const =0;
36
};
37
38
/** A signature creator for transactions. */
39
class MutableTransactionSignatureCreator : public BaseSignatureCreator
40
{
41
    const CMutableTransaction& m_txto;
42
    unsigned int nIn;
43
    int nHashType;
44
    CAmount amount;
45
    const MutableTransactionSignatureChecker checker;
46
    const PrecomputedTransactionData* m_txdata;
47
48
public:
49
    MutableTransactionSignatureCreator(const CMutableTransaction& tx LIFETIMEBOUND, unsigned int input_idx, const CAmount& amount, int hash_type);
50
    MutableTransactionSignatureCreator(const CMutableTransaction& tx LIFETIMEBOUND, unsigned int input_idx, const CAmount& amount, const PrecomputedTransactionData* txdata, int hash_type);
51
0
    const BaseSignatureChecker& Checker() const override { return checker; }
52
    bool CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const override;
53
    bool CreateSchnorrSig(const SigningProvider& provider, std::vector<unsigned char>& sig, const XOnlyPubKey& pubkey, const uint256* leaf_hash, const uint256* merkle_root, SigVersion sigversion) const override;
54
};
55
56
/** A signature checker that accepts all signatures */
57
extern const BaseSignatureChecker& DUMMY_CHECKER;
58
/** A signature creator that just produces 71-byte empty signatures. */
59
extern const BaseSignatureCreator& DUMMY_SIGNATURE_CREATOR;
60
/** A signature creator that just produces 72-byte empty signatures. */
61
extern const BaseSignatureCreator& DUMMY_MAXIMUM_SIGNATURE_CREATOR;
62
63
typedef std::pair<CPubKey, std::vector<unsigned char>> SigPair;
64
65
// This struct contains information from a transaction input and also contains signatures for that input.
66
// The information contained here can be used to create a signature and is also filled by ProduceSignature
67
// in order to construct final scriptSigs and scriptWitnesses.
68
struct SignatureData {
69
    bool complete = false; ///< Stores whether the scriptSig and scriptWitness are complete
70
    bool witness = false; ///< Stores whether the input this SigData corresponds to is a witness input
71
    CScript scriptSig; ///< The scriptSig of an input. Contains complete signatures or the traditional partial signatures format
72
    CScript redeem_script; ///< The redeemScript (if any) for the input
73
    CScript witness_script; ///< The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.
74
    CScriptWitness scriptWitness; ///< The scriptWitness of an input. Contains complete signatures or the traditional partial signatures format. scriptWitness is part of a transaction input per BIP 144.
75
    TaprootSpendData tr_spenddata; ///< Taproot spending data.
76
    std::optional<TaprootBuilder> tr_builder; ///< Taproot tree used to build tr_spenddata.
77
    std::map<CKeyID, SigPair> signatures; ///< BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a final scriptSig or scriptWitness.
78
    std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> misc_pubkeys;
79
    std::vector<unsigned char> taproot_key_path_sig; /// Schnorr signature for key path spending
80
    std::map<std::pair<XOnlyPubKey, uint256>, std::vector<unsigned char>> taproot_script_sigs; ///< (Partial) schnorr signatures, indexed by XOnlyPubKey and leaf_hash.
81
    std::map<XOnlyPubKey, std::pair<std::set<uint256>, KeyOriginInfo>> taproot_misc_pubkeys; ///< Miscellaneous Taproot pubkeys involved in this input along with their leaf script hashes and key origin data. Also includes the Taproot internal key (may have no leaf script hashes).
82
    std::map<CKeyID, XOnlyPubKey> tap_pubkeys; ///< Misc Taproot pubkeys involved in this input, by hash. (Equivalent of misc_pubkeys but for Taproot.)
83
    std::vector<CKeyID> missing_pubkeys; ///< KeyIDs of pubkeys which could not be found
84
    std::vector<CKeyID> missing_sigs; ///< KeyIDs of pubkeys for signatures which could not be found
85
    uint160 missing_redeem_script; ///< ScriptID of the missing redeemScript (if any)
86
    uint256 missing_witness_script; ///< SHA256 of the missing witnessScript (if any)
87
    std::map<std::vector<uint8_t>, std::vector<uint8_t>> sha256_preimages; ///< Mapping from a SHA256 hash to its preimage provided to solve a Script
88
    std::map<std::vector<uint8_t>, std::vector<uint8_t>> hash256_preimages; ///< Mapping from a HASH256 hash to its preimage provided to solve a Script
89
    std::map<std::vector<uint8_t>, std::vector<uint8_t>> ripemd160_preimages; ///< Mapping from a RIPEMD160 hash to its preimage provided to solve a Script
90
    std::map<std::vector<uint8_t>, std::vector<uint8_t>> hash160_preimages; ///< Mapping from a HASH160 hash to its preimage provided to solve a Script
91
92
0
    SignatureData() = default;
93
0
    explicit SignatureData(const CScript& script) : scriptSig(script) {}
94
    void MergeSignatureData(SignatureData sigdata);
95
};
96
97
/** Produce a script signature using a generic signature creator. */
98
bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata);
99
100
/**
101
 * Produce a satisfying script (scriptSig or witness).
102
 *
103
 * @param provider   Utility containing the information necessary to solve a script.
104
 * @param fromPubKey The script to produce a satisfaction for.
105
 * @param txTo       The spending transaction.
106
 * @param nIn        The index of the input in `txTo` referring the output being spent.
107
 * @param amount     The value of the output being spent.
108
 * @param nHashType  Signature hash type.
109
 * @param sig_data   Additional data provided to solve a script. Filled with the resulting satisfying
110
 *                   script and whether the satisfaction is complete.
111
 *
112
 * @return           True if the produced script is entirely satisfying `fromPubKey`.
113
 **/
114
bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, CMutableTransaction& txTo,
115
                   unsigned int nIn, const CAmount& amount, int nHashType, SignatureData& sig_data);
116
bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom, CMutableTransaction& txTo,
117
                   unsigned int nIn, int nHashType, SignatureData& sig_data);
118
119
/** Extract signature data from a transaction input, and insert it. */
120
SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn, const CTxOut& txout);
121
void UpdateInput(CTxIn& input, const SignatureData& data);
122
123
/** Check whether a scriptPubKey is known to be segwit. */
124
bool IsSegWitOutput(const SigningProvider& provider, const CScript& script);
125
126
/** Sign the CMutableTransaction */
127
bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* provider, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors);
128
129
#endif // BITCOIN_SCRIPT_SIGN_H