15 inline uint64_t
Ch(uint64_t x, uint64_t y, uint64_t z) {
16 return z ^ (x & (y ^ z));
18 inline uint64_t
Maj(uint64_t x, uint64_t y, uint64_t z) {
19 return (x & y) | (z & (x | y));
21 inline uint64_t
Sigma0(uint64_t x) {
22 return (x >> 28 | x << 36) ^ (x >> 34 | x << 30) ^ (x >> 39 | x << 25);
24 inline uint64_t
Sigma1(uint64_t x) {
25 return (x >> 14 | x << 50) ^ (x >> 18 | x << 46) ^ (x >> 41 | x << 23);
27 inline uint64_t
sigma0(uint64_t x) {
28 return (x >> 1 | x << 63) ^ (x >> 8 | x << 56) ^ (x >> 7);
30 inline uint64_t
sigma1(uint64_t x) {
31 return (x >> 19 | x << 45) ^ (x >> 61 | x << 3) ^ (x >> 6);
35 inline void Round(uint64_t a, uint64_t b, uint64_t c, uint64_t &d,
36 uint64_t e, uint64_t f, uint64_t g, uint64_t &h,
37 uint64_t k, uint64_t w) {
38 uint64_t t1 = h +
Sigma1(e) +
Ch(e, f, g) + k + w;
45 inline void Initialize(uint64_t *s) {
46 s[0] = 0x6a09e667f3bcc908ull;
47 s[1] = 0xbb67ae8584caa73bull;
48 s[2] = 0x3c6ef372fe94f82bull;
49 s[3] = 0xa54ff53a5f1d36f1ull;
50 s[4] = 0x510e527fade682d1ull;
51 s[5] = 0x9b05688c2b3e6c1full;
52 s[6] = 0x1f83d9abfb41bd6bull;
53 s[7] = 0x5be0cd19137e2179ull;
57 void Transform(uint64_t *s,
const uint8_t *chunk) {
58 uint64_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5],
60 uint64_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13,
63 Round(a, b, c, d, e, f, g, h, 0x428a2f98d728ae22ull,
65 Round(h, a, b, c, d, e, f, g, 0x7137449123ef65cdull,
67 Round(g, h, a, b, c, d, e, f, 0xb5c0fbcfec4d3b2full,
69 Round(f, g, h, a, b, c, d, e, 0xe9b5dba58189dbbcull,
71 Round(e, f, g, h, a, b, c, d, 0x3956c25bf348b538ull,
73 Round(d, e, f, g, h, a, b, c, 0x59f111f1b605d019ull,
75 Round(c, d, e, f, g, h, a, b, 0x923f82a4af194f9bull,
77 Round(b, c, d, e, f, g, h, a, 0xab1c5ed5da6d8118ull,
79 Round(a, b, c, d, e, f, g, h, 0xd807aa98a3030242ull,
81 Round(h, a, b, c, d, e, f, g, 0x12835b0145706fbeull,
83 Round(g, h, a, b, c, d, e, f, 0x243185be4ee4b28cull,
85 Round(f, g, h, a, b, c, d, e, 0x550c7dc3d5ffb4e2ull,
87 Round(e, f, g, h, a, b, c, d, 0x72be5d74f27b896full,
89 Round(d, e, f, g, h, a, b, c, 0x80deb1fe3b1696b1ull,
91 Round(c, d, e, f, g, h, a, b, 0x9bdc06a725c71235ull,
93 Round(b, c, d, e, f, g, h, a, 0xc19bf174cf692694ull,
96 Round(a, b, c, d, e, f, g, h, 0xe49b69c19ef14ad2ull,
98 Round(h, a, b, c, d, e, f, g, 0xefbe4786384f25e3ull,
100 Round(g, h, a, b, c, d, e, f, 0x0fc19dc68b8cd5b5ull,
102 Round(f, g, h, a, b, c, d, e, 0x240ca1cc77ac9c65ull,
104 Round(e, f, g, h, a, b, c, d, 0x2de92c6f592b0275ull,
106 Round(d, e, f, g, h, a, b, c, 0x4a7484aa6ea6e483ull,
108 Round(c, d, e, f, g, h, a, b, 0x5cb0a9dcbd41fbd4ull,
110 Round(b, c, d, e, f, g, h, a, 0x76f988da831153b5ull,
112 Round(a, b, c, d, e, f, g, h, 0x983e5152ee66dfabull,
114 Round(h, a, b, c, d, e, f, g, 0xa831c66d2db43210ull,
116 Round(g, h, a, b, c, d, e, f, 0xb00327c898fb213full,
118 Round(f, g, h, a, b, c, d, e, 0xbf597fc7beef0ee4ull,
120 Round(e, f, g, h, a, b, c, d, 0xc6e00bf33da88fc2ull,
122 Round(d, e, f, g, h, a, b, c, 0xd5a79147930aa725ull,
124 Round(c, d, e, f, g, h, a, b, 0x06ca6351e003826full,
126 Round(b, c, d, e, f, g, h, a, 0x142929670a0e6e70ull,
129 Round(a, b, c, d, e, f, g, h, 0x27b70a8546d22ffcull,
131 Round(h, a, b, c, d, e, f, g, 0x2e1b21385c26c926ull,
133 Round(g, h, a, b, c, d, e, f, 0x4d2c6dfc5ac42aedull,
135 Round(f, g, h, a, b, c, d, e, 0x53380d139d95b3dfull,
137 Round(e, f, g, h, a, b, c, d, 0x650a73548baf63deull,
139 Round(d, e, f, g, h, a, b, c, 0x766a0abb3c77b2a8ull,
141 Round(c, d, e, f, g, h, a, b, 0x81c2c92e47edaee6ull,
143 Round(b, c, d, e, f, g, h, a, 0x92722c851482353bull,
145 Round(a, b, c, d, e, f, g, h, 0xa2bfe8a14cf10364ull,
147 Round(h, a, b, c, d, e, f, g, 0xa81a664bbc423001ull,
149 Round(g, h, a, b, c, d, e, f, 0xc24b8b70d0f89791ull,
151 Round(f, g, h, a, b, c, d, e, 0xc76c51a30654be30ull,
153 Round(e, f, g, h, a, b, c, d, 0xd192e819d6ef5218ull,
155 Round(d, e, f, g, h, a, b, c, 0xd69906245565a910ull,
157 Round(c, d, e, f, g, h, a, b, 0xf40e35855771202aull,
159 Round(b, c, d, e, f, g, h, a, 0x106aa07032bbd1b8ull,
162 Round(a, b, c, d, e, f, g, h, 0x19a4c116b8d2d0c8ull,
164 Round(h, a, b, c, d, e, f, g, 0x1e376c085141ab53ull,
166 Round(g, h, a, b, c, d, e, f, 0x2748774cdf8eeb99ull,
168 Round(f, g, h, a, b, c, d, e, 0x34b0bcb5e19b48a8ull,
170 Round(e, f, g, h, a, b, c, d, 0x391c0cb3c5c95a63ull,
172 Round(d, e, f, g, h, a, b, c, 0x4ed8aa4ae3418acbull,
174 Round(c, d, e, f, g, h, a, b, 0x5b9cca4f7763e373ull,
176 Round(b, c, d, e, f, g, h, a, 0x682e6ff3d6b2b8a3ull,
178 Round(a, b, c, d, e, f, g, h, 0x748f82ee5defb2fcull,
180 Round(h, a, b, c, d, e, f, g, 0x78a5636f43172f60ull,
182 Round(g, h, a, b, c, d, e, f, 0x84c87814a1f0ab72ull,
184 Round(f, g, h, a, b, c, d, e, 0x8cc702081a6439ecull,
186 Round(e, f, g, h, a, b, c, d, 0x90befffa23631e28ull,
188 Round(d, e, f, g, h, a, b, c, 0xa4506cebde82bde9ull,
190 Round(c, d, e, f, g, h, a, b, 0xbef9a3f7b2c67915ull,
192 Round(b, c, d, e, f, g, h, a, 0xc67178f2e372532bull,
195 Round(a, b, c, d, e, f, g, h, 0xca273eceea26619cull,
197 Round(h, a, b, c, d, e, f, g, 0xd186b8c721c0c207ull,
199 Round(g, h, a, b, c, d, e, f, 0xeada7dd6cde0eb1eull,
201 Round(f, g, h, a, b, c, d, e, 0xf57d4f7fee6ed178ull,
203 Round(e, f, g, h, a, b, c, d, 0x06f067aa72176fbaull,
205 Round(d, e, f, g, h, a, b, c, 0x0a637dc5a2c898a6ull,
207 Round(c, d, e, f, g, h, a, b, 0x113f9804bef90daeull,
209 Round(b, c, d, e, f, g, h, a, 0x1b710b35131c471bull,
211 Round(a, b, c, d, e, f, g, h, 0x28db77f523047d84ull,
213 Round(h, a, b, c, d, e, f, g, 0x32caab7b40c72493ull,
215 Round(g, h, a, b, c, d, e, f, 0x3c9ebe0a15c9bebcull,
217 Round(f, g, h, a, b, c, d, e, 0x431d67c49c100d4cull,
219 Round(e, f, g, h, a, b, c, d, 0x4cc5d4becb3e42b6ull,
221 Round(d, e, f, g, h, a, b, c, 0x597f299cfc657e2aull,
223 Round(c, d, e, f, g, h, a, b, 0x5fcb6fab3ad6faecull,
225 Round(b, c, d, e, f, g, h, a, 0x6c44198c4a475817ull,
245 sha512::Initialize(
s);
249 const uint8_t *end = data + len;
250 size_t bufsize =
bytes % 128;
251 if (bufsize && bufsize + len >= 128) {
253 memcpy(
buf + bufsize, data, 128 - bufsize);
254 bytes += 128 - bufsize;
255 data += 128 - bufsize;
259 while (end - data >= 128) {
267 memcpy(
buf + bufsize, data, end - data);
274 static const uint8_t pad[128] = {0x80};
275 uint8_t sizedesc[16] = {0x00};
277 Write(pad, 1 + ((239 - (
bytes % 128)) % 128));
291 sha512::Initialize(
s);
A hasher class for SHA-512.
CSHA512 & Write(const uint8_t *data, size_t len)
void Finalize(uint8_t hash[OUTPUT_SIZE])
static void WriteBE64(uint8_t *ptr, uint64_t x)
static uint64_t ReadBE64(const uint8_t *ptr)
#define Round(a, b, c, d, e, f, g, h, k, w)
void Transform(uint32_t *s, const uint8_t *chunk, size_t blocks)
Internal SHA-512 implementation.