Coverage Report

Created: 2026-07-14 18:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/bitcoin/src/hash.h
Line
Count
Source
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-present 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_HASH_H
7
#define BITCOIN_HASH_H
8
9
#include <attributes.h>
10
#include <crypto/common.h>
11
#include <crypto/ripemd160.h>
12
#include <crypto/sha256.h>
13
#include <prevector.h>
14
#include <serialize.h>
15
#include <span.h>
16
#include <support/cleanse.h>
17
#include <uint256.h>
18
19
#include <string>
20
#include <vector>
21
22
/** A BIP32 chain code. Cleansed on destruction. */
23
class ChainCode : public base_blob<256> {
24
public:
25
0
    constexpr ChainCode() = default;
26
0
    constexpr explicit ChainCode(std::span<const unsigned char> vch) : base_blob<256>(vch) {}
27
0
    constexpr explicit ChainCode(const base_blob<256>& b) : base_blob<256>(b) {}
28
3.60M
    ~ChainCode() { memory_cleanse(data(), size()); }
29
};
30
31
/** A hasher class for Bitcoin's 256-bit hash (double SHA-256). */
32
class CHash256 {
33
private:
34
    CSHA256 sha;
35
public:
36
    static const size_t OUTPUT_SIZE = CSHA256::OUTPUT_SIZE;
37
38
24.3M
    void Finalize(std::span<unsigned char> output) {
39
24.3M
        assert(output.size() == OUTPUT_SIZE);
  Branch (39:9): [True: 24.3M, False: 0]
40
24.3M
        unsigned char buf[CSHA256::OUTPUT_SIZE];
41
24.3M
        sha.Finalize(buf);
42
24.3M
        sha.Reset().Write(buf, CSHA256::OUTPUT_SIZE).Finalize(output.data());
43
24.3M
    }
44
45
24.7M
    CHash256& Write(std::span<const unsigned char> input) {
46
24.7M
        sha.Write(input.data(), input.size());
47
24.7M
        return *this;
48
24.7M
    }
49
50
13.7M
    CHash256& Reset() {
51
13.7M
        sha.Reset();
52
13.7M
        return *this;
53
13.7M
    }
54
};
55
56
/** A hasher class for Bitcoin's 160-bit hash (SHA-256 + RIPEMD-160). */
57
class CHash160 {
58
private:
59
    CSHA256 sha;
60
public:
61
    static const size_t OUTPUT_SIZE = CRIPEMD160::OUTPUT_SIZE;
62
63
4.45k
    void Finalize(std::span<unsigned char> output) {
64
4.45k
        assert(output.size() == OUTPUT_SIZE);
  Branch (64:9): [True: 4.45k, False: 0]
65
4.45k
        unsigned char buf[CSHA256::OUTPUT_SIZE];
66
4.45k
        sha.Finalize(buf);
67
4.45k
        CRIPEMD160().Write(buf, CSHA256::OUTPUT_SIZE).Finalize(output.data());
68
4.45k
    }
69
70
4.45k
    CHash160& Write(std::span<const unsigned char> input) {
71
4.45k
        sha.Write(input.data(), input.size());
72
4.45k
        return *this;
73
4.45k
    }
74
75
0
    CHash160& Reset() {
76
0
        sha.Reset();
77
0
        return *this;
78
0
    }
79
};
80
81
/** Compute the 256-bit hash of an object. */
82
template<typename T>
83
inline uint256 Hash(const T& in1)
84
10.4M
{
85
10.4M
    uint256 result;
86
10.4M
    CHash256().Write(MakeUCharSpan(in1)).Finalize(result);
87
10.4M
    return result;
88
10.4M
}
Unexecuted instantiation: uint256 Hash<std::span<unsigned char const, 18446744073709551615ul> >(std::span<unsigned char const, 18446744073709551615ul> const&)
uint256 Hash<std::vector<unsigned char, std::allocator<unsigned char> > >(std::vector<unsigned char, std::allocator<unsigned char> > const&)
Line
Count
Source
84
10.4M
{
85
10.4M
    uint256 result;
86
10.4M
    CHash256().Write(MakeUCharSpan(in1)).Finalize(result);
87
10.4M
    return result;
88
10.4M
}
Unexecuted instantiation: uint256 Hash<std::span<unsigned char, 18446744073709551615ul> >(std::span<unsigned char, 18446744073709551615ul> const&)
89
90
/** Compute the 256-bit hash of the concatenation of two objects. */
91
template<typename T1, typename T2>
92
45.3k
inline uint256 Hash(const T1& in1, const T2& in2) {
93
45.3k
    uint256 result;
94
45.3k
    CHash256().Write(MakeUCharSpan(in1)).Write(MakeUCharSpan(in2)).Finalize(result);
95
45.3k
    return result;
96
45.3k
}
uint256 Hash<uint256, uint256>(uint256 const&, uint256 const&)
Line
Count
Source
92
45.3k
inline uint256 Hash(const T1& in1, const T2& in2) {
93
45.3k
    uint256 result;
94
45.3k
    CHash256().Write(MakeUCharSpan(in1)).Write(MakeUCharSpan(in2)).Finalize(result);
95
45.3k
    return result;
96
45.3k
}
Unexecuted instantiation: uint256 Hash<CPubKey, std::vector<unsigned char, secure_allocator<unsigned char> > >(CPubKey const&, std::vector<unsigned char, secure_allocator<unsigned char> > const&)
uint256 Hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned char [8]>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned char const (&) [8])
Line
Count
Source
92
27
inline uint256 Hash(const T1& in1, const T2& in2) {
93
27
    uint256 result;
94
27
    CHash256().Write(MakeUCharSpan(in1)).Write(MakeUCharSpan(in2)).Finalize(result);
95
27
    return result;
96
27
}
97
98
/** Compute the 160-bit hash an object. */
99
template<typename T1>
100
inline uint160 Hash160(const T1& in1)
101
0
{
102
0
    uint160 result;
103
0
    CHash160().Write(MakeUCharSpan(in1)).Finalize(result);
104
0
    return result;
105
0
}
Unexecuted instantiation: uint160 Hash160<std::span<unsigned char const, 18446744073709551615ul> >(std::span<unsigned char const, 18446744073709551615ul> const&)
Unexecuted instantiation: uint160 Hash160<std::vector<unsigned char, std::allocator<unsigned char> > >(std::vector<unsigned char, std::allocator<unsigned char> > const&)
Unexecuted instantiation: uint160 Hash160<CScript>(CScript const&)
Unexecuted instantiation: uint160 Hash160<XOnlyPubKey>(XOnlyPubKey const&)
106
107
/** A writer stream (for serialization) that computes a 256-bit hash. */
108
class HashWriter
109
{
110
private:
111
    CSHA256 ctx;
112
113
public:
114
    void write(std::span<const std::byte> src)
115
361M
    {
116
361M
        ctx.Write(UCharCast(src.data()), src.size());
117
361M
    }
118
119
    /** Compute the double-SHA256 hash of all data written to this object.
120
     *
121
     * Invalidates this object.
122
     */
123
10.5M
    uint256 GetHash() {
124
10.5M
        uint256 result;
125
10.5M
        ctx.Finalize(result.begin());
126
10.5M
        ctx.Reset().Write(result.begin(), CSHA256::OUTPUT_SIZE).Finalize(result.begin());
127
10.5M
        return result;
128
10.5M
    }
129
130
    /** Compute the SHA256 hash of all data written to this object.
131
     *
132
     * Invalidates this object.
133
     */
134
1.60M
    uint256 GetSHA256() {
135
1.60M
        uint256 result;
136
1.60M
        ctx.Finalize(result.begin());
137
1.60M
        return result;
138
1.60M
    }
139
140
    /**
141
     * Returns the first 64 bits from the resulting hash.
142
     */
143
944k
    inline uint64_t GetCheapHash() {
144
944k
        uint256 result = GetHash();
145
944k
        return ReadLE64(result.begin());
146
944k
    }
147
148
    template <typename T>
149
    HashWriter& operator<<(const T& obj)
150
20.5M
    {
151
20.5M
        ::Serialize(*this, obj);
152
20.5M
        return *this;
153
20.5M
    }
HashWriter& HashWriter::operator<< <uint256>(uint256 const&)
Line
Count
Source
150
1.11M
    {
151
1.11M
        ::Serialize(*this, obj);
152
1.11M
        return *this;
153
1.11M
    }
HashWriter& HashWriter::operator<< <std::span<unsigned char const, 32ul> >(std::span<unsigned char const, 32ul> const&)
Line
Count
Source
150
5.84M
    {
151
5.84M
        ::Serialize(*this, obj);
152
5.84M
        return *this;
153
5.84M
    }
HashWriter& HashWriter::operator<< <std::vector<unsigned char, std::allocator<unsigned char> > >(std::vector<unsigned char, std::allocator<unsigned char> > const&)
Line
Count
Source
150
1.25M
    {
151
1.25M
        ::Serialize(*this, obj);
152
1.25M
        return *this;
153
1.25M
    }
HashWriter& HashWriter::operator<< <unsigned long>(unsigned long const&)
Line
Count
Source
150
314k
    {
151
314k
        ::Serialize(*this, obj);
152
314k
        return *this;
153
314k
    }
HashWriter& HashWriter::operator<< <unsigned char>(unsigned char const&)
Line
Count
Source
150
354k
    {
151
354k
        ::Serialize(*this, obj);
152
354k
        return *this;
153
354k
    }
HashWriter& HashWriter::operator<< <int>(int const&)
Line
Count
Source
150
318k
    {
151
318k
        ::Serialize(*this, obj);
152
318k
        return *this;
153
318k
    }
HashWriter& HashWriter::operator<< <COutPoint>(COutPoint const&)
Line
Count
Source
150
540k
    {
151
540k
        ::Serialize(*this, obj);
152
540k
        return *this;
153
540k
    }
HashWriter& HashWriter::operator<< <unsigned int>(unsigned int const&)
Line
Count
Source
150
579k
    {
151
579k
        ::Serialize(*this, obj);
152
579k
        return *this;
153
579k
    }
HashWriter& HashWriter::operator<< <CTxOut>(CTxOut const&)
Line
Count
Source
150
587k
    {
151
587k
        ::Serialize(*this, obj);
152
587k
        return *this;
153
587k
    }
HashWriter& HashWriter::operator<< <CBlockUndo>(CBlockUndo const&)
Line
Count
Source
150
33.5k
    {
151
33.5k
        ::Serialize(*this, obj);
152
33.5k
        return *this;
153
33.5k
    }
HashWriter& HashWriter::operator<< <Wrapper<VarIntFormatter<(VarIntMode)0>, unsigned long&> >(Wrapper<VarIntFormatter<(VarIntMode)0>, unsigned long&> const&)
Line
Count
Source
150
78.4k
    {
151
78.4k
        ::Serialize(*this, obj);
152
78.4k
        return *this;
153
78.4k
    }
HashWriter& HashWriter::operator<< <std::span<unsigned char, 18446744073709551615ul> >(std::span<unsigned char, 18446744073709551615ul> const&)
Line
Count
Source
150
839
    {
151
839
        ::Serialize(*this, obj);
152
839
        return *this;
153
839
    }
HashWriter& HashWriter::operator<< <Wrapper<VarIntFormatter<(VarIntMode)0>, unsigned int&> >(Wrapper<VarIntFormatter<(VarIntMode)0>, unsigned int&> const&)
Line
Count
Source
150
77.6k
    {
151
77.6k
        ::Serialize(*this, obj);
152
77.6k
        return *this;
153
77.6k
    }
HashWriter& HashWriter::operator<< <std::span<unsigned char const, 18446744073709551615ul> >(std::span<unsigned char const, 18446744073709551615ul> const&)
Line
Count
Source
150
82.6k
    {
151
82.6k
        ::Serialize(*this, obj);
152
82.6k
        return *this;
153
82.6k
    }
HashWriter& HashWriter::operator<< <transaction_identifier<true> >(transaction_identifier<true> const&)
Line
Count
Source
150
55.9k
    {
151
55.9k
        ::Serialize(*this, obj);
152
55.9k
        return *this;
153
55.9k
    }
Unexecuted instantiation: HashWriter& HashWriter::operator<< <std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
Unexecuted instantiation: HashWriter& HashWriter::operator<< <CPubKey>(CPubKey const&)
Unexecuted instantiation: HashWriter& HashWriter::operator<< <std::span<std::byte const, 18446744073709551615ul> >(std::span<std::byte const, 18446744073709551615ul> const&)
HashWriter& HashWriter::operator<< <CBlockHeader>(CBlockHeader const&)
Line
Count
Source
150
2.06M
    {
151
2.06M
        ::Serialize(*this, obj);
152
2.06M
        return *this;
153
2.06M
    }
Unexecuted instantiation: HashWriter& HashWriter::operator<< <ParamsWrapper<TransactionSerParams, CMutableTransaction const> >(ParamsWrapper<TransactionSerParams, CMutableTransaction const> const&)
HashWriter& HashWriter::operator<< <ParamsWrapper<TransactionSerParams, CTransaction const> >(ParamsWrapper<TransactionSerParams, CTransaction const> const&)
Line
Count
Source
150
7.18M
    {
151
7.18M
        ::Serialize(*this, obj);
152
7.18M
        return *this;
153
7.18M
    }
HashWriter& HashWriter::operator<< <long>(long const&)
Line
Count
Source
150
18.6k
    {
151
18.6k
        ::Serialize(*this, obj);
152
18.6k
        return *this;
153
18.6k
    }
HashWriter& HashWriter::operator<< <CScript>(CScript const&)
Line
Count
Source
150
18.6k
    {
151
18.6k
        ::Serialize(*this, obj);
152
18.6k
        return *this;
153
18.6k
    }
interpreter.cpp:HashWriter& HashWriter::operator<< <(anonymous namespace)::CTransactionSignatureSerializer<CTransaction> >((anonymous namespace)::CTransactionSignatureSerializer<CTransaction> const&)
Line
Count
Source
150
3.41k
    {
151
3.41k
        ::Serialize(*this, obj);
152
3.41k
        return *this;
153
3.41k
    }
Unexecuted instantiation: interpreter.cpp:HashWriter& HashWriter::operator<< <(anonymous namespace)::CTransactionSignatureSerializer<CMutableTransaction> >((anonymous namespace)::CTransactionSignatureSerializer<CMutableTransaction> const&)
HashWriter& HashWriter::operator<< <CompactSizeWriter>(CompactSizeWriter const&)
Line
Count
Source
150
1.52k
    {
151
1.52k
        ::Serialize(*this, obj);
152
1.52k
        return *this;
153
1.52k
    }
Unexecuted instantiation: HashWriter& HashWriter::operator<< <unsigned char [384]>(unsigned char const (&) [384])
154
};
155
156
/** Reads data from an underlying stream, while hashing the read data. */
157
template <typename Source>
158
class HashVerifier : public HashWriter
159
{
160
private:
161
    Source& m_source;
162
163
public:
164
64.5k
    explicit HashVerifier(Source& source LIFETIMEBOUND) : m_source{source} {}
Unexecuted instantiation: HashVerifier<DataStream>::HashVerifier(DataStream&)
Unexecuted instantiation: HashVerifier<AutoFile>::HashVerifier(AutoFile&)
HashVerifier<BufferedReader<AutoFile> >::HashVerifier(BufferedReader<AutoFile>&)
Line
Count
Source
164
64.5k
    explicit HashVerifier(Source& source LIFETIMEBOUND) : m_source{source} {}
165
166
    void read(std::span<std::byte> dst)
167
1.58M
    {
168
1.58M
        m_source.read(dst);
169
1.58M
        this->write(dst);
170
1.58M
    }
Unexecuted instantiation: HashVerifier<DataStream>::read(std::span<std::byte, 18446744073709551615ul>)
Unexecuted instantiation: HashVerifier<AutoFile>::read(std::span<std::byte, 18446744073709551615ul>)
HashVerifier<BufferedReader<AutoFile> >::read(std::span<std::byte, 18446744073709551615ul>)
Line
Count
Source
167
1.58M
    {
168
1.58M
        m_source.read(dst);
169
1.58M
        this->write(dst);
170
1.58M
    }
171
172
    void ignore(size_t num_bytes)
173
0
    {
174
0
        std::byte data[1024];
175
0
        while (num_bytes > 0) {
  Branch (175:16): [True: 0, False: 0]
  Branch (175:16): [True: 0, False: 0]
  Branch (175:16): [True: 0, False: 0]
176
0
            size_t now = std::min<size_t>(num_bytes, 1024);
177
0
            read({data, now});
178
0
            num_bytes -= now;
179
0
        }
180
0
    }
Unexecuted instantiation: HashVerifier<AutoFile>::ignore(unsigned long)
Unexecuted instantiation: HashVerifier<DataStream>::ignore(unsigned long)
Unexecuted instantiation: HashVerifier<BufferedReader<AutoFile> >::ignore(unsigned long)
181
182
    template <typename T>
183
    HashVerifier<Source>& operator>>(T&& obj)
184
649k
    {
185
649k
        ::Unserialize(*this, obj);
186
649k
        return *this;
187
649k
    }
Unexecuted instantiation: HashVerifier<DataStream>& HashVerifier<DataStream>::operator>><std::array<unsigned char, 4ul>&>(std::array<unsigned char, 4ul>&)
Unexecuted instantiation: HashVerifier<DataStream>& HashVerifier<DataStream>::operator>><AddrMan&>(AddrMan&)
Unexecuted instantiation: HashVerifier<AutoFile>& HashVerifier<AutoFile>::operator>><std::array<unsigned char, 4ul>&>(std::array<unsigned char, 4ul>&)
Unexecuted instantiation: HashVerifier<AutoFile>& HashVerifier<AutoFile>::operator>><AddrMan&>(AddrMan&)
Unexecuted instantiation: HashVerifier<AutoFile>& HashVerifier<AutoFile>::operator>><ParamsWrapper<CAddress::SerParams, std::vector<CAddress, std::allocator<CAddress> > >&>(ParamsWrapper<CAddress::SerParams, std::vector<CAddress, std::allocator<CAddress> > >&)
Unexecuted instantiation: HashVerifier<AutoFile>& HashVerifier<AutoFile>::operator>><Wrapper<CustomUintFormatter<1, false>, AddrManImpl::Format&> >(Wrapper<CustomUintFormatter<1, false>, AddrManImpl::Format&>&&)
Unexecuted instantiation: HashVerifier<DataStream>& HashVerifier<DataStream>::operator>><Wrapper<CustomUintFormatter<1, false>, AddrManImpl::Format&> >(Wrapper<CustomUintFormatter<1, false>, AddrManImpl::Format&>&&)
HashVerifier<BufferedReader<AutoFile> >& HashVerifier<BufferedReader<AutoFile> >::operator>><CBlockUndo&>(CBlockUndo&)
Line
Count
Source
184
64.5k
    {
185
64.5k
        ::Unserialize(*this, obj);
186
64.5k
        return *this;
187
64.5k
    }
HashVerifier<BufferedReader<AutoFile> >& HashVerifier<BufferedReader<AutoFile> >::operator>><Wrapper<VarIntFormatter<(VarIntMode)0>, unsigned long&> >(Wrapper<VarIntFormatter<(VarIntMode)0>, unsigned long&>&&)
Line
Count
Source
184
194k
    {
185
194k
        ::Unserialize(*this, obj);
186
194k
        return *this;
187
194k
    }
HashVerifier<BufferedReader<AutoFile> >& HashVerifier<BufferedReader<AutoFile> >::operator>><Wrapper<VarIntFormatter<(VarIntMode)0>, unsigned int&> >(Wrapper<VarIntFormatter<(VarIntMode)0>, unsigned int&>&&)
Line
Count
Source
184
194k
    {
185
194k
        ::Unserialize(*this, obj);
186
194k
        return *this;
187
194k
    }
HashVerifier<BufferedReader<AutoFile> >& HashVerifier<BufferedReader<AutoFile> >::operator>><std::span<unsigned char, 18446744073709551615ul> >(std::span<unsigned char, 18446744073709551615ul>&&)
Line
Count
Source
184
194k
    {
185
194k
        ::Unserialize(*this, obj);
186
194k
        return *this;
187
194k
    }
188
};
189
190
/** Writes data to an underlying source stream, while hashing the written data. */
191
template <typename Source>
192
class HashedSourceWriter : public HashWriter
193
{
194
private:
195
    Source& m_source;
196
197
public:
198
215k
    explicit HashedSourceWriter(Source& source LIFETIMEBOUND) : HashWriter{}, m_source{source} {}
199
200
    void write(std::span<const std::byte> src)
201
230M
    {
202
230M
        m_source.write(src);
203
230M
        HashWriter::write(src);
204
230M
    }
205
206
    template <typename T>
207
    HashedSourceWriter& operator<<(const T& obj)
208
430k
    {
209
430k
        ::Serialize(*this, obj);
210
430k
        return *this;
211
430k
    }
HashedSourceWriter<AutoFile>& HashedSourceWriter<AutoFile>::operator<< <std::array<unsigned char, 4ul> >(std::array<unsigned char, 4ul> const&)
Line
Count
Source
208
215k
    {
209
215k
        ::Serialize(*this, obj);
210
215k
        return *this;
211
215k
    }
HashedSourceWriter<AutoFile>& HashedSourceWriter<AutoFile>::operator<< <AddrMan>(AddrMan const&)
Line
Count
Source
208
215k
    {
209
215k
        ::Serialize(*this, obj);
210
215k
        return *this;
211
215k
    }
Unexecuted instantiation: HashedSourceWriter<AutoFile>& HashedSourceWriter<AutoFile>::operator<< <ParamsWrapper<CAddress::SerParams, std::vector<CAddress, std::allocator<CAddress> > const> >(ParamsWrapper<CAddress::SerParams, std::vector<CAddress, std::allocator<CAddress> > const> const&)
212
};
213
214
/** Single-SHA256 a 32-byte input (represented as uint256). */
215
[[nodiscard]] uint256 SHA256Uint256(const uint256& input);
216
217
unsigned int MurmurHash3(unsigned int nHashSeed, std::span<const unsigned char> vDataToHash);
218
219
void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]);
220
221
/** Return a HashWriter primed for tagged hashes (as specified in BIP 340).
222
 *
223
 * The returned object will have SHA256(tag) written to it twice (= 64 bytes).
224
 * A tagged hash can be computed by feeding the message into this object, and
225
 * then calling HashWriter::GetSHA256().
226
 */
227
HashWriter TaggedHash(const std::string& tag);
228
229
/** Compute the 160-bit RIPEMD-160 hash of an array. */
230
inline uint160 RIPEMD160(std::span<const unsigned char> data)
231
0
{
232
0
    uint160 result;
233
0
    CRIPEMD160().Write(data.data(), data.size()).Finalize(result.begin());
234
0
    return result;
235
0
}
236
237
#endif // BITCOIN_HASH_H