10 #define BITCOIN_HASH_H
27 #include <openssl/sha.h>
76 sph_blake512_init(&z_blake); \
77 sph_bmw512_init(&z_bmw); \
78 sph_groestl512_init(&z_groestl); \
79 sph_jh512_init(&z_jh); \
80 sph_keccak512_init(&z_keccak); \
81 sph_skein512_init(&z_skein); \
84 #define ZBLAKE (memcpy(&ctx_blake, &z_blake, sizeof(z_blake)))
85 #define ZBMW (memcpy(&ctx_bmw, &z_bmw, sizeof(z_bmw)))
86 #define ZGROESTL (memcpy(&ctx_groestl, &z_groestl, sizeof(z_groestl)))
87 #define ZJH (memcpy(&ctx_jh, &z_jh, sizeof(z_jh)))
88 #define ZKECCAK (memcpy(&ctx_keccak, &z_keccak, sizeof(z_keccak)))
89 #define ZSKEIN (memcpy(&ctx_skein, &z_skein, sizeof(z_skein)))
122 inline std::string
Hash(std::string input)
124 unsigned char hash[SHA256_DIGEST_LENGTH];
127 SHA256_Update(&
sha256, input.c_str(), input.size());
128 SHA256_Final(hash, &
sha256);
129 std::stringstream ss;
130 for (
int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
131 ss << std::hex << std::setw(2) << std::setfill(
'0') << (int)hash[i];
137 inline void Hash(
void* in,
unsigned int len,
unsigned char* out)
141 SHA256_Update(&
sha256, in, len);
142 SHA256_Final(out, &
sha256);
146 template <
typename T1>
149 static const unsigned char pblank[1] = {};
151 CHash256().
Write(pbegin == pend ? pblank : (
const unsigned char*)&pbegin[0], (pend - pbegin) *
sizeof(pbegin[0])).
Finalize((
unsigned char*)&result);
156 template <
typename T1,
typename T2>
157 inline uint256 Hash(
const T1 p1begin,
const T1 p1end,
const T2 p2begin,
const T2 p2end)
159 static const unsigned char pblank[1] = {};
161 CHash256().
Write(p1begin == p1end ? pblank : (
const unsigned char*)&p1begin[0], (p1end - p1begin) *
sizeof(p1begin[0])).
Write(p2begin == p2end ? pblank : (
const unsigned char*)&p2begin[0], (p2end - p2begin) *
sizeof(p2begin[0])).
Finalize((
unsigned char*)&result);
166 template <
typename T1,
typename T2,
typename T3>
167 inline uint256 Hash(
const T1 p1begin,
const T1 p1end,
const T2 p2begin,
const T2 p2end,
const T3 p3begin,
const T3 p3end)
169 static const unsigned char pblank[1] = {};
171 CHash256().
Write(p1begin == p1end ? pblank : (
const unsigned char*)&p1begin[0], (p1end - p1begin) *
sizeof(p1begin[0])).
Write(p2begin == p2end ? pblank : (
const unsigned char*)&p2begin[0], (p2end - p2begin) *
sizeof(p2begin[0])).
Write(p3begin == p3end ? pblank : (
const unsigned char*)&p3begin[0], (p3end - p3begin) *
sizeof(p3begin[0])).
Finalize((
unsigned char*)&result);
176 template <
typename T1,
typename T2,
typename T3,
typename T4>
177 inline uint256 Hash(
const T1 p1begin,
const T1 p1end,
const T2 p2begin,
const T2 p2end,
const T3 p3begin,
const T3 p3end,
const T4 p4begin,
const T4 p4end)
179 static const unsigned char pblank[1] = {};
181 CHash256().
Write(p1begin == p1end ? pblank : (
const unsigned char*)&p1begin[0], (p1end - p1begin) *
sizeof(p1begin[0])).
Write(p2begin == p2end ? pblank : (
const unsigned char*)&p2begin[0], (p2end - p2begin) *
sizeof(p2begin[0])).
Write(p3begin == p3end ? pblank : (
const unsigned char*)&p3begin[0], (p3end - p3begin) *
sizeof(p3begin[0])).
Write(p4begin == p4end ? pblank : (
const unsigned char*)&p4begin[0], (p4end - p4begin) *
sizeof(p4begin[0])).
Finalize((
unsigned char*)&result);
186 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
187 inline uint256 Hash(
const T1 p1begin,
const T1 p1end,
const T2 p2begin,
const T2 p2end,
const T3 p3begin,
const T3 p3end,
const T4 p4begin,
const T4 p4end,
const T5 p5begin,
const T5 p5end)
189 static const unsigned char pblank[1] = {};
191 CHash256().
Write(p1begin == p1end ? pblank : (
const unsigned char*)&p1begin[0], (p1end - p1begin) *
sizeof(p1begin[0])).
Write(p2begin == p2end ? pblank : (
const unsigned char*)&p2begin[0], (p2end - p2begin) *
sizeof(p2begin[0])).
Write(p3begin == p3end ? pblank : (
const unsigned char*)&p3begin[0], (p3end - p3begin) *
sizeof(p3begin[0])).
Write(p4begin == p4end ? pblank : (
const unsigned char*)&p4begin[0], (p4end - p4begin) *
sizeof(p4begin[0])).
Write(p5begin == p5end ? pblank : (
const unsigned char*)&p5begin[0], (p5end - p5begin) *
sizeof(p5begin[0])).
Finalize((
unsigned char*)&result);
196 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6>
197 inline uint256 Hash(
const T1 p1begin,
const T1 p1end,
const T2 p2begin,
const T2 p2end,
const T3 p3begin,
const T3 p3end,
const T4 p4begin,
const T4 p4end,
const T5 p5begin,
const T5 p5end,
const T6 p6begin,
const T6 p6end)
199 static const unsigned char pblank[1] = {};
201 CHash256().
Write(p1begin == p1end ? pblank : (
const unsigned char*)&p1begin[0], (p1end - p1begin) *
sizeof(p1begin[0])).
Write(p2begin == p2end ? pblank : (
const unsigned char*)&p2begin[0], (p2end - p2begin) *
sizeof(p2begin[0])).
Write(p3begin == p3end ? pblank : (
const unsigned char*)&p3begin[0], (p3end - p3begin) *
sizeof(p3begin[0])).
Write(p4begin == p4end ? pblank : (
const unsigned char*)&p4begin[0], (p4end - p4begin) *
sizeof(p4begin[0])).
Write(p5begin == p5end ? pblank : (
const unsigned char*)&p5begin[0], (p5end - p5begin) *
sizeof(p5begin[0])).
Write(p6begin == p6end ? pblank : (
const unsigned char*)&p6begin[0], (p6end - p6begin) *
sizeof(p6begin[0])).
Finalize((
unsigned char*)&result);
206 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7>
207 inline uint256 Hash(
const T1 p1begin,
const T1 p1end,
const T2 p2begin,
const T2 p2end,
const T3 p3begin,
const T3 p3end,
const T4 p4begin,
const T4 p4end,
const T5 p5begin,
const T5 p5end,
const T6 p6begin,
const T6 p6end,
const T7 p7begin,
const T7 p7end)
209 static const unsigned char pblank[1] = {};
211 CHash256().
Write(p1begin == p1end ? pblank : (
const unsigned char*)&p1begin[0], (p1end - p1begin) *
sizeof(p1begin[0])).
Write(p2begin == p2end ? pblank : (
const unsigned char*)&p2begin[0], (p2end - p2begin) *
sizeof(p2begin[0])).
Write(p3begin == p3end ? pblank : (
const unsigned char*)&p3begin[0], (p3end - p3begin) *
sizeof(p3begin[0])).
Write(p4begin == p4end ? pblank : (
const unsigned char*)&p4begin[0], (p4end - p4begin) *
sizeof(p4begin[0])).
Write(p5begin == p5end ? pblank : (
const unsigned char*)&p5begin[0], (p5end - p5begin) *
sizeof(p5begin[0])).
Write(p6begin == p6end ? pblank : (
const unsigned char*)&p6begin[0], (p6end - p6begin) *
sizeof(p6begin[0])).
Write(p7begin == p7end ? pblank : (
const unsigned char*)&p7begin[0], (p7end - p7begin) *
sizeof(p7begin[0])).
Finalize((
unsigned char*)&result);
216 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7,
typename T8>
217 inline uint256 Hash(
const T1 p1begin,
const T1 p1end,
const T2 p2begin,
const T2 p2end,
const T3 p3begin,
const T3 p3end,
const T4 p4begin,
const T4 p4end,
const T5 p5begin,
const T5 p5end,
const T6 p6begin,
const T6 p6end,
const T7 p7begin,
const T7 p7end,
const T8 p8begin,
const T8 p8end)
219 static const unsigned char pblank[1] = {};
221 CHash256().
Write(p1begin == p1end ? pblank : (
const unsigned char*)&p1begin[0], (p1end - p1begin) *
sizeof(p1begin[0])).
Write(p2begin == p2end ? pblank : (
const unsigned char*)&p2begin[0], (p2end - p2begin) *
sizeof(p2begin[0])).
Write(p3begin == p3end ? pblank : (
const unsigned char*)&p3begin[0], (p3end - p3begin) *
sizeof(p3begin[0])).
Write(p4begin == p4end ? pblank : (
const unsigned char*)&p4begin[0], (p4end - p4begin) *
sizeof(p4begin[0])).
Write(p5begin == p5end ? pblank : (
const unsigned char*)&p5begin[0], (p5end - p5begin) *
sizeof(p5begin[0])).
Write(p6begin == p6end ? pblank : (
const unsigned char*)&p6begin[0], (p6end - p6begin) *
sizeof(p6begin[0])).
Write(p7begin == p7end ? pblank : (
const unsigned char*)&p7begin[0], (p7end - p7begin) *
sizeof(p7begin[0])).
Write(p8begin == p8end ? pblank : (
const unsigned char*)&p8begin[0], (p8end - p8begin) *
sizeof(p8begin[0])).
Finalize((
unsigned char*)&result);
226 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7,
typename T8,
typename T9>
227 inline uint256 Hash(
const T1 p1begin,
const T1 p1end,
const T2 p2begin,
const T2 p2end,
const T3 p3begin,
const T3 p3end,
const T4 p4begin,
const T4 p4end,
const T5 p5begin,
const T5 p5end,
const T6 p6begin,
const T6 p6end,
const T7 p7begin,
const T7 p7end,
const T8 p8begin,
const T8 p8end,
const T9 p9begin,
const T9 p9end)
229 static const unsigned char pblank[1] = {};
231 CHash256().
Write(p1begin == p1end ? pblank : (
const unsigned char*)&p1begin[0], (p1end - p1begin) *
sizeof(p1begin[0])).
Write(p2begin == p2end ? pblank : (
const unsigned char*)&p2begin[0], (p2end - p2begin) *
sizeof(p2begin[0])).
Write(p3begin == p3end ? pblank : (
const unsigned char*)&p3begin[0], (p3end - p3begin) *
sizeof(p3begin[0])).
Write(p4begin == p4end ? pblank : (
const unsigned char*)&p4begin[0], (p4end - p4begin) *
sizeof(p4begin[0])).
Write(p5begin == p5end ? pblank : (
const unsigned char*)&p5begin[0], (p5end - p5begin) *
sizeof(p5begin[0])).
Write(p6begin == p6end ? pblank : (
const unsigned char*)&p6begin[0], (p6end - p6begin) *
sizeof(p6begin[0])).
Write(p7begin == p7end ? pblank : (
const unsigned char*)&p7begin[0], (p7end - p7begin) *
sizeof(p7begin[0])).
Write(p8begin == p8end ? pblank : (
const unsigned char*)&p8begin[0], (p8end - p8begin) *
sizeof(p8begin[0])).
Write(p9begin == p9end ? pblank : (
const unsigned char*)&p9begin[0], (p9end - p9begin) *
sizeof(p9begin[0])).
Finalize((
unsigned char*)&result);
236 template <
typename T1>
239 static unsigned char pblank[1] = {};
241 CHash160().
Write(pbegin == pend ? pblank : (
const unsigned char*)&pbegin[0], (pend - pbegin) *
sizeof(pbegin[0])).
Finalize((
unsigned char*)&result);
248 return Hash160(vch.begin(), vch.end());
252 template<
unsigned int N>
272 ctx.
Write((
const unsigned char*)pch, size);
284 template <
typename T>
294 template <
typename T>
302 unsigned int MurmurHash3(
unsigned int nHashSeed,
const std::vector<unsigned char>& vDataToHash);
304 void BIP32Hash(
const unsigned char chainCode[32],
unsigned int nChild,
unsigned char header,
const unsigned char data[32],
unsigned char output[64]);
311 template <
typename T1>
315 sph_blake512_context ctx_blake;
316 sph_bmw512_context ctx_bmw;
320 sph_skein512_context ctx_skein;
321 static unsigned char pblank[1];
328 sph_blake512_init(&ctx_blake);
330 sph_blake512(&ctx_blake, (pbegin == pend ? pblank :
static_cast<const void*
>(&pbegin[0])), (pend - pbegin) *
sizeof(pbegin[0]));
331 sph_blake512_close(&ctx_blake,
static_cast<void*
>(&hash[0]));
333 sph_bmw512_init(&ctx_bmw);
335 sph_bmw512(&ctx_bmw,
static_cast<const void*
>(&hash[0]), 64);
336 sph_bmw512_close(&ctx_bmw,
static_cast<void*
>(&hash[1]));
338 if ((hash[1] & mask) != zero) {
341 sph_groestl512(&ctx_groestl,
static_cast<const void*
>(&hash[1]), 64);
344 sph_skein512_init(&ctx_skein);
346 sph_skein512(&ctx_skein,
static_cast<const void*
>(&hash[1]), 64);
347 sph_skein512_close(&ctx_skein,
static_cast<void*
>(&hash[2]));
352 sph_groestl512(&ctx_groestl,
static_cast<const void*
>(&hash[2]), 64);
357 sph_jh512(&ctx_jh,
static_cast<const void*
>(&hash[3]), 64);
360 if ((hash[4] & mask) != zero) {
361 sph_blake512_init(&ctx_blake);
363 sph_blake512(&ctx_blake,
static_cast<const void*
>(&hash[4]), 64);
364 sph_blake512_close(&ctx_blake,
static_cast<void*
>(&hash[5]));
366 sph_bmw512_init(&ctx_bmw);
368 sph_bmw512(&ctx_bmw,
static_cast<const void*
>(&hash[4]), 64);
369 sph_bmw512_close(&ctx_bmw,
static_cast<void*
>(&hash[5]));
374 sph_keccak512(&ctx_keccak,
static_cast<const void*
>(&hash[5]), 64);
377 sph_skein512_init(&ctx_skein);
379 sph_skein512(&ctx_skein,
static_cast<const void*
>(&hash[6]), 64);
380 sph_skein512_close(&ctx_skein,
static_cast<void*
>(&hash[7]));
382 if ((hash[7] & mask) != zero) {
385 sph_keccak512(&ctx_keccak,
static_cast<const void*
>(&hash[7]), 64);
390 sph_jh512(&ctx_jh,
static_cast<const void*
>(&hash[7]), 64);
396 void scrypt_hash(
const char* pass,
unsigned int pLen,
const char* salt,
unsigned int sLen,
char* output,
unsigned int N,
unsigned int r,
unsigned int p,
unsigned int dkLen);
398 #endif // BITCOIN_HASH_H