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,