34__m128i inline Sigma0(
__m128i x) {
return Xor(
Or(
ShR(x, 2),
ShL(x, 30)),
Or(
ShR(x, 13),
ShL(x, 19)),
Or(
ShR(x, 22),
ShL(x, 10))); }
35__m128i inline Sigma1(
__m128i x) {
return Xor(
Or(
ShR(x, 6),
ShL(x, 26)),
Or(
ShR(x, 11),
ShL(x, 21)),
Or(
ShR(x, 25),
ShL(x, 7))); }
58void inline Write4(
unsigned char* out,
int offset,
__m128i v) {
80 __m128i w0,
w1,
w2,
w3,
w4,
w5,
w6,
w7,
w8,
w9,
w10,
w11,
w12,
w13,
w14,
w15;
82 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x428a2f98ul),
w0 =
Read4(in, 0)));
83 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x71374491ul),
w1 =
Read4(in, 4)));
84 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0xb5c0fbcful),
w2 =
Read4(in, 8)));
85 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0xe9b5dba5ul),
w3 =
Read4(in, 12)));
86 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x3956c25bul),
w4 =
Read4(in, 16)));
87 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x59f111f1ul),
w5 =
Read4(in, 20)));
88 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x923f82a4ul),
w6 =
Read4(in, 24)));
89 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0xab1c5ed5ul),
w7 =
Read4(in, 28)));
90 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0xd807aa98ul),
w8 =
Read4(in, 32)));
91 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x12835b01ul),
w9 =
Read4(in, 36)));
92 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x243185beul),
w10 =
Read4(in, 40)));
93 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x550c7dc3ul),
w11 =
Read4(in, 44)));
94 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x72be5d74ul),
w12 =
Read4(in, 48)));
95 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x80deb1feul),
w13 =
Read4(in, 52)));
96 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x9bdc06a7ul),
w14 =
Read4(in, 56)));
97 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0xc19bf174ul),
w15 =
Read4(in, 60)));
98 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0xe49b69c1ul),
Inc(
w0,
sigma1(
w14),
w9,
sigma0(
w1))));
99 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xefbe4786ul),
Inc(
w1,
sigma1(
w15),
w10,
sigma0(
w2))));
100 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x0fc19dc6ul),
Inc(
w2,
sigma1(
w0),
w11,
sigma0(
w3))));
101 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x240ca1ccul),
Inc(
w3,
sigma1(
w1),
w12,
sigma0(
w4))));
102 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x2de92c6ful),
Inc(
w4,
sigma1(
w2),
w13,
sigma0(
w5))));
103 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x4a7484aaul),
Inc(
w5,
sigma1(
w3),
w14,
sigma0(
w6))));
104 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x5cb0a9dcul),
Inc(
w6,
sigma1(
w4),
w15,
sigma0(
w7))));
105 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x76f988daul),
Inc(
w7,
sigma1(
w5),
w0,
sigma0(
w8))));
106 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x983e5152ul),
Inc(
w8,
sigma1(
w6),
w1,
sigma0(
w9))));
107 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xa831c66dul),
Inc(
w9,
sigma1(
w7),
w2,
sigma0(
w10))));
108 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0xb00327c8ul),
Inc(
w10,
sigma1(
w8),
w3,
sigma0(
w11))));
109 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0xbf597fc7ul),
Inc(
w11,
sigma1(
w9),
w4,
sigma0(
w12))));
110 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0xc6e00bf3ul),
Inc(
w12,
sigma1(
w10),
w5,
sigma0(
w13))));
111 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xd5a79147ul),
Inc(
w13,
sigma1(
w11),
w6,
sigma0(
w14))));
112 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x06ca6351ul),
Inc(
w14,
sigma1(
w12),
w7,
sigma0(
w15))));
113 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x14292967ul),
Inc(
w15,
sigma1(
w13),
w8,
sigma0(
w0))));
114 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x27b70a85ul),
Inc(
w0,
sigma1(
w14),
w9,
sigma0(
w1))));
115 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x2e1b2138ul),
Inc(
w1,
sigma1(
w15),
w10,
sigma0(
w2))));
116 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x4d2c6dfcul),
Inc(
w2,
sigma1(
w0),
w11,
sigma0(
w3))));
117 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x53380d13ul),
Inc(
w3,
sigma1(
w1),
w12,
sigma0(
w4))));
118 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x650a7354ul),
Inc(
w4,
sigma1(
w2),
w13,
sigma0(
w5))));
119 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x766a0abbul),
Inc(
w5,
sigma1(
w3),
w14,
sigma0(
w6))));
120 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x81c2c92eul),
Inc(
w6,
sigma1(
w4),
w15,
sigma0(
w7))));
121 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x92722c85ul),
Inc(
w7,
sigma1(
w5),
w0,
sigma0(
w8))));
122 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0xa2bfe8a1ul),
Inc(
w8,
sigma1(
w6),
w1,
sigma0(
w9))));
123 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xa81a664bul),
Inc(
w9,
sigma1(
w7),
w2,
sigma0(
w10))));
124 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0xc24b8b70ul),
Inc(
w10,
sigma1(
w8),
w3,
sigma0(
w11))));
125 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0xc76c51a3ul),
Inc(
w11,
sigma1(
w9),
w4,
sigma0(
w12))));
126 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0xd192e819ul),
Inc(
w12,
sigma1(
w10),
w5,
sigma0(
w13))));
127 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xd6990624ul),
Inc(
w13,
sigma1(
w11),
w6,
sigma0(
w14))));
128 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0xf40e3585ul),
Inc(
w14,
sigma1(
w12),
w7,
sigma0(
w15))));
129 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x106aa070ul),
Inc(
w15,
sigma1(
w13),
w8,
sigma0(
w0))));
130 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x19a4c116ul),
Inc(
w0,
sigma1(
w14),
w9,
sigma0(
w1))));
131 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x1e376c08ul),
Inc(
w1,
sigma1(
w15),
w10,
sigma0(
w2))));
132 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x2748774cul),
Inc(
w2,
sigma1(
w0),
w11,
sigma0(
w3))));
133 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x34b0bcb5ul),
Inc(
w3,
sigma1(
w1),
w12,
sigma0(
w4))));
134 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x391c0cb3ul),
Inc(
w4,
sigma1(
w2),
w13,
sigma0(
w5))));
135 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x4ed8aa4aul),
Inc(
w5,
sigma1(
w3),
w14,
sigma0(
w6))));
136 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x5b9cca4ful),
Inc(
w6,
sigma1(
w4),
w15,
sigma0(
w7))));
137 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x682e6ff3ul),
Inc(
w7,
sigma1(
w5),
w0,
sigma0(
w8))));
138 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x748f82eeul),
Inc(
w8,
sigma1(
w6),
w1,
sigma0(
w9))));
139 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x78a5636ful),
Inc(
w9,
sigma1(
w7),
w2,
sigma0(
w10))));
140 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x84c87814ul),
Inc(
w10,
sigma1(
w8),
w3,
sigma0(
w11))));
141 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x8cc70208ul),
Inc(
w11,
sigma1(
w9),
w4,
sigma0(
w12))));
142 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x90befffaul),
Inc(
w12,
sigma1(
w10),
w5,
sigma0(
w13))));
143 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xa4506cebul),
Inc(
w13,
sigma1(
w11),
w6,
sigma0(
w14))));
144 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0xbef9a3f7ul),
Inc(
w14,
sigma1(
w12),
w7,
sigma0(
w15))));
145 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0xc67178f2ul),
Inc(
w15,
sigma1(
w13),
w8,
sigma0(
w0))));
147 a = Add(
a,
K(0x6a09e667ul));
148 b = Add(b,
K(0xbb67ae85ul));
149 c = Add(
c,
K(0x3c6ef372ul));
150 d = Add(d,
K(0xa54ff53aul));
151 e = Add(
e,
K(0x510e527ful));
152 f = Add(
f,
K(0x9b05688cul));
153 g = Add(
g,
K(0x1f83d9abul));
154 h = Add(h,
K(0x5be0cd19ul));
259 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0xe49b69c1ul),
Inc(
w0,
sigma0(
w1))));
260 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xefbe4786ul),
Inc(
w1,
K(0xa00000ul),
sigma0(
w2))));
261 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x0fc19dc6ul),
Inc(
w2,
sigma1(
w0),
sigma0(
w3))));
262 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x240ca1ccul),
Inc(
w3,
sigma1(
w1),
sigma0(
w4))));
263 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x2de92c6ful),
Inc(
w4,
sigma1(
w2),
sigma0(
w5))));
264 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x4a7484aaul),
Inc(
w5,
sigma1(
w3),
sigma0(
w6))));
265 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x5cb0a9dcul),
Inc(
w6,
sigma1(
w4),
K(0x100ul),
sigma0(
w7))));
266 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x76f988daul),
Inc(
w7,
sigma1(
w5),
w0,
K(0x11002000ul))));
267 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x983e5152ul),
w8 = Add(
K(0x80000000ul),
sigma1(
w6),
w1)));
268 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xa831c66dul),
w9 = Add(
sigma1(
w7),
w2)));
269 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0xb00327c8ul),
w10 = Add(
sigma1(
w8),
w3)));
270 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0xbf597fc7ul),
w11 = Add(
sigma1(
w9),
w4)));
271 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0xc6e00bf3ul),
w12 = Add(
sigma1(
w10),
w5)));
272 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xd5a79147ul),
w13 = Add(
sigma1(
w11),
w6)));
273 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x06ca6351ul),
w14 = Add(
sigma1(
w12),
w7,
K(0x400022ul))));
274 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x14292967ul),
w15 = Add(
K(0x100ul),
sigma1(
w13),
w8,
sigma0(
w0))));
275 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x27b70a85ul),
Inc(
w0,
sigma1(
w14),
w9,
sigma0(
w1))));
276 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x2e1b2138ul),
Inc(
w1,
sigma1(
w15),
w10,
sigma0(
w2))));
277 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x4d2c6dfcul),
Inc(
w2,
sigma1(
w0),
w11,
sigma0(
w3))));
278 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x53380d13ul),
Inc(
w3,
sigma1(
w1),
w12,
sigma0(
w4))));
279 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x650a7354ul),
Inc(
w4,
sigma1(
w2),
w13,
sigma0(
w5))));
280 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x766a0abbul),
Inc(
w5,
sigma1(
w3),
w14,
sigma0(
w6))));
281 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x81c2c92eul),
Inc(
w6,
sigma1(
w4),
w15,
sigma0(
w7))));
282 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x92722c85ul),
Inc(
w7,
sigma1(
w5),
w0,
sigma0(
w8))));
283 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0xa2bfe8a1ul),
Inc(
w8,
sigma1(
w6),
w1,
sigma0(
w9))));
284 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0xa81a664bul),
Inc(
w9,
sigma1(
w7),
w2,
sigma0(
w10))));
285 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0xc24b8b70ul),
Inc(
w10,
sigma1(
w8),
w3,
sigma0(
w11))));
286 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0xc76c51a3ul),
Inc(
w11,
sigma1(
w9),
w4,
sigma0(
w12))));
287 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0xd192e819ul),
Inc(
w12,
sigma1(
w10),
w5,
sigma0(
w13))));
288 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xd6990624ul),
Inc(
w13,
sigma1(
w11),
w6,
sigma0(
w14))));
289 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0xf40e3585ul),
Inc(
w14,
sigma1(
w12),
w7,
sigma0(
w15))));
290 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x106aa070ul),
Inc(
w15,
sigma1(
w13),
w8,
sigma0(
w0))));
291 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x19a4c116ul),
Inc(
w0,
sigma1(
w14),
w9,
sigma0(
w1))));
292 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x1e376c08ul),
Inc(
w1,
sigma1(
w15),
w10,
sigma0(
w2))));
293 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x2748774cul),
Inc(
w2,
sigma1(
w0),
w11,
sigma0(
w3))));
294 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x34b0bcb5ul),
Inc(
w3,
sigma1(
w1),
w12,
sigma0(
w4))));
295 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x391c0cb3ul),
Inc(
w4,
sigma1(
w2),
w13,
sigma0(
w5))));
296 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0x4ed8aa4aul),
Inc(
w5,
sigma1(
w3),
w14,
sigma0(
w6))));
297 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0x5b9cca4ful),
Inc(
w6,
sigma1(
w4),
w15,
sigma0(
w7))));
298 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0x682e6ff3ul),
Inc(
w7,
sigma1(
w5),
w0,
sigma0(
w8))));
299 Round(
a, b,
c, d,
e,
f,
g, h, Add(
K(0x748f82eeul),
Inc(
w8,
sigma1(
w6),
w1,
sigma0(
w9))));
300 Round(h,
a, b,
c, d,
e,
f,
g, Add(
K(0x78a5636ful),
Inc(
w9,
sigma1(
w7),
w2,
sigma0(
w10))));
301 Round(
g, h,
a, b,
c, d,
e,
f, Add(
K(0x84c87814ul),
Inc(
w10,
sigma1(
w8),
w3,
sigma0(
w11))));
302 Round(
f,
g, h,
a, b,
c, d,
e, Add(
K(0x8cc70208ul),
Inc(
w11,
sigma1(
w9),
w4,
sigma0(
w12))));
303 Round(
e,
f,
g, h,
a, b,
c, d, Add(
K(0x90befffaul),
Inc(
w12,
sigma1(
w10),
w5,
sigma0(
w13))));
304 Round(d,
e,
f,
g, h,
a, b,
c, Add(
K(0xa4506cebul),
Inc(
w13,
sigma1(
w11),
w6,
sigma0(
w14))));
305 Round(
c, d,
e,
f,
g, h,
a, b, Add(
K(0xbef9a3f7ul),
w14,
sigma1(
w12),
w7,
sigma0(
w15)));
306 Round(b,
c, d,
e,
f,
g, h,
a, Add(
K(0xc67178f2ul),
w15,
sigma1(
w13),
w8,
sigma0(
w0)));
309 Write4(out, 0, Add(
a,
K(0x6a09e667ul)));
310 Write4(out, 4, Add(b,
K(0xbb67ae85ul)));
311 Write4(out, 8, Add(
c,
K(0x3c6ef372ul)));
312 Write4(out, 12, Add(d,
K(0xa54ff53aul)));
313 Write4(out, 16, Add(
e,
K(0x510e527ful)));
314 Write4(out, 20, Add(
f,
K(0x9b05688cul)));
315 Write4(out, 24, Add(
g,
K(0x1f83d9abul)));
316 Write4(out, 28, Add(h,
K(0x5be0cd19ul)));
void WriteLE32(B *ptr, uint32_t x)
uint32_t ReadLE32(const B *ptr)
#define Round(a, b, c, d, e, f, g, h, k, w)
void Transform_4way(unsigned char *out, const unsigned char *in)
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.