]>
Commit | Line | Data |
---|---|---|
f914f1a7 | 1 | // Copyright (c) 2013-2014 The Bitcoin Core developers |
a8a5e013 | 2 | // Distributed under the MIT software license, see the accompanying |
3 | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | |
4 | ||
7ab026f4 | 5 | #include "hash.h" |
3ca5852d | 6 | #include "crypto/common.h" |
36fa4a78 | 7 | #include "crypto/hmac_sha512.h" |
a5748996 | 8 | #include "pubkey.h" |
7ab026f4 | 9 | |
3ca5852d | 10 | |
20e01b1a | 11 | inline uint32_t ROTL32(uint32_t x, int8_t r) |
7ab026f4 MC |
12 | { |
13 | return (x << r) | (x >> (32 - r)); | |
14 | } | |
15 | ||
16 | unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char>& vDataToHash) | |
17 | { | |
18 | // The following is MurmurHash3 (x86_32), see http://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp | |
19 | uint32_t h1 = nHashSeed; | |
459a2d25 E |
20 | if (vDataToHash.size() > 0) |
21 | { | |
22 | const uint32_t c1 = 0xcc9e2d51; | |
23 | const uint32_t c2 = 0x1b873593; | |
7ab026f4 | 24 | |
459a2d25 | 25 | const int nblocks = vDataToHash.size() / 4; |
7ab026f4 | 26 | |
459a2d25 E |
27 | //---------- |
28 | // body | |
3ca5852d | 29 | const uint8_t* blocks = &vDataToHash[0] + nblocks * 4; |
7ab026f4 | 30 | |
459a2d25 | 31 | for (int i = -nblocks; i; i++) { |
3ca5852d | 32 | uint32_t k1 = ReadLE32(blocks + i*4); |
7ab026f4 | 33 | |
459a2d25 E |
34 | k1 *= c1; |
35 | k1 = ROTL32(k1, 15); | |
36 | k1 *= c2; | |
7ab026f4 | 37 | |
459a2d25 E |
38 | h1 ^= k1; |
39 | h1 = ROTL32(h1, 13); | |
40 | h1 = h1 * 5 + 0xe6546b64; | |
41 | } | |
7ab026f4 | 42 | |
459a2d25 E |
43 | //---------- |
44 | // tail | |
45 | const uint8_t* tail = (const uint8_t*)(&vDataToHash[0] + nblocks * 4); | |
46 | ||
47 | uint32_t k1 = 0; | |
48 | ||
49 | switch (vDataToHash.size() & 3) { | |
50 | case 3: | |
51 | k1 ^= tail[2] << 16; | |
52 | case 2: | |
53 | k1 ^= tail[1] << 8; | |
54 | case 1: | |
55 | k1 ^= tail[0]; | |
56 | k1 *= c1; | |
57 | k1 = ROTL32(k1, 15); | |
58 | k1 *= c2; | |
59 | h1 ^= k1; | |
60 | }; | |
61 | } | |
7ab026f4 MC |
62 | |
63 | //---------- | |
64 | // finalization | |
65 | h1 ^= vDataToHash.size(); | |
66 | h1 ^= h1 >> 16; | |
67 | h1 *= 0x85ebca6b; | |
68 | h1 ^= h1 >> 13; | |
69 | h1 *= 0xc2b2ae35; | |
70 | h1 ^= h1 >> 16; | |
71 | ||
72 | return h1; | |
73 | } | |
78c228c6 | 74 | |
a5748996 | 75 | void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]) |
78c228c6 CF |
76 | { |
77 | unsigned char num[4]; | |
78 | num[0] = (nChild >> 24) & 0xFF; | |
79 | num[1] = (nChild >> 16) & 0xFF; | |
80 | num[2] = (nChild >> 8) & 0xFF; | |
81 | num[3] = (nChild >> 0) & 0xFF; | |
a5748996 | 82 | CHMAC_SHA512(chainCode.begin(), chainCode.size()).Write(&header, 1).Write(data, 32).Write(num, 4).Finalize(output); |
78c228c6 | 83 | } |