/root/bitcoin/src/hash.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) 2013-present 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 | | unsigned int MurmurHash3(unsigned int nHashSeed, std::span<const unsigned char> vDataToHash) |
14 | 0 | { |
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 | 0 | } |
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 | 0 | } |
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 | 0 | } |
70 | | |
71 | | void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]) |
72 | 0 | { |
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 | | uint256 SHA256Uint256(const uint256& input) |
79 | 0 | { |
80 | 0 | uint256 result; |
81 | 0 | CSHA256().Write(input.begin(), 32).Finalize(result.begin()); |
82 | 0 | return result; |
83 | 0 | } |
84 | | |
85 | | HashWriter TaggedHash(const std::string& tag) |
86 | 0 | { |
87 | 0 | HashWriter writer{}; |
88 | 0 | uint256 taghash; |
89 | 0 | CSHA256().Write((const unsigned char*)tag.data(), tag.size()).Finalize(taghash.begin()); |
90 | 0 | writer << taghash << taghash; |
91 | 0 | return writer; |
92 | 0 | } |