Dash Core  0.12.2.1
P2P Digital Currency
hash.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2015 The Bitcoin Core developers
3 // Copyright (c) 2014-2017 The Dash Core developers
4 // Distributed under the MIT software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #ifndef BITCOIN_HASH_H
8 #define BITCOIN_HASH_H
9 
10 #include "crypto/ripemd160.h"
11 #include "crypto/sha256.h"
12 #include "prevector.h"
13 #include "serialize.h"
14 #include "uint256.h"
15 #include "version.h"
16 
17 #include "crypto/sph_blake.h"
18 #include "crypto/sph_bmw.h"
19 #include "crypto/sph_groestl.h"
20 #include "crypto/sph_jh.h"
21 #include "crypto/sph_keccak.h"
22 #include "crypto/sph_skein.h"
23 #include "crypto/sph_luffa.h"
24 #include "crypto/sph_cubehash.h"
25 #include "crypto/sph_shavite.h"
26 #include "crypto/sph_simd.h"
27 #include "crypto/sph_echo.h"
28 
29 #include <vector>
30 
32 
33 #ifdef GLOBALDEFINED
34 #define GLOBAL
35 #else
36 #define GLOBAL extern
37 #endif
38 
39 GLOBAL sph_blake512_context z_blake;
40 GLOBAL sph_bmw512_context z_bmw;
44 GLOBAL sph_skein512_context z_skein;
50 
51 #define fillz() do { \
52  sph_blake512_init(&z_blake); \
53  sph_bmw512_init(&z_bmw); \
54  sph_groestl512_init(&z_groestl); \
55  sph_jh512_init(&z_jh); \
56  sph_keccak512_init(&z_keccak); \
57  sph_skein512_init(&z_skein); \
58  sph_luffa512_init(&z_luffa); \
59  sph_cubehash512_init(&z_cubehash); \
60  sph_shavite512_init(&z_shavite); \
61  sph_simd512_init(&z_simd); \
62  sph_echo512_init(&z_echo); \
63 } while (0)
64 
65 #define ZBLAKE (memcpy(&ctx_blake, &z_blake, sizeof(z_blake)))
66 #define ZBMW (memcpy(&ctx_bmw, &z_bmw, sizeof(z_bmw)))
67 #define ZGROESTL (memcpy(&ctx_groestl, &z_groestl, sizeof(z_groestl)))
68 #define ZJH (memcpy(&ctx_jh, &z_jh, sizeof(z_jh)))
69 #define ZKECCAK (memcpy(&ctx_keccak, &z_keccak, sizeof(z_keccak)))
70 #define ZSKEIN (memcpy(&ctx_skein, &z_skein, sizeof(z_skein)))
71 
72 /* ----------- Bitcoin Hash ------------------------------------------------- */
74 class CHash256 {
75 private:
77 public:
78  static const size_t OUTPUT_SIZE = CSHA256::OUTPUT_SIZE;
79 
80  void Finalize(unsigned char hash[OUTPUT_SIZE]) {
81  unsigned char buf[sha.OUTPUT_SIZE];
82  sha.Finalize(buf);
83  sha.Reset().Write(buf, sha.OUTPUT_SIZE).Finalize(hash);
84  }
85 
86  CHash256& Write(const unsigned char *data, size_t len) {
87  sha.Write(data, len);
88  return *this;
89  }
90 
92  sha.Reset();
93  return *this;
94  }
95 };
96 
98 class CHash160 {
99 private:
101 public:
102  static const size_t OUTPUT_SIZE = CRIPEMD160::OUTPUT_SIZE;
103 
104  void Finalize(unsigned char hash[OUTPUT_SIZE]) {
105  unsigned char buf[sha.OUTPUT_SIZE];
106  sha.Finalize(buf);
107  CRIPEMD160().Write(buf, sha.OUTPUT_SIZE).Finalize(hash);
108  }
109 
110  CHash160& Write(const unsigned char *data, size_t len) {
111  sha.Write(data, len);
112  return *this;
113  }
114 
116  sha.Reset();
117  return *this;
118  }
119 };
120 
122 template<typename T1>
123 inline uint256 Hash(const T1 pbegin, const T1 pend)
124 {
125  static const unsigned char pblank[1] = {};
126  uint256 result;
127  CHash256().Write(pbegin == pend ? pblank : (const unsigned char*)&pbegin[0], (pend - pbegin) * sizeof(pbegin[0]))
128  .Finalize((unsigned char*)&result);
129  return result;
130 }
131 
133 template<typename T1, typename T2>
134 inline uint256 Hash(const T1 p1begin, const T1 p1end,
135  const T2 p2begin, const T2 p2end) {
136  static const unsigned char pblank[1] = {};
137  uint256 result;
138  CHash256().Write(p1begin == p1end ? pblank : (const unsigned char*)&p1begin[0], (p1end - p1begin) * sizeof(p1begin[0]))
139  .Write(p2begin == p2end ? pblank : (const unsigned char*)&p2begin[0], (p2end - p2begin) * sizeof(p2begin[0]))
140  .Finalize((unsigned char*)&result);
141  return result;
142 }
143 
145 template<typename T1, typename T2, typename T3>
146 inline uint256 Hash(const T1 p1begin, const T1 p1end,
147  const T2 p2begin, const T2 p2end,
148  const T3 p3begin, const T3 p3end) {
149  static const unsigned char pblank[1] = {};
150  uint256 result;
151  CHash256().Write(p1begin == p1end ? pblank : (const unsigned char*)&p1begin[0], (p1end - p1begin) * sizeof(p1begin[0]))
152  .Write(p2begin == p2end ? pblank : (const unsigned char*)&p2begin[0], (p2end - p2begin) * sizeof(p2begin[0]))
153  .Write(p3begin == p3end ? pblank : (const unsigned char*)&p3begin[0], (p3end - p3begin) * sizeof(p3begin[0]))
154  .Finalize((unsigned char*)&result);
155  return result;
156 }
157 
159 template<typename T1, typename T2, typename T3, typename T4>
160 inline uint256 Hash(const T1 p1begin, const T1 p1end,
161  const T2 p2begin, const T2 p2end,
162  const T3 p3begin, const T3 p3end,
163  const T4 p4begin, const T4 p4end) {
164  static const unsigned char pblank[1] = {};
165  uint256 result;
166  CHash256().Write(p1begin == p1end ? pblank : (const unsigned char*)&p1begin[0], (p1end - p1begin) * sizeof(p1begin[0]))
167  .Write(p2begin == p2end ? pblank : (const unsigned char*)&p2begin[0], (p2end - p2begin) * sizeof(p2begin[0]))
168  .Write(p3begin == p3end ? pblank : (const unsigned char*)&p3begin[0], (p3end - p3begin) * sizeof(p3begin[0]))
169  .Write(p4begin == p4end ? pblank : (const unsigned char*)&p4begin[0], (p4end - p4begin) * sizeof(p4begin[0]))
170  .Finalize((unsigned char*)&result);
171  return result;
172 }
173 
175 template<typename T1, typename T2, typename T3, typename T4, typename T5>
176 inline uint256 Hash(const T1 p1begin, const T1 p1end,
177  const T2 p2begin, const T2 p2end,
178  const T3 p3begin, const T3 p3end,
179  const T4 p4begin, const T4 p4end,
180  const T5 p5begin, const T5 p5end) {
181  static const unsigned char pblank[1] = {};
182  uint256 result;
183  CHash256().Write(p1begin == p1end ? pblank : (const unsigned char*)&p1begin[0], (p1end - p1begin) * sizeof(p1begin[0]))
184  .Write(p2begin == p2end ? pblank : (const unsigned char*)&p2begin[0], (p2end - p2begin) * sizeof(p2begin[0]))
185  .Write(p3begin == p3end ? pblank : (const unsigned char*)&p3begin[0], (p3end - p3begin) * sizeof(p3begin[0]))
186  .Write(p4begin == p4end ? pblank : (const unsigned char*)&p4begin[0], (p4end - p4begin) * sizeof(p4begin[0]))
187  .Write(p5begin == p5end ? pblank : (const unsigned char*)&p5begin[0], (p5end - p5begin) * sizeof(p5begin[0]))
188  .Finalize((unsigned char*)&result);
189  return result;
190 }
191 
193 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
194 inline uint256 Hash(const T1 p1begin, const T1 p1end,
195  const T2 p2begin, const T2 p2end,
196  const T3 p3begin, const T3 p3end,
197  const T4 p4begin, const T4 p4end,
198  const T5 p5begin, const T5 p5end,
199  const T6 p6begin, const T6 p6end) {
200  static const unsigned char pblank[1] = {};
201  uint256 result;
202  CHash256().Write(p1begin == p1end ? pblank : (const unsigned char*)&p1begin[0], (p1end - p1begin) * sizeof(p1begin[0]))
203  .Write(p2begin == p2end ? pblank : (const unsigned char*)&p2begin[0], (p2end - p2begin) * sizeof(p2begin[0]))
204  .Write(p3begin == p3end ? pblank : (const unsigned char*)&p3begin[0], (p3end - p3begin) * sizeof(p3begin[0]))
205  .Write(p4begin == p4end ? pblank : (const unsigned char*)&p4begin[0], (p4end - p4begin) * sizeof(p4begin[0]))
206  .Write(p5begin == p5end ? pblank : (const unsigned char*)&p5begin[0], (p5end - p5begin) * sizeof(p5begin[0]))
207  .Write(p6begin == p6end ? pblank : (const unsigned char*)&p6begin[0], (p6end - p6begin) * sizeof(p6begin[0]))
208  .Finalize((unsigned char*)&result);
209  return result;
210 }
211 
213 template<typename T1>
214 inline uint160 Hash160(const T1 pbegin, const T1 pend)
215 {
216  static unsigned char pblank[1] = {};
217  uint160 result;
218  CHash160().Write(pbegin == pend ? pblank : (const unsigned char*)&pbegin[0], (pend - pbegin) * sizeof(pbegin[0]))
219  .Finalize((unsigned char*)&result);
220  return result;
221 }
222 
224 inline uint160 Hash160(const std::vector<unsigned char>& vch)
225 {
226  return Hash160(vch.begin(), vch.end());
227 }
228 
230 template<unsigned int N>
232 {
233  return Hash160(vch.begin(), vch.end());
234 }
235 
238 {
239 private:
241 
242 public:
243  int nType;
244  int nVersion;
245 
246  CHashWriter(int nTypeIn, int nVersionIn) : nType(nTypeIn), nVersion(nVersionIn) {}
247 
248  CHashWriter& write(const char *pch, size_t size) {
249  ctx.Write((const unsigned char*)pch, size);
250  return (*this);
251  }
252 
253  // invalidates the object
255  uint256 result;
256  ctx.Finalize((unsigned char*)&result);
257  return result;
258  }
259 
260  template<typename T>
261  CHashWriter& operator<<(const T& obj) {
262  // Serialize to this stream
263  ::Serialize(*this, obj, nType, nVersion);
264  return (*this);
265  }
266 };
267 
269 template<typename T>
270 uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
271 {
272  CHashWriter ss(nType, nVersion);
273  ss << obj;
274  return ss.GetHash();
275 }
276 
277 unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char>& vDataToHash);
278 
279 void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]);
280 
281 /* ----------- Dash Hash ------------------------------------------------ */
282 template<typename T1>
283 inline uint256 HashX11(const T1 pbegin, const T1 pend)
284 
285 {
286  sph_blake512_context ctx_blake;
287  sph_bmw512_context ctx_bmw;
288  sph_groestl512_context ctx_groestl;
289  sph_jh512_context ctx_jh;
290  sph_keccak512_context ctx_keccak;
291  sph_skein512_context ctx_skein;
292  sph_luffa512_context ctx_luffa;
293  sph_cubehash512_context ctx_cubehash;
294  sph_shavite512_context ctx_shavite;
295  sph_simd512_context ctx_simd;
296  sph_echo512_context ctx_echo;
297  static unsigned char pblank[1];
298 
299  uint512 hash[11];
300 
301  sph_blake512_init(&ctx_blake);
302  sph_blake512 (&ctx_blake, (pbegin == pend ? pblank : static_cast<const void*>(&pbegin[0])), (pend - pbegin) * sizeof(pbegin[0]));
303  sph_blake512_close(&ctx_blake, static_cast<void*>(&hash[0]));
304 
305  sph_bmw512_init(&ctx_bmw);
306  sph_bmw512 (&ctx_bmw, static_cast<const void*>(&hash[0]), 64);
307  sph_bmw512_close(&ctx_bmw, static_cast<void*>(&hash[1]));
308 
309  sph_groestl512_init(&ctx_groestl);
310  sph_groestl512 (&ctx_groestl, static_cast<const void*>(&hash[1]), 64);
311  sph_groestl512_close(&ctx_groestl, static_cast<void*>(&hash[2]));
312 
313  sph_skein512_init(&ctx_skein);
314  sph_skein512 (&ctx_skein, static_cast<const void*>(&hash[2]), 64);
315  sph_skein512_close(&ctx_skein, static_cast<void*>(&hash[3]));
316 
317  sph_jh512_init(&ctx_jh);
318  sph_jh512 (&ctx_jh, static_cast<const void*>(&hash[3]), 64);
319  sph_jh512_close(&ctx_jh, static_cast<void*>(&hash[4]));
320 
321  sph_keccak512_init(&ctx_keccak);
322  sph_keccak512 (&ctx_keccak, static_cast<const void*>(&hash[4]), 64);
323  sph_keccak512_close(&ctx_keccak, static_cast<void*>(&hash[5]));
324 
325  sph_luffa512_init(&ctx_luffa);
326  sph_luffa512 (&ctx_luffa, static_cast<void*>(&hash[5]), 64);
327  sph_luffa512_close(&ctx_luffa, static_cast<void*>(&hash[6]));
328 
329  sph_cubehash512_init(&ctx_cubehash);
330  sph_cubehash512 (&ctx_cubehash, static_cast<const void*>(&hash[6]), 64);
331  sph_cubehash512_close(&ctx_cubehash, static_cast<void*>(&hash[7]));
332 
333  sph_shavite512_init(&ctx_shavite);
334  sph_shavite512(&ctx_shavite, static_cast<const void*>(&hash[7]), 64);
335  sph_shavite512_close(&ctx_shavite, static_cast<void*>(&hash[8]));
336 
337  sph_simd512_init(&ctx_simd);
338  sph_simd512 (&ctx_simd, static_cast<const void*>(&hash[8]), 64);
339  sph_simd512_close(&ctx_simd, static_cast<void*>(&hash[9]));
340 
341  sph_echo512_init(&ctx_echo);
342  sph_echo512 (&ctx_echo, static_cast<const void*>(&hash[9]), 64);
343  sph_echo512_close(&ctx_echo, static_cast<void*>(&hash[10]));
344 
345  return hash[10].trim256();
346 }
347 
348 #endif // BITCOIN_HASH_H
CHash256 & Reset()
Definition: hash.h:91
GLOBAL sph_blake512_context z_blake
Definition: hash.h:39
uint256 trim256() const
Definition: uint256.h:164
static const size_t OUTPUT_SIZE
Definition: hash.h:78
void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64])
Definition: hash.cpp:75
unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector< unsigned char > &vDataToHash)
Definition: hash.cpp:16
CHashWriter(int nTypeIn, int nVersionIn)
Definition: hash.h:246
GLOBAL sph_shavite512_context z_shavite
Definition: hash.h:47
void sph_echo512(void *cc, const void *data, size_t len)
Definition: echo.c:1011
#define GLOBAL
Definition: hash.h:36
void sph_simd512(void *cc, const void *data, size_t len)
Definition: simd.c:1780
int nVersion
Definition: hash.h:244
CSHA256 sha
Definition: hash.h:76
uint256 ChainCode
Definition: hash.h:31
void sph_simd512_close(void *cc, void *dst)
Definition: simd.c:1786
void Serialize(Stream &s, char a, int, int=0)
Definition: serialize.h:214
GLOBAL sph_cubehash512_context z_cubehash
Definition: hash.h:46
static const size_t OUTPUT_SIZE
Definition: ripemd160.h:20
Definition: hash.h:98
CHash160 & Reset()
Definition: hash.h:115
void sph_echo512_init(void *cc)
Definition: echo.c:1004
void sph_jh512_init(void *cc)
Definition: jh.c:1088
uint160 Hash160(const T1 pbegin, const T1 pend)
Definition: hash.h:214
GLOBAL sph_keccak512_context z_keccak
Definition: hash.h:43
CRIPEMD160 & Write(const unsigned char *data, size_t len)
Definition: ripemd160.cpp:247
void sph_luffa512_close(void *cc, void *dst)
Definition: luffa.c:1411
void Finalize(unsigned char hash[OUTPUT_SIZE])
Definition: sha256.cpp:167
void sph_luffa512(void *cc, const void *data, size_t len)
Definition: luffa.c:1404
void sph_shavite512_init(void *cc)
Definition: shavite.c:1734
void sph_cubehash512(void *cc, const void *data, size_t len)
Definition: cubehash.c:702
uint256 GetHash()
Definition: hash.h:254
uint256 SerializeHash(const T &obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
Definition: hash.h:270
iterator end()
Definition: prevector.h:272
void sph_jh512_close(void *cc, void *dst)
Definition: jh.c:1102
void sph_cubehash512_close(void *cc, void *dst)
Definition: cubehash.c:709
CHash256 ctx
Definition: hash.h:240
GLOBAL sph_echo512_context z_echo
Definition: hash.h:49
static const size_t OUTPUT_SIZE
Definition: hash.h:102
GLOBAL sph_luffa512_context z_luffa
Definition: hash.h:45
uint256 Hash(const T1 pbegin, const T1 pend)
Definition: hash.h:123
void Finalize(unsigned char hash[OUTPUT_SIZE])
Definition: ripemd160.cpp:273
void sph_shavite512(void *cc, const void *data, size_t len)
Definition: shavite.c:1741
int nType
Definition: hash.h:243
void sph_echo512_close(void *cc, void *dst)
Definition: echo.c:1018
GLOBAL sph_simd512_context z_simd
Definition: hash.h:48
void sph_keccak512_init(void *cc)
Definition: keccak.c:1795
CSHA256 & Write(const unsigned char *data, size_t len)
Definition: sha256.cpp:141
CHash160 & Write(const unsigned char *data, size_t len)
Definition: hash.h:110
static const int PROTOCOL_VERSION
Definition: version.h:13
Definition: hash.h:74
static const size_t OUTPUT_SIZE
Definition: sha256.h:20
void sph_keccak512(void *cc, const void *data, size_t len)
Definition: keccak.c:1802
GLOBAL sph_groestl512_context z_groestl
Definition: hash.h:41
GLOBAL sph_bmw512_context z_bmw
Definition: hash.h:40
void Finalize(unsigned char hash[OUTPUT_SIZE])
Definition: hash.h:80
void sph_shavite512_close(void *cc, void *dst)
Definition: shavite.c:1748
CSHA256 sha
Definition: hash.h:100
void Finalize(unsigned char hash[OUTPUT_SIZE])
Definition: hash.h:104
iterator begin()
Definition: prevector.h:270
CHashWriter & operator<<(const T &obj)
Definition: hash.h:261
GLOBAL sph_jh512_context z_jh
Definition: hash.h:42
void sph_groestl512(void *cc, const void *data, size_t len)
Definition: groestl.c:3102
void sph_keccak512_close(void *cc, void *dst)
Definition: keccak.c:1809
void sph_groestl512_init(void *cc)
Definition: groestl.c:3095
void sph_simd512_init(void *cc)
Definition: simd.c:1774
void sph_jh512(void *cc, const void *data, size_t len)
Definition: jh.c:1095
void sph_groestl512_close(void *cc, void *dst)
Definition: groestl.c:3109
Definition: sha256.h:12
CHashWriter & write(const char *pch, size_t size)
Definition: hash.h:248
void sph_cubehash512_init(void *cc)
Definition: cubehash.c:695
uint256 HashX11(const T1 pbegin, const T1 pend)
Definition: hash.h:283
CSHA256 & Reset()
Definition: sha256.cpp:184
CHash256 & Write(const unsigned char *data, size_t len)
Definition: hash.h:86
result
Definition: rpcuser.py:37
GLOBAL sph_skein512_context z_skein
Definition: hash.h:44
void sph_luffa512_init(void *cc)
Definition: luffa.c:1393