1 // Copyright (c) 2013-2016 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.
6 #include <crypto/common.h>
7 #include <crypto/hmac_sha512.h>
10 inline uint32_t ROTL32(uint32_t x
, int8_t r
)
12 return (x
<< r
) | (x
>> (32 - r
));
15 unsigned int MurmurHash3(unsigned int nHashSeed
, const std::vector
<unsigned char>& vDataToHash
)
17 // The following is MurmurHash3 (x86_32), see http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
18 uint32_t h1
= nHashSeed
;
19 const uint32_t c1
= 0xcc9e2d51;
20 const uint32_t c2
= 0x1b873593;
22 const int nblocks
= vDataToHash
.size() / 4;
26 const uint8_t* blocks
= vDataToHash
.data();
28 for (int i
= 0; i
< nblocks
; ++i
) {
29 uint32_t k1
= ReadLE32(blocks
+ i
*4);
37 h1
= h1
* 5 + 0xe6546b64;
42 const uint8_t* tail
= vDataToHash
.data() + nblocks
* 4;
46 switch (vDataToHash
.size() & 3) {
61 h1
^= vDataToHash
.size();
71 void BIP32Hash(const ChainCode
&chainCode
, unsigned int nChild
, unsigned char header
, const unsigned char data
[32], unsigned char output
[64])
74 num
[0] = (nChild
>> 24) & 0xFF;
75 num
[1] = (nChild
>> 16) & 0xFF;
76 num
[2] = (nChild
>> 8) & 0xFF;
77 num
[3] = (nChild
>> 0) & 0xFF;
78 CHMAC_SHA512(chainCode
.begin(), chainCode
.size()).Write(&header
, 1).Write(data
, 32).Write(num
, 4).Finalize(output
);
81 #define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b))))
83 #define SIPROUND do { \
84 v0 += v1; v1 = ROTL(v1, 13); v1 ^= v0; \
86 v2 += v3; v3 = ROTL(v3, 16); v3 ^= v2; \
87 v0 += v3; v3 = ROTL(v3, 21); v3 ^= v0; \
88 v2 += v1; v1 = ROTL(v1, 17); v1 ^= v2; \
92 CSipHasher::CSipHasher(uint64_t k0
, uint64_t k1
)
94 v
[0] = 0x736f6d6570736575ULL
^ k0
;
95 v
[1] = 0x646f72616e646f6dULL
^ k1
;
96 v
[2] = 0x6c7967656e657261ULL
^ k0
;
97 v
[3] = 0x7465646279746573ULL
^ k1
;
102 CSipHasher
& CSipHasher::Write(uint64_t data
)
104 uint64_t v0
= v
[0], v1
= v
[1], v2
= v
[2], v3
= v
[3];
106 assert(count
% 8 == 0);
122 CSipHasher
& CSipHasher::Write(const unsigned char* data
, size_t size
)
124 uint64_t v0
= v
[0], v1
= v
[1], v2
= v
[2], v3
= v
[3];
129 t
|= ((uint64_t)(*(data
++))) << (8 * (c
% 8));
150 uint64_t CSipHasher::Finalize() const
152 uint64_t v0
= v
[0], v1
= v
[1], v2
= v
[2], v3
= v
[3];
154 uint64_t t
= tmp
| (((uint64_t)count
) << 56);
165 return v0
^ v1
^ v2
^ v3
;
168 uint64_t SipHashUint256(uint64_t k0
, uint64_t k1
, const uint256
& val
)
170 /* Specialized implementation for efficiency */
171 uint64_t d
= val
.GetUint64(0);
173 uint64_t v0
= 0x736f6d6570736575ULL
^ k0
;
174 uint64_t v1
= 0x646f72616e646f6dULL
^ k1
;
175 uint64_t v2
= 0x6c7967656e657261ULL
^ k0
;
176 uint64_t v3
= 0x7465646279746573ULL
^ k1
^ d
;
181 d
= val
.GetUint64(1);
186 d
= val
.GetUint64(2);
191 d
= val
.GetUint64(3);
196 v3
^= ((uint64_t)4) << 59;
199 v0
^= ((uint64_t)4) << 59;
205 return v0
^ v1
^ v2
^ v3
;
208 uint64_t SipHashUint256Extra(uint64_t k0
, uint64_t k1
, const uint256
& val
, uint32_t extra
)
210 /* Specialized implementation for efficiency */
211 uint64_t d
= val
.GetUint64(0);
213 uint64_t v0
= 0x736f6d6570736575ULL
^ k0
;
214 uint64_t v1
= 0x646f72616e646f6dULL
^ k1
;
215 uint64_t v2
= 0x6c7967656e657261ULL
^ k0
;
216 uint64_t v3
= 0x7465646279746573ULL
^ k1
^ d
;
221 d
= val
.GetUint64(1);
226 d
= val
.GetUint64(2);
231 d
= val
.GetUint64(3);
236 d
= (((uint64_t)36) << 56) | extra
;
246 return v0
^ v1
^ v2
^ v3
;