Changeset View
Changeset View
Standalone View
Standalone View
src/hash.cpp
- This file was copied to src/crypto/siphash.cpp.
Show First 20 Lines • Show All 80 Lines • ▼ Show 20 Lines | void BIP32Hash(const ChainCode &chainCode, uint32_t nChild, uint8_t header, | ||||
num[2] = (nChild >> 8) & 0xFF; | num[2] = (nChild >> 8) & 0xFF; | ||||
num[3] = (nChild >> 0) & 0xFF; | num[3] = (nChild >> 0) & 0xFF; | ||||
CHMAC_SHA512(chainCode.begin(), chainCode.size()) | CHMAC_SHA512(chainCode.begin(), chainCode.size()) | ||||
.Write(&header, 1) | .Write(&header, 1) | ||||
.Write(data, 32) | .Write(data, 32) | ||||
.Write(num, 4) | .Write(num, 4) | ||||
.Finalize(output); | .Finalize(output); | ||||
} | } | ||||
#define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b)))) | |||||
#define SIPROUND \ | |||||
do { \ | |||||
v0 += v1; \ | |||||
v1 = ROTL(v1, 13); \ | |||||
v1 ^= v0; \ | |||||
v0 = ROTL(v0, 32); \ | |||||
v2 += v3; \ | |||||
v3 = ROTL(v3, 16); \ | |||||
v3 ^= v2; \ | |||||
v0 += v3; \ | |||||
v3 = ROTL(v3, 21); \ | |||||
v3 ^= v0; \ | |||||
v2 += v1; \ | |||||
v1 = ROTL(v1, 17); \ | |||||
v1 ^= v2; \ | |||||
v2 = ROTL(v2, 32); \ | |||||
} while (0) | |||||
CSipHasher::CSipHasher(uint64_t k0, uint64_t k1) { | |||||
v[0] = 0x736f6d6570736575ULL ^ k0; | |||||
v[1] = 0x646f72616e646f6dULL ^ k1; | |||||
v[2] = 0x6c7967656e657261ULL ^ k0; | |||||
v[3] = 0x7465646279746573ULL ^ k1; | |||||
count = 0; | |||||
tmp = 0; | |||||
} | |||||
CSipHasher &CSipHasher::Write(uint64_t data) { | |||||
uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3]; | |||||
assert(count % 8 == 0); | |||||
v3 ^= data; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= data; | |||||
v[0] = v0; | |||||
v[1] = v1; | |||||
v[2] = v2; | |||||
v[3] = v3; | |||||
count += 8; | |||||
return *this; | |||||
} | |||||
CSipHasher &CSipHasher::Write(const uint8_t *data, size_t size) { | |||||
uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3]; | |||||
uint64_t t = tmp; | |||||
int c = count; | |||||
while (size--) { | |||||
t |= uint64_t(*(data++)) << (8 * (c % 8)); | |||||
c++; | |||||
if ((c & 7) == 0) { | |||||
v3 ^= t; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= t; | |||||
t = 0; | |||||
} | |||||
} | |||||
v[0] = v0; | |||||
v[1] = v1; | |||||
v[2] = v2; | |||||
v[3] = v3; | |||||
count = c; | |||||
tmp = t; | |||||
return *this; | |||||
} | |||||
uint64_t CSipHasher::Finalize() const { | |||||
uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3]; | |||||
uint64_t t = tmp | (uint64_t(count) << 56); | |||||
v3 ^= t; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= t; | |||||
v2 ^= 0xFF; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
return v0 ^ v1 ^ v2 ^ v3; | |||||
} | |||||
uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256 &val) { | |||||
/* Specialized implementation for efficiency */ | |||||
uint64_t d = val.GetUint64(0); | |||||
uint64_t v0 = 0x736f6d6570736575ULL ^ k0; | |||||
uint64_t v1 = 0x646f72616e646f6dULL ^ k1; | |||||
uint64_t v2 = 0x6c7967656e657261ULL ^ k0; | |||||
uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= d; | |||||
d = val.GetUint64(1); | |||||
v3 ^= d; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= d; | |||||
d = val.GetUint64(2); | |||||
v3 ^= d; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= d; | |||||
d = val.GetUint64(3); | |||||
v3 ^= d; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= d; | |||||
v3 ^= uint64_t(4) << 59; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= uint64_t(4) << 59; | |||||
v2 ^= 0xFF; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
return v0 ^ v1 ^ v2 ^ v3; | |||||
} | |||||
uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256 &val, | |||||
uint32_t extra) { | |||||
/* Specialized implementation for efficiency */ | |||||
uint64_t d = val.GetUint64(0); | |||||
uint64_t v0 = 0x736f6d6570736575ULL ^ k0; | |||||
uint64_t v1 = 0x646f72616e646f6dULL ^ k1; | |||||
uint64_t v2 = 0x6c7967656e657261ULL ^ k0; | |||||
uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= d; | |||||
d = val.GetUint64(1); | |||||
v3 ^= d; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= d; | |||||
d = val.GetUint64(2); | |||||
v3 ^= d; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= d; | |||||
d = val.GetUint64(3); | |||||
v3 ^= d; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= d; | |||||
d = (uint64_t(36) << 56) | extra; | |||||
v3 ^= d; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
v0 ^= d; | |||||
v2 ^= 0xFF; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
SIPROUND; | |||||
return v0 ^ v1 ^ v2 ^ v3; | |||||
} |