69uint32_t
inline Ch(uint32_t x, uint32_t y, uint32_t z) {
return z ^ (x & (y ^ z)); }
70uint32_t
inline Maj(uint32_t x, uint32_t y, uint32_t z) {
return (x & y) | (z & (x | y)); }
71uint32_t
inline Sigma0(uint32_t x) {
return (x >> 2 | x << 30) ^ (x >> 13 | x << 19) ^ (x >> 22 | x << 10); }
72uint32_t
inline Sigma1(uint32_t x) {
return (x >> 6 | x << 26) ^ (x >> 11 | x << 21) ^ (x >> 25 | x << 7); }
73uint32_t
inline sigma0(uint32_t x) {
return (x >> 7 | x << 25) ^ (x >> 18 | x << 14) ^ (x >> 3); }
74uint32_t
inline sigma1(uint32_t x) {
return (x >> 17 | x << 15) ^ (x >> 19 | x << 13) ^ (x >> 10); }
77void inline Round(uint32_t a, uint32_t b, uint32_t c, uint32_t& d, uint32_t e, uint32_t f, uint32_t
g, uint32_t& h, uint32_t
k)
86void inline Initialize(uint32_t* s)
99void Transform(uint32_t* s,
const unsigned char* chunk,
size_t blocks)
102 uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5],
g = s[6], h = s[7];
103 uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;
105 Round(a, b, c, d, e, f,
g, h, 0x428a2f98 + (w0 =
ReadBE32(chunk + 0)));
106 Round(h, a, b, c, d, e, f,
g, 0x71374491 + (w1 =
ReadBE32(chunk + 4)));
107 Round(
g, h, a, b, c, d, e, f, 0xb5c0fbcf + (w2 =
ReadBE32(chunk + 8)));
108 Round(f,
g, h, a, b, c, d, e, 0xe9b5dba5 + (w3 =
ReadBE32(chunk + 12)));
109 Round(e, f,
g, h, a, b, c, d, 0x3956c25b + (w4 =
ReadBE32(chunk + 16)));
110 Round(d, e, f,
g, h, a, b, c, 0x59f111f1 + (w5 =
ReadBE32(chunk + 20)));
111 Round(c, d, e, f,
g, h, a, b, 0x923f82a4 + (w6 =
ReadBE32(chunk + 24)));
112 Round(b, c, d, e, f,
g, h, a, 0xab1c5ed5 + (w7 =
ReadBE32(chunk + 28)));
113 Round(a, b, c, d, e, f,
g, h, 0xd807aa98 + (w8 =
ReadBE32(chunk + 32)));
114 Round(h, a, b, c, d, e, f,
g, 0x12835b01 + (w9 =
ReadBE32(chunk + 36)));
115 Round(
g, h, a, b, c, d, e, f, 0x243185be + (w10 =
ReadBE32(chunk + 40)));
116 Round(f,
g, h, a, b, c, d, e, 0x550c7dc3 + (w11 =
ReadBE32(chunk + 44)));
117 Round(e, f,
g, h, a, b, c, d, 0x72be5d74 + (w12 =
ReadBE32(chunk + 48)));
118 Round(d, e, f,
g, h, a, b, c, 0x80deb1fe + (w13 =
ReadBE32(chunk + 52)));
119 Round(c, d, e, f,
g, h, a, b, 0x9bdc06a7 + (w14 =
ReadBE32(chunk + 56)));
120 Round(b, c, d, e, f,
g, h, a, 0xc19bf174 + (w15 =
ReadBE32(chunk + 60)));
185void TransformD64(
unsigned char* out,
const unsigned char* in)
188 uint32_t a = 0x6a09e667ul;
189 uint32_t b = 0xbb67ae85ul;
190 uint32_t c = 0x3c6ef372ul;
191 uint32_t d = 0xa54ff53aul;
192 uint32_t e = 0x510e527ful;
193 uint32_t f = 0x9b05688cul;
194 uint32_t
g = 0x1f83d9abul;
195 uint32_t h = 0x5be0cd19ul;
197 uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;
199 Round(a, b, c, d, e, f,
g, h, 0x428a2f98ul + (w0 =
ReadBE32(in + 0)));
200 Round(h, a, b, c, d, e, f,
g, 0x71374491ul + (w1 =
ReadBE32(in + 4)));
201 Round(
g, h, a, b, c, d, e, f, 0xb5c0fbcful + (w2 =
ReadBE32(in + 8)));
202 Round(f,
g, h, a, b, c, d, e, 0xe9b5dba5ul + (w3 =
ReadBE32(in + 12)));
203 Round(e, f,
g, h, a, b, c, d, 0x3956c25bul + (w4 =
ReadBE32(in + 16)));
204 Round(d, e, f,
g, h, a, b, c, 0x59f111f1ul + (w5 =
ReadBE32(in + 20)));
205 Round(c, d, e, f,
g, h, a, b, 0x923f82a4ul + (w6 =
ReadBE32(in + 24)));
206 Round(b, c, d, e, f,
g, h, a, 0xab1c5ed5ul + (w7 =
ReadBE32(in + 28)));
207 Round(a, b, c, d, e, f,
g, h, 0xd807aa98ul + (w8 =
ReadBE32(in + 32)));
208 Round(h, a, b, c, d, e, f,
g, 0x12835b01ul + (w9 =
ReadBE32(in + 36)));
209 Round(
g, h, a, b, c, d, e, f, 0x243185beul + (w10 =
ReadBE32(in + 40)));
210 Round(f,
g, h, a, b, c, d, e, 0x550c7dc3ul + (w11 =
ReadBE32(in + 44)));
211 Round(e, f,
g, h, a, b, c, d, 0x72be5d74ul + (w12 =
ReadBE32(in + 48)));
212 Round(d, e, f,
g, h, a, b, c, 0x80deb1feul + (w13 =
ReadBE32(in + 52)));
213 Round(c, d, e, f,
g, h, a, b, 0x9bdc06a7ul + (w14 =
ReadBE32(in + 56)));
214 Round(b, c, d, e, f,
g, h, a, 0xc19bf174ul + (w15 =
ReadBE32(in + 60)));
227 Round(e, f,
g, h, a, b, c, d, 0xc6e00bf3ul + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
228 Round(d, e, f,
g, h, a, b, c, 0xd5a79147ul + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
229 Round(c, d, e, f,
g, h, a, b, 0x06ca6351ul + (w14 +=
sigma1(w12) + w7 +
sigma0(w15)));
243 Round(e, f,
g, h, a, b, c, d, 0xd192e819ul + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
244 Round(d, e, f,
g, h, a, b, c, 0xd6990624ul + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
245 Round(c, d, e, f,
g, h, a, b, 0xf40e3585ul + (w14 +=
sigma1(w12) + w7 +
sigma0(w15)));
259 Round(e, f,
g, h, a, b, c, d, 0x90befffaul + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
260 Round(d, e, f,
g, h, a, b, c, 0xa4506cebul + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
273 uint32_t t0 = a, t1 = b, t2 = c, t3 = d, t4 = e, t5 = f, t6 =
g, t7 = h;
276 Round(a, b, c, d, e, f,
g, h, 0xc28a2f98ul);
277 Round(h, a, b, c, d, e, f,
g, 0x71374491ul);
278 Round(
g, h, a, b, c, d, e, f, 0xb5c0fbcful);
279 Round(f,
g, h, a, b, c, d, e, 0xe9b5dba5ul);
280 Round(e, f,
g, h, a, b, c, d, 0x3956c25bul);
281 Round(d, e, f,
g, h, a, b, c, 0x59f111f1ul);
282 Round(c, d, e, f,
g, h, a, b, 0x923f82a4ul);
283 Round(b, c, d, e, f,
g, h, a, 0xab1c5ed5ul);
284 Round(a, b, c, d, e, f,
g, h, 0xd807aa98ul);
285 Round(h, a, b, c, d, e, f,
g, 0x12835b01ul);
286 Round(
g, h, a, b, c, d, e, f, 0x243185beul);
287 Round(f,
g, h, a, b, c, d, e, 0x550c7dc3ul);
288 Round(e, f,
g, h, a, b, c, d, 0x72be5d74ul);
289 Round(d, e, f,
g, h, a, b, c, 0x80deb1feul);
290 Round(c, d, e, f,
g, h, a, b, 0x9bdc06a7ul);
291 Round(b, c, d, e, f,
g, h, a, 0xc19bf374ul);
292 Round(a, b, c, d, e, f,
g, h, 0x649b69c1ul);
293 Round(h, a, b, c, d, e, f,
g, 0xf0fe4786ul);
294 Round(
g, h, a, b, c, d, e, f, 0x0fe1edc6ul);
295 Round(f,
g, h, a, b, c, d, e, 0x240cf254ul);
296 Round(e, f,
g, h, a, b, c, d, 0x4fe9346ful);
297 Round(d, e, f,
g, h, a, b, c, 0x6cc984beul);
298 Round(c, d, e, f,
g, h, a, b, 0x61b9411eul);
299 Round(b, c, d, e, f,
g, h, a, 0x16f988faul);
300 Round(a, b, c, d, e, f,
g, h, 0xf2c65152ul);
301 Round(h, a, b, c, d, e, f,
g, 0xa88e5a6dul);
302 Round(
g, h, a, b, c, d, e, f, 0xb019fc65ul);
303 Round(f,
g, h, a, b, c, d, e, 0xb9d99ec7ul);
304 Round(e, f,
g, h, a, b, c, d, 0x9a1231c3ul);
305 Round(d, e, f,
g, h, a, b, c, 0xe70eeaa0ul);
306 Round(c, d, e, f,
g, h, a, b, 0xfdb1232bul);
307 Round(b, c, d, e, f,
g, h, a, 0xc7353eb0ul);
308 Round(a, b, c, d, e, f,
g, h, 0x3069bad5ul);
309 Round(h, a, b, c, d, e, f,
g, 0xcb976d5ful);
310 Round(
g, h, a, b, c, d, e, f, 0x5a0f118ful);
311 Round(f,
g, h, a, b, c, d, e, 0xdc1eeefdul);
312 Round(e, f,
g, h, a, b, c, d, 0x0a35b689ul);
313 Round(d, e, f,
g, h, a, b, c, 0xde0b7a04ul);
314 Round(c, d, e, f,
g, h, a, b, 0x58f4ca9dul);
315 Round(b, c, d, e, f,
g, h, a, 0xe15d5b16ul);
316 Round(a, b, c, d, e, f,
g, h, 0x007f3e86ul);
317 Round(h, a, b, c, d, e, f,
g, 0x37088980ul);
318 Round(
g, h, a, b, c, d, e, f, 0xa507ea32ul);
319 Round(f,
g, h, a, b, c, d, e, 0x6fab9537ul);
320 Round(e, f,
g, h, a, b, c, d, 0x17406110ul);
321 Round(d, e, f,
g, h, a, b, c, 0x0d8cd6f1ul);
322 Round(c, d, e, f,
g, h, a, b, 0xcdaa3b6dul);
323 Round(b, c, d, e, f,
g, h, a, 0xc0bbbe37ul);
324 Round(a, b, c, d, e, f,
g, h, 0x83613bdaul);
325 Round(h, a, b, c, d, e, f,
g, 0xdb48a363ul);
326 Round(
g, h, a, b, c, d, e, f, 0x0b02e931ul);
327 Round(f,
g, h, a, b, c, d, e, 0x6fd15ca7ul);
328 Round(e, f,
g, h, a, b, c, d, 0x521afacaul);
329 Round(d, e, f,
g, h, a, b, c, 0x31338431ul);
330 Round(c, d, e, f,
g, h, a, b, 0x6ed41a95ul);
331 Round(b, c, d, e, f,
g, h, a, 0x6d437890ul);
332 Round(a, b, c, d, e, f,
g, h, 0xc39c91f2ul);
333 Round(h, a, b, c, d, e, f,
g, 0x9eccabbdul);
334 Round(
g, h, a, b, c, d, e, f, 0xb5c9a0e6ul);
335 Round(f,
g, h, a, b, c, d, e, 0x532fb63cul);
336 Round(e, f,
g, h, a, b, c, d, 0xd2c741c6ul);
337 Round(d, e, f,
g, h, a, b, c, 0x07237ea3ul);
338 Round(c, d, e, f,
g, h, a, b, 0xa4954b68ul);
339 Round(b, c, d, e, f,
g, h, a, 0x4c191d76ul);
360 Round(a, b, c, d, e, f,
g, h, 0x428a2f98ul + w0);
361 Round(h, a, b, c, d, e, f,
g, 0x71374491ul + w1);
362 Round(
g, h, a, b, c, d, e, f, 0xb5c0fbcful + w2);
363 Round(f,
g, h, a, b, c, d, e, 0xe9b5dba5ul + w3);
364 Round(e, f,
g, h, a, b, c, d, 0x3956c25bul + w4);
365 Round(d, e, f,
g, h, a, b, c, 0x59f111f1ul + w5);
366 Round(c, d, e, f,
g, h, a, b, 0x923f82a4ul + w6);
367 Round(b, c, d, e, f,
g, h, a, 0xab1c5ed5ul + w7);
368 Round(a, b, c, d, e, f,
g, h, 0x5807aa98ul);
369 Round(h, a, b, c, d, e, f,
g, 0x12835b01ul);
370 Round(
g, h, a, b, c, d, e, f, 0x243185beul);
371 Round(f,
g, h, a, b, c, d, e, 0x550c7dc3ul);
372 Round(e, f,
g, h, a, b, c, d, 0x72be5d74ul);
373 Round(d, e, f,
g, h, a, b, c, 0x80deb1feul);
374 Round(c, d, e, f,
g, h, a, b, 0x9bdc06a7ul);
375 Round(b, c, d, e, f,
g, h, a, 0xc19bf274ul);
376 Round(a, b, c, d, e, f,
g, h, 0xe49b69c1ul + (w0 +=
sigma0(w1)));
377 Round(h, a, b, c, d, e, f,
g, 0xefbe4786ul + (w1 += 0xa00000ul +
sigma0(w2)));
382 Round(c, d, e, f,
g, h, a, b, 0x5cb0a9dcul + (w6 +=
sigma1(w4) + 0x100ul +
sigma0(w7)));
383 Round(b, c, d, e, f,
g, h, a, 0x76f988daul + (w7 +=
sigma1(w5) + w0 + 0x11002000ul));
384 Round(a, b, c, d, e, f,
g, h, 0x983e5152ul + (w8 = 0x80000000ul +
sigma1(w6) + w1));
385 Round(h, a, b, c, d, e, f,
g, 0xa831c66dul + (w9 =
sigma1(w7) + w2));
386 Round(
g, h, a, b, c, d, e, f, 0xb00327c8ul + (w10 =
sigma1(w8) + w3));
387 Round(f,
g, h, a, b, c, d, e, 0xbf597fc7ul + (w11 =
sigma1(w9) + w4));
388 Round(e, f,
g, h, a, b, c, d, 0xc6e00bf3ul + (w12 =
sigma1(w10) + w5));
389 Round(d, e, f,
g, h, a, b, c, 0xd5a79147ul + (w13 =
sigma1(w11) + w6));
390 Round(c, d, e, f,
g, h, a, b, 0x06ca6351ul + (w14 =
sigma1(w12) + w7 + 0x400022ul));
391 Round(b, c, d, e, f,
g, h, a, 0x14292967ul + (w15 = 0x100ul +
sigma1(w13) + w8 +
sigma0(w0)));
404 Round(e, f,
g, h, a, b, c, d, 0xd192e819ul + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
405 Round(d, e, f,
g, h, a, b, c, 0xd6990624ul + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));
406 Round(c, d, e, f,
g, h, a, b, 0xf40e3585ul + (w14 +=
sigma1(w12) + w7 +
sigma0(w15)));
420 Round(e, f,
g, h, a, b, c, d, 0x90befffaul + (w12 +=
sigma1(w10) + w5 +
sigma0(w13)));
421 Round(d, e, f,
g, h, a, b, c, 0xa4506cebul + (w13 +=
sigma1(w11) + w6 +
sigma0(w14)));