LCOV - code coverage report
Current view: top level - src - hash.cpp (source / functions) Hit Total Coverage
Test: fuzz_coverage.info Lines: 33 49 67.3 %
Date: 2023-11-06 23:13:05 Functions: 3 5 60.0 %
Branches: 3 6 50.0 %

           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 <string>
      11                 :            : 
      12                 :          8 : inline uint32_t ROTL32(uint32_t x, int8_t r)
      13                 :            : {
      14                 :          8 :     return (x << r) | (x >> (32 - r));
      15                 :            : }
      16                 :            : 
      17                 :          1 : unsigned int MurmurHash3(unsigned int nHashSeed, Span<const unsigned char> vDataToHash)
      18                 :            : {
      19                 :            :     // The following is MurmurHash3 (x86_32), see https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
      20                 :          1 :     uint32_t h1 = nHashSeed;
      21                 :          1 :     const uint32_t c1 = 0xcc9e2d51;
      22                 :          1 :     const uint32_t c2 = 0x1b873593;
      23                 :            : 
      24                 :          1 :     const int nblocks = vDataToHash.size() / 4;
      25                 :            : 
      26                 :            :     //----------
      27                 :            :     // body
      28                 :          1 :     const uint8_t* blocks = vDataToHash.data();
      29                 :            : 
      30         [ +  + ]:          5 :     for (int i = 0; i < nblocks; ++i) {
      31                 :          4 :         uint32_t k1 = ReadLE32(blocks + i*4);
      32                 :            : 
      33                 :          4 :         k1 *= c1;
      34                 :          4 :         k1 = ROTL32(k1, 15);
      35                 :          4 :         k1 *= c2;
      36                 :            : 
      37                 :          4 :         h1 ^= k1;
      38                 :          4 :         h1 = ROTL32(h1, 13);
      39                 :          4 :         h1 = h1 * 5 + 0xe6546b64;
      40                 :          4 :     }
      41                 :            : 
      42                 :            :     //----------
      43                 :            :     // tail
      44                 :          1 :     const uint8_t* tail = vDataToHash.data() + nblocks * 4;
      45                 :            : 
      46                 :          1 :     uint32_t k1 = 0;
      47                 :            : 
      48   [ +  -  -  - ]:          1 :     switch (vDataToHash.size() & 3) {
      49                 :            :         case 3:
      50                 :          0 :             k1 ^= tail[2] << 16;
      51                 :            :             [[fallthrough]];
      52                 :            :         case 2:
      53                 :          0 :             k1 ^= tail[1] << 8;
      54                 :            :             [[fallthrough]];
      55                 :            :         case 1:
      56                 :          0 :             k1 ^= tail[0];
      57                 :          0 :             k1 *= c1;
      58                 :          0 :             k1 = ROTL32(k1, 15);
      59                 :          0 :             k1 *= c2;
      60                 :          0 :             h1 ^= k1;
      61                 :          0 :     }
      62                 :            : 
      63                 :            :     //----------
      64                 :            :     // finalization
      65                 :          1 :     h1 ^= vDataToHash.size();
      66                 :          1 :     h1 ^= h1 >> 16;
      67                 :          1 :     h1 *= 0x85ebca6b;
      68                 :          1 :     h1 ^= h1 >> 13;
      69                 :          1 :     h1 *= 0xc2b2ae35;
      70                 :          1 :     h1 ^= h1 >> 16;
      71                 :            : 
      72                 :          1 :     return h1;
      73                 :            : }
      74                 :            : 
      75                 :          0 : void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64])
      76                 :            : {
      77                 :            :     unsigned char num[4];
      78                 :          0 :     WriteBE32(num, nChild);
      79                 :          0 :     CHMAC_SHA512(chainCode.begin(), chainCode.size()).Write(&header, 1).Write(data, 32).Write(num, 4).Finalize(output);
      80                 :          0 : }
      81                 :            : 
      82                 :          0 : uint256 SHA256Uint256(const uint256& input)
      83                 :            : {
      84                 :          0 :     uint256 result;
      85                 :          0 :     CSHA256().Write(input.begin(), 32).Finalize(result.begin());
      86                 :          0 :     return result;
      87                 :            : }
      88                 :            : 
      89                 :         10 : HashWriter TaggedHash(const std::string& tag)
      90                 :            : {
      91                 :         10 :     HashWriter writer{};
      92                 :         10 :     uint256 taghash;
      93                 :         10 :     CSHA256().Write((const unsigned char*)tag.data(), tag.size()).Finalize(taghash.begin());
      94                 :         10 :     writer << taghash << taghash;
      95                 :         10 :     return writer;
      96                 :            : }

Generated by: LCOV version 1.14