hash.cpp raw

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