LCOV - code coverage report
Current view: top level - src/crypto - siphash.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 125 125 100.0 %
Date: 2026-06-25 07:23:43 Functions: 7 7 100.0 %

          Line data    Source code
       1             : // Copyright (c) 2016-2020 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 <crypto/siphash.h>
       6             : 
       7             : #include <bit>
       8             : 
       9             : #define SIPROUND do { \
      10             :     v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \
      11             :     v0 = std::rotl(v0, 32); \
      12             :     v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \
      13             :     v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \
      14             :     v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \
      15             :     v2 = std::rotl(v2, 32); \
      16             : } while (0)
      17             : 
      18     4008329 : CSipHasher::CSipHasher(uint64_t k0, uint64_t k1)
      19     2004164 : {
      20     2004165 :     v[0] = 0x736f6d6570736575ULL ^ k0;
      21     2004165 :     v[1] = 0x646f72616e646f6dULL ^ k1;
      22     2004165 :     v[2] = 0x6c7967656e657261ULL ^ k0;
      23     2004165 :     v[3] = 0x7465646279746573ULL ^ k1;
      24     2004165 :     count = 0;
      25     2004165 :     tmp = 0;
      26     4008329 : }
      27             : 
      28     1304859 : CSipHasher& CSipHasher::Write(uint64_t data)
      29             : {
      30     1304859 :     uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3];
      31             : 
      32     1304859 :     assert(count % 8 == 0);
      33             : 
      34     1304859 :     v3 ^= data;
      35     1304859 :     SIPROUND;
      36     1304859 :     SIPROUND;
      37     1304859 :     v0 ^= data;
      38             : 
      39     1304859 :     v[0] = v0;
      40     1304859 :     v[1] = v1;
      41     1304859 :     v[2] = v2;
      42     1304859 :     v[3] = v3;
      43             : 
      44     1304859 :     count += 8;
      45     1304859 :     return *this;
      46             : }
      47             : 
      48     1996897 : CSipHasher& CSipHasher::Write(const unsigned char* data, size_t size)
      49             : {
      50     1996897 :     uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3];
      51     1996897 :     uint64_t t = tmp;
      52     1996897 :     uint8_t c = count;
      53             : 
      54    38632305 :     while (size--) {
      55    36635408 :         t |= ((uint64_t)(*(data++))) << (8 * (c % 8));
      56    36635408 :         c++;
      57    36635408 :         if ((c & 7) == 0) {
      58     4083314 :             v3 ^= t;
      59     4083314 :             SIPROUND;
      60     4083314 :             SIPROUND;
      61     4083314 :             v0 ^= t;
      62     4083314 :             t = 0;
      63     4083314 :         }
      64             :     }
      65             : 
      66     1996897 :     v[0] = v0;
      67     1996897 :     v[1] = v1;
      68     1996897 :     v[2] = v2;
      69     1996897 :     v[3] = v3;
      70     1996897 :     count = c;
      71     1996897 :     tmp = t;
      72             : 
      73     1996897 :     return *this;
      74             : }
      75             : 
      76     2005187 : uint64_t CSipHasher::Finalize() const
      77             : {
      78     2005187 :     uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3];
      79             : 
      80     2005187 :     uint64_t t = tmp | (((uint64_t)count) << 56);
      81             : 
      82     2005187 :     v3 ^= t;
      83     2005187 :     SIPROUND;
      84     2005187 :     SIPROUND;
      85     2005187 :     v0 ^= t;
      86     2005187 :     v2 ^= 0xFF;
      87     2005187 :     SIPROUND;
      88     2005187 :     SIPROUND;
      89     2005187 :     SIPROUND;
      90     2005187 :     SIPROUND;
      91     2005187 :     return v0 ^ v1 ^ v2 ^ v3;
      92             : }
      93             : 
      94    67421411 : uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256& val)
      95             : {
      96             :     /* Specialized implementation for efficiency */
      97    67421411 :     uint64_t d = val.GetUint64(0);
      98             : 
      99    67421411 :     uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
     100    67421411 :     uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
     101    67421411 :     uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
     102    67421411 :     uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d;
     103             : 
     104    67421411 :     SIPROUND;
     105    67421411 :     SIPROUND;
     106    67421411 :     v0 ^= d;
     107    67421411 :     d = val.GetUint64(1);
     108    67421411 :     v3 ^= d;
     109    67421411 :     SIPROUND;
     110    67421411 :     SIPROUND;
     111    67421411 :     v0 ^= d;
     112    67421411 :     d = val.GetUint64(2);
     113    67421411 :     v3 ^= d;
     114    67421411 :     SIPROUND;
     115    67421411 :     SIPROUND;
     116    67421411 :     v0 ^= d;
     117    67421411 :     d = val.GetUint64(3);
     118    67421411 :     v3 ^= d;
     119    67421411 :     SIPROUND;
     120    67421411 :     SIPROUND;
     121    67421411 :     v0 ^= d;
     122    67421411 :     v3 ^= (uint64_t{4}) << 59;
     123    67421411 :     SIPROUND;
     124    67421411 :     SIPROUND;
     125    67421411 :     v0 ^= (uint64_t{4}) << 59;
     126    67421411 :     v2 ^= 0xFF;
     127    67421411 :     SIPROUND;
     128    67421411 :     SIPROUND;
     129    67421411 :     SIPROUND;
     130    67421411 :     SIPROUND;
     131    67421411 :     return v0 ^ v1 ^ v2 ^ v3;
     132             : }
     133             : 
     134   186179671 : uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256& val, uint32_t extra)
     135             : {
     136             :     /* Specialized implementation for efficiency */
     137   186179671 :     uint64_t d = val.GetUint64(0);
     138             : 
     139   186179671 :     uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
     140   186179671 :     uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
     141   186179671 :     uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
     142   186179671 :     uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d;
     143             : 
     144   186179671 :     SIPROUND;
     145   186179671 :     SIPROUND;
     146   186179671 :     v0 ^= d;
     147   186179671 :     d = val.GetUint64(1);
     148   186179671 :     v3 ^= d;
     149   186179671 :     SIPROUND;
     150   186179671 :     SIPROUND;
     151   186179671 :     v0 ^= d;
     152   186179671 :     d = val.GetUint64(2);
     153   186179671 :     v3 ^= d;
     154   186179671 :     SIPROUND;
     155   186179671 :     SIPROUND;
     156   186179671 :     v0 ^= d;
     157   186179671 :     d = val.GetUint64(3);
     158   186179671 :     v3 ^= d;
     159   186179671 :     SIPROUND;
     160   186179671 :     SIPROUND;
     161   186179671 :     v0 ^= d;
     162   186179671 :     d = ((uint64_t{36}) << 56) | extra;
     163   186179671 :     v3 ^= d;
     164   186179671 :     SIPROUND;
     165   186179671 :     SIPROUND;
     166   186179671 :     v0 ^= d;
     167   186179671 :     v2 ^= 0xFF;
     168   186179671 :     SIPROUND;
     169   186179671 :     SIPROUND;
     170   186179671 :     SIPROUND;
     171   186179671 :     SIPROUND;
     172   186179671 :     return v0 ^ v1 ^ v2 ^ v3;
     173             : }

Generated by: LCOV version 1.16