LCOV - code coverage report
Current view: top level - src - hash.cpp (source / functions) Coverage Total Hit
Test: fuzz_coverage.info Lines: 82.4 % 51 42
Test Date: 2024-11-22 13:24:32 Functions: 50.0 % 4 2
Branches: 100.0 % 6 6

             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                 :      707876 : 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                 :      707876 :     uint32_t h1 = nHashSeed;
      17                 :      707876 :     const uint32_t c1 = 0xcc9e2d51;
      18                 :      707876 :     const uint32_t c2 = 0x1b873593;
      19                 :             : 
      20                 :      707876 :     const int nblocks = vDataToHash.size() / 4;
      21                 :             : 
      22                 :             :     //----------
      23                 :             :     // body
      24                 :      707876 :     const uint8_t* blocks = vDataToHash.data();
      25                 :             : 
      26         [ +  + ]:    15419722 :     for (int i = 0; i < nblocks; ++i) {
      27                 :    14711846 :         uint32_t k1 = ReadLE32(blocks + i*4);
      28                 :             : 
      29                 :    14711846 :         k1 *= c1;
      30                 :    14711846 :         k1 = std::rotl(k1, 15);
      31                 :    14711846 :         k1 *= c2;
      32                 :             : 
      33                 :    14711846 :         h1 ^= k1;
      34                 :    14711846 :         h1 = std::rotl(h1, 13);
      35                 :    14711846 :         h1 = h1 * 5 + 0xe6546b64;
      36                 :             :     }
      37                 :             : 
      38                 :             :     //----------
      39                 :             :     // tail
      40                 :      707876 :     const uint8_t* tail = vDataToHash.data() + nblocks * 4;
      41                 :             : 
      42                 :      707876 :     uint32_t k1 = 0;
      43                 :             : 
      44   [ +  +  +  + ]:      707876 :     switch (vDataToHash.size() & 3) {
      45                 :       42766 :         case 3:
      46                 :       42766 :             k1 ^= tail[2] << 16;
      47                 :       93073 :             [[fallthrough]];
      48                 :       93073 :         case 2:
      49                 :       93073 :             k1 ^= tail[1] << 8;
      50                 :      399633 :             [[fallthrough]];
      51                 :      399633 :         case 1:
      52                 :      399633 :             k1 ^= tail[0];
      53                 :      399633 :             k1 *= c1;
      54                 :      399633 :             k1 = std::rotl(k1, 15);
      55                 :      399633 :             k1 *= c2;
      56                 :      399633 :             h1 ^= k1;
      57                 :             :     }
      58                 :             : 
      59                 :             :     //----------
      60                 :             :     // finalization
      61                 :      707876 :     h1 ^= vDataToHash.size();
      62                 :      707876 :     h1 ^= h1 >> 16;
      63                 :      707876 :     h1 *= 0x85ebca6b;
      64                 :      707876 :     h1 ^= h1 >> 13;
      65                 :      707876 :     h1 *= 0xc2b2ae35;
      66                 :      707876 :     h1 ^= h1 >> 16;
      67                 :             : 
      68                 :      707876 :     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                 :             : }
        

Generated by: LCOV version 2.0-1