1 // Copyright (c) 2013-2015 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"
11 inline uint32_t ROTL32(uint32_t x
, int8_t r
)
13 return (x
<< r
) | (x
>> (32 - r
));
16 unsigned int MurmurHash3(unsigned int nHashSeed
, const std::vector
<unsigned char>& vDataToHash
)
18 // The following is MurmurHash3 (x86_32), see http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp
19 uint32_t h1
= nHashSeed
;
20 if (vDataToHash
.size() > 0)
22 const uint32_t c1
= 0xcc9e2d51;
23 const uint32_t c2
= 0x1b873593;
25 const int nblocks
= vDataToHash
.size() / 4;
29 const uint8_t* blocks
= &vDataToHash
[0] + nblocks
* 4;
31 for (int i
= -nblocks
; i
; i
++) {
32 uint32_t k1
= ReadLE32(blocks
+ i
*4);
40 h1
= h1
* 5 + 0xe6546b64;
45 const uint8_t* tail
= (const uint8_t*)(&vDataToHash
[0] + nblocks
* 4);
49 switch (vDataToHash
.size() & 3) {
65 h1
^= vDataToHash
.size();
75 void BIP32Hash(const ChainCode
&chainCode
, unsigned int nChild
, unsigned char header
, const unsigned char data
[32], unsigned char output
[64])
78 num
[0] = (nChild
>> 24) & 0xFF;
79 num
[1] = (nChild
>> 16) & 0xFF;
80 num
[2] = (nChild
>> 8) & 0xFF;
81 num
[3] = (nChild
>> 0) & 0xFF;
82 CHMAC_SHA512(chainCode
.begin(), chainCode
.size()).Write(&header
, 1).Write(data
, 32).Write(num
, 4).Finalize(output
);
85 #define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b))))
87 #define SIPROUND do { \
88 v0 += v1; v1 = ROTL(v1, 13); v1 ^= v0; \
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; \
96 CSipHasher::CSipHasher(uint64_t k0
, uint64_t k1
)
98 v
[0] = 0x736f6d6570736575ULL
^ k0
;
99 v
[1] = 0x646f72616e646f6dULL
^ k1
;
100 v
[2] = 0x6c7967656e657261ULL
^ k0
;
101 v
[3] = 0x7465646279746573ULL
^ k1
;
106 CSipHasher
& CSipHasher::Write(uint64_t data
)
108 uint64_t v0
= v
[0], v1
= v
[1], v2
= v
[2], v3
= v
[3];
110 assert(count
% 8 == 0);
126 CSipHasher
& CSipHasher::Write(const unsigned char* data
, size_t size
)
128 uint64_t v0
= v
[0], v1
= v
[1], v2
= v
[2], v3
= v
[3];
133 t
|= ((uint64_t)(*(data
++))) << (8 * (c
% 8));
154 uint64_t CSipHasher::Finalize() const
156 uint64_t v0
= v
[0], v1
= v
[1], v2
= v
[2], v3
= v
[3];
158 uint64_t t
= tmp
| (((uint64_t)count
) << 56);
169 return v0
^ v1
^ v2
^ v3
;
172 uint64_t SipHashUint256(uint64_t k0
, uint64_t k1
, const uint256
& val
)
174 /* Specialized implementation for efficiency */
175 uint64_t d
= val
.GetUint64(0);
177 uint64_t v0
= 0x736f6d6570736575ULL
^ k0
;
178 uint64_t v1
= 0x646f72616e646f6dULL
^ k1
;
179 uint64_t v2
= 0x6c7967656e657261ULL
^ k0
;
180 uint64_t v3
= 0x7465646279746573ULL
^ k1
^ d
;
185 d
= val
.GetUint64(1);
190 d
= val
.GetUint64(2);
195 d
= val
.GetUint64(3);
200 v3
^= ((uint64_t)4) << 59;
203 v0
^= ((uint64_t)4) << 59;
209 return v0
^ v1
^ v2
^ v3
;