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