LCOV - code coverage report
Current view: top level - src/script - sign.h (source / functions) Hit Total Coverage
Test: fuzz_coverage.info Lines: 5 9 55.6 %
Date: 2023-11-10 23:46:46 Functions: 6 11 54.5 %
Branches: 7 60 11.7 %

           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                 :          0 : class BaseSignatureCreator {
      29                 :            : public:
      30                 :      54256 :     virtual ~BaseSignatureCreator() {}
      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                 :          0 : 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                 :       6028 :     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 [ #  # ][ #  # ]:          0 : struct SignatureData {
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
      69                 :     476651 :     bool complete = false; ///< Stores whether the scriptSig and scriptWitness are complete
      70                 :     476651 :     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 [ +  - ][ +  - ]:     953302 :     SignatureData() {}
         [ +  - ][ +  - ]
         [ -  + ][ +  - ]
                 [ +  - ]
      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 1.14