/Users/eugenesiegel/btc/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 | 56.3M | { | 
| 15 |  |     // The following is MurmurHash3 (x86_32), see https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp | 
| 16 | 56.3M |     uint32_t h1 = nHashSeed; | 
| 17 | 56.3M |     const uint32_t c1 = 0xcc9e2d51; | 
| 18 | 56.3M |     const uint32_t c2 = 0x1b873593; | 
| 19 |  |  | 
| 20 | 56.3M |     const int nblocks = vDataToHash.size() / 4; | 
| 21 |  |  | 
| 22 |  |     //---------- | 
| 23 |  |     // body | 
| 24 | 56.3M |     const uint8_t* blocks = vDataToHash.data(); | 
| 25 |  |  | 
| 26 | 489M |     for (int i = 0; i < nblocks; ++i432M) { | 
| 27 | 432M |         uint32_t k1 = ReadLE32(blocks + i*4); | 
| 28 |  |  | 
| 29 | 432M |         k1 *= c1; | 
| 30 | 432M |         k1 = std::rotl(k1, 15); | 
| 31 | 432M |         k1 *= c2; | 
| 32 |  |  | 
| 33 | 432M |         h1 ^= k1; | 
| 34 | 432M |         h1 = std::rotl(h1, 13); | 
| 35 | 432M |         h1 = h1 * 5 + 0xe6546b64; | 
| 36 | 432M |     } | 
| 37 |  |  | 
| 38 |  |     //---------- | 
| 39 |  |     // tail | 
| 40 | 56.3M |     const uint8_t* tail = vDataToHash.data() + nblocks * 4; | 
| 41 |  |  | 
| 42 | 56.3M |     uint32_t k1 = 0; | 
| 43 |  |  | 
| 44 | 56.3M |     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 | 56.3M |     } | 
| 58 |  |  | 
| 59 |  |     //---------- | 
| 60 |  |     // finalization | 
| 61 | 56.3M |     h1 ^= vDataToHash.size(); | 
| 62 | 56.3M |     h1 ^= h1 >> 16; | 
| 63 | 56.3M |     h1 *= 0x85ebca6b; | 
| 64 | 56.3M |     h1 ^= h1 >> 13; | 
| 65 | 56.3M |     h1 *= 0xc2b2ae35; | 
| 66 | 56.3M |     h1 ^= h1 >> 16; | 
| 67 |  |  | 
| 68 | 56.3M |     return h1; | 
| 69 | 56.3M | } | 
| 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 | 1.51M | { | 
| 80 | 1.51M |     uint256 result; | 
| 81 | 1.51M |     CSHA256().Write(input.begin(), 32).Finalize(result.begin()); | 
| 82 | 1.51M |     return result; | 
| 83 | 1.51M | } | 
| 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 | } |