@@ -81,3 +81,97 @@ void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char he
8181 num[3 ] = (nChild >> 0 ) & 0xFF ;
8282 CHMAC_SHA512 (chainCode.begin (), chainCode.size ()).Write (&header, 1 ).Write (data, 32 ).Write (num, 4 ).Finalize (output);
8383}
84+
85+ #define ROTL (x, b ) (uint64_t )(((x) << (b)) | ((x) >> (64 - (b))))
86+
87+ #define SIPROUND do { \
88+ v0 += v1; v1 = ROTL (v1, 13 ); v1 ^= v0; \
89+ v0 = ROTL (v0, 32 ); \
90+ v2 += v3; v3 = ROTL (v3, 16 ); v3 ^= v2; \
91+ v0 += v3; v3 = ROTL (v3, 21 ); v3 ^= v0; \
92+ v2 += v1; v1 = ROTL (v1, 17 ); v1 ^= v2; \
93+ v2 = ROTL (v2, 32 ); \
94+ } while (0 )
95+
96+ CSipHasher::CSipHasher (uint64_t k0, uint64_t k1)
97+ {
98+ v[0 ] = 0x736f6d6570736575ULL ^ k0;
99+ v[1 ] = 0x646f72616e646f6dULL ^ k1;
100+ v[2 ] = 0x6c7967656e657261ULL ^ k0;
101+ v[3 ] = 0x7465646279746573ULL ^ k1;
102+ count = 0 ;
103+ }
104+
105+ CSipHasher& CSipHasher::Write (uint64_t data)
106+ {
107+ uint64_t v0 = v[0 ], v1 = v[1 ], v2 = v[2 ], v3 = v[3 ];
108+
109+ v3 ^= data;
110+ SIPROUND;
111+ SIPROUND;
112+ v0 ^= data;
113+
114+ v[0 ] = v0;
115+ v[1 ] = v1;
116+ v[2 ] = v2;
117+ v[3 ] = v3;
118+
119+ count++;
120+ return *this ;
121+ }
122+
123+ uint64_t CSipHasher::Finalize () const
124+ {
125+ uint64_t v0 = v[0 ], v1 = v[1 ], v2 = v[2 ], v3 = v[3 ];
126+
127+ v3 ^= ((uint64_t )count) << 59 ;
128+ SIPROUND;
129+ SIPROUND;
130+ v0 ^= ((uint64_t )count) << 59 ;
131+ v2 ^= 0xFF ;
132+ SIPROUND;
133+ SIPROUND;
134+ SIPROUND;
135+ SIPROUND;
136+ return v0 ^ v1 ^ v2 ^ v3;
137+ }
138+
139+ uint64_t SipHashUint256 (uint64_t k0, uint64_t k1, const uint256& val)
140+ {
141+ /* Specialized implementation for efficiency */
142+ uint64_t d = val.GetUint64 (0 );
143+
144+ uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
145+ uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
146+ uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
147+ uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d;
148+
149+ SIPROUND;
150+ SIPROUND;
151+ v0 ^= d;
152+ d = val.GetUint64 (1 );
153+ v3 ^= d;
154+ SIPROUND;
155+ SIPROUND;
156+ v0 ^= d;
157+ d = val.GetUint64 (2 );
158+ v3 ^= d;
159+ SIPROUND;
160+ SIPROUND;
161+ v0 ^= d;
162+ d = val.GetUint64 (3 );
163+ v3 ^= d;
164+ SIPROUND;
165+ SIPROUND;
166+ v0 ^= d;
167+ v3 ^= ((uint64_t )4 ) << 59 ;
168+ SIPROUND;
169+ SIPROUND;
170+ v0 ^= ((uint64_t )4 ) << 59 ;
171+ v2 ^= 0xFF ;
172+ SIPROUND;
173+ SIPROUND;
174+ SIPROUND;
175+ SIPROUND;
176+ return v0 ^ v1 ^ v2 ^ v3;
177+ }
0 commit comments