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