LCOV - code coverage report
Current view: top level - src/script - sign.h (source / functions) Coverage Total Hit
Test: test_bitcoin_coverage.info Lines: 83.3 % 6 5
Test Date: 2024-08-28 04:44:32 Functions: 66.7 % 3 2
Branches: 35.7 % 14 5

             Branch data     Line data    Source code
       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         [ +  - ]:         500 : class BaseSignatureCreator {
      29                 :             : public:
      30         [ #  # ]:        5140 :     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         [ #  # ]:        5140 : 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                 :        5018 :     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                 :      121889 :     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
        

Generated by: LCOV version 2.0-1