Branch data Line data Source code
1 : : // Copyright (c) 2013-2022 The Bitcoin Core developers
2 : : // Distributed under the MIT software license, see the accompanying
3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 : :
5 : : #include <hash.h>
6 : : #include <span.h>
7 : : #include <crypto/common.h>
8 : : #include <crypto/hmac_sha512.h>
9 : :
10 : : #include <bit>
11 : : #include <string>
12 : :
13 : 0 : unsigned int MurmurHash3(unsigned int nHashSeed, Span<const unsigned char> vDataToHash)
14 : : {
15 : : // The following is MurmurHash3 (x86_32), see https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
16 : 0 : uint32_t h1 = nHashSeed;
17 : 0 : const uint32_t c1 = 0xcc9e2d51;
18 : 0 : const uint32_t c2 = 0x1b873593;
19 : :
20 : 0 : const int nblocks = vDataToHash.size() / 4;
21 : :
22 : : //----------
23 : : // body
24 : 0 : const uint8_t* blocks = vDataToHash.data();
25 : :
26 [ # # ]: 0 : for (int i = 0; i < nblocks; ++i) {
27 : 0 : uint32_t k1 = ReadLE32(blocks + i*4);
28 : :
29 : 0 : k1 *= c1;
30 : 0 : k1 = std::rotl(k1, 15);
31 : 0 : k1 *= c2;
32 : :
33 : 0 : h1 ^= k1;
34 : 0 : h1 = std::rotl(h1, 13);
35 : 0 : h1 = h1 * 5 + 0xe6546b64;
36 : : }
37 : :
38 : : //----------
39 : : // tail
40 : 0 : const uint8_t* tail = vDataToHash.data() + nblocks * 4;
41 : :
42 : 0 : uint32_t k1 = 0;
43 : :
44 [ # # # # ]: 0 : switch (vDataToHash.size() & 3) {
45 : 0 : case 3:
46 : 0 : k1 ^= tail[2] << 16;
47 : 0 : [[fallthrough]];
48 : 0 : case 2:
49 : 0 : k1 ^= tail[1] << 8;
50 : 0 : [[fallthrough]];
51 : 0 : case 1:
52 : 0 : k1 ^= tail[0];
53 : 0 : k1 *= c1;
54 : 0 : k1 = std::rotl(k1, 15);
55 : 0 : k1 *= c2;
56 : 0 : h1 ^= k1;
57 : : }
58 : :
59 : : //----------
60 : : // finalization
61 : 0 : h1 ^= vDataToHash.size();
62 : 0 : h1 ^= h1 >> 16;
63 : 0 : h1 *= 0x85ebca6b;
64 : 0 : h1 ^= h1 >> 13;
65 : 0 : h1 *= 0xc2b2ae35;
66 : 0 : h1 ^= h1 >> 16;
67 : :
68 : 0 : return h1;
69 : : }
70 : :
71 : 0 : void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64])
72 : : {
73 : 0 : unsigned char num[4];
74 : 0 : WriteBE32(num, nChild);
75 : 0 : CHMAC_SHA512(chainCode.begin(), chainCode.size()).Write(&header, 1).Write(data, 32).Write(num, 4).Finalize(output);
76 : 0 : }
77 : :
78 : 0 : uint256 SHA256Uint256(const uint256& input)
79 : : {
80 : 0 : uint256 result;
81 : 0 : CSHA256().Write(input.begin(), 32).Finalize(result.begin());
82 : 0 : return result;
83 : : }
84 : :
85 : 10 : HashWriter TaggedHash(const std::string& tag)
86 : : {
87 : 10 : HashWriter writer{};
88 : 10 : uint256 taghash;
89 : 10 : CSHA256().Write((const unsigned char*)tag.data(), tag.size()).Finalize(taghash.begin());
90 : 10 : writer << taghash << taghash;
91 : 10 : return writer;
92 : : }
|