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