88#ifndef _MHD_GET_64BIT_BE_ALLOW_UNALIGNED
92 memcpy (W,
data,
sizeof(W));
96 data = (
const void *) W;
103#define Ch(x,y,z) ( (z) ^ ((x) & ((y) ^ (z))) )
104#define Maj(x,y,z) ( ((x) & (y)) ^ ((z) & ((x) ^ (y))) )
112 ( _MHD_ROTR64 ((x), 28) ^ _MHD_ROTR64 ((x), 34) ^ _MHD_ROTR64 ((x), 39) )
114 ( _MHD_ROTR64 ((x), 14) ^ _MHD_ROTR64 ((x), 18) ^ _MHD_ROTR64 ((x), 41) )
116 ( _MHD_ROTR64 ((x), 1) ^ _MHD_ROTR64 ((x), 8) ^ ((x) >> 7) )
118 ( _MHD_ROTR64 ((x), 19) ^ _MHD_ROTR64 ((x), 61) ^ ((x) >> 6) )
129#define SHA2STEP64(vA,vB,vC,vD,vE,vF,vG,vH,kt,wt) do { \
130 (vD) += ((vH) += SIG1 ((vE)) + Ch ((vE),(vF),(vG)) + (kt) + (wt)); \
131 (vH) += SIG0 ((vA)) + Maj ((vA),(vB),(vC)); } while (0)
137#define GET_W_FROM_DATA(buf,t) \
138 _MHD_GET_64BIT_BE (((const uint64_t*) (buf)) + (t))
145#define Wgen(w,t) ( (w)[(t - 16) & 15] + sig1 ((w)[((t) - 2) & 15]) \
146 + (w)[((t) - 7) & 15] + sig0 ((w)[((t) - 15) & 15]) )
148#ifndef MHD_FAVOR_SMALL_CODE
159#if _MHD_BYTE_ORDER == _MHD_BIG_ENDIAN
160 if ((
const void *) W ==
data)
164 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0x428a2f98d728ae22), W[0]);
165 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0x7137449123ef65cd), W[1]);
166 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0xb5c0fbcfec4d3b2f), W[2]);
167 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0xe9b5dba58189dbbc), W[3]);
168 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0x3956c25bf348b538), W[4]);
169 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0x59f111f1b605d019), W[5]);
170 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0x923f82a4af194f9b), W[6]);
171 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0xab1c5ed5da6d8118), W[7]);
172 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0xd807aa98a3030242), W[8]);
173 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0x12835b0145706fbe), W[9]);
174 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0x243185be4ee4b28c), W[10]);
175 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0x550c7dc3d5ffb4e2), W[11]);
176 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0x72be5d74f27b896f), W[12]);
177 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0x80deb1fe3b1696b1), W[13]);
178 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0x9bdc06a725c71235), W[14]);
179 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0xc19bf174cf692694), W[15]);
188 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0x428a2f98d728ae22), \
190 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0x7137449123ef65cd), \
192 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0xb5c0fbcfec4d3b2f), \
194 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0xe9b5dba58189dbbc), \
196 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0x3956c25bf348b538), \
198 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0x59f111f1b605d019), \
200 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0x923f82a4af194f9b), \
202 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0xab1c5ed5da6d8118), \
204 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0xd807aa98a3030242), \
206 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0x12835b0145706fbe), \
208 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0x243185be4ee4b28c), \
210 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0x550c7dc3d5ffb4e2), \
212 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0x72be5d74f27b896f), \
214 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0x80deb1fe3b1696b1), \
216 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0x9bdc06a725c71235), \
218 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0xc19bf174cf692694), \
228 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0xe49b69c19ef14ad2), \
229 W[16 & 15] =
Wgen (W,16));
230 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0xefbe4786384f25e3), \
231 W[17 & 15] =
Wgen (W,17));
232 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0x0fc19dc68b8cd5b5), \
233 W[18 & 15] =
Wgen (W,18));
234 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0x240ca1cc77ac9c65), \
235 W[19 & 15] =
Wgen (W,19));
236 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0x2de92c6f592b0275), \
237 W[20 & 15] =
Wgen (W,20));
238 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0x4a7484aa6ea6e483), \
239 W[21 & 15] =
Wgen (W,21));
240 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0x5cb0a9dcbd41fbd4), \
241 W[22 & 15] =
Wgen (W,22));
242 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0x76f988da831153b5), \
243 W[23 & 15] =
Wgen (W,23));
244 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0x983e5152ee66dfab), \
245 W[24 & 15] =
Wgen (W,24));
246 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0xa831c66d2db43210), \
247 W[25 & 15] =
Wgen (W,25));
248 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0xb00327c898fb213f), \
249 W[26 & 15] =
Wgen (W,26));
250 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0xbf597fc7beef0ee4), \
251 W[27 & 15] =
Wgen (W,27));
252 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0xc6e00bf33da88fc2), \
253 W[28 & 15] =
Wgen (W,28));
254 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0xd5a79147930aa725), \
255 W[29 & 15] =
Wgen (W,29));
256 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0x06ca6351e003826f), \
257 W[30 & 15] =
Wgen (W,30));
258 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0x142929670a0e6e70), \
259 W[31 & 15] =
Wgen (W,31));
260 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0x27b70a8546d22ffc), \
261 W[32 & 15] =
Wgen (W,32));
262 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0x2e1b21385c26c926), \
263 W[33 & 15] =
Wgen (W,33));
264 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0x4d2c6dfc5ac42aed), \
265 W[34 & 15] =
Wgen (W,34));
266 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0x53380d139d95b3df), \
267 W[35 & 15] =
Wgen (W,35));
268 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0x650a73548baf63de), \
269 W[36 & 15] =
Wgen (W,36));
270 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0x766a0abb3c77b2a8), \
271 W[37 & 15] =
Wgen (W,37));
272 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0x81c2c92e47edaee6), \
273 W[38 & 15] =
Wgen (W,38));
274 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0x92722c851482353b), \
275 W[39 & 15] =
Wgen (W,39));
276 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0xa2bfe8a14cf10364), \
277 W[40 & 15] =
Wgen (W,40));
278 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0xa81a664bbc423001), \
279 W[41 & 15] =
Wgen (W,41));
280 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0xc24b8b70d0f89791), \
281 W[42 & 15] =
Wgen (W,42));
282 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0xc76c51a30654be30), \
283 W[43 & 15] =
Wgen (W,43));
284 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0xd192e819d6ef5218), \
285 W[44 & 15] =
Wgen (W,44));
286 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0xd69906245565a910), \
287 W[45 & 15] =
Wgen (W,45));
288 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0xf40e35855771202a), \
289 W[46 & 15] =
Wgen (W,46));
290 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0x106aa07032bbd1b8), \
291 W[47 & 15] =
Wgen (W,47));
292 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0x19a4c116b8d2d0c8), \
293 W[48 & 15] =
Wgen (W,48));
294 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0x1e376c085141ab53), \
295 W[49 & 15] =
Wgen (W,49));
296 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0x2748774cdf8eeb99), \
297 W[50 & 15] =
Wgen (W,50));
298 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0x34b0bcb5e19b48a8), \
299 W[51 & 15] =
Wgen (W,51));
300 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0x391c0cb3c5c95a63), \
301 W[52 & 15] =
Wgen (W,52));
302 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0x4ed8aa4ae3418acb), \
303 W[53 & 15] =
Wgen (W,53));
304 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0x5b9cca4f7763e373), \
305 W[54 & 15] =
Wgen (W,54));
306 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0x682e6ff3d6b2b8a3), \
307 W[55 & 15] =
Wgen (W,55));
308 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0x748f82ee5defb2fc), \
309 W[56 & 15] =
Wgen (W,56));
310 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0x78a5636f43172f60), \
311 W[57 & 15] =
Wgen (W,57));
312 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0x84c87814a1f0ab72), \
313 W[58 & 15] =
Wgen (W,58));
314 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0x8cc702081a6439ec), \
315 W[59 & 15] =
Wgen (W,59));
316 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0x90befffa23631e28), \
317 W[60 & 15] =
Wgen (W,60));
318 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0xa4506cebde82bde9), \
319 W[61 & 15] =
Wgen (W,61));
320 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0xbef9a3f7b2c67915), \
321 W[62 & 15] =
Wgen (W,62));
322 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0xc67178f2e372532b), \
323 W[63 & 15] =
Wgen (W,63));
324 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0xca273eceea26619c), \
325 W[64 & 15] =
Wgen (W,64));
326 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0xd186b8c721c0c207), \
327 W[65 & 15] =
Wgen (W,65));
328 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0xeada7dd6cde0eb1e), \
329 W[66 & 15] =
Wgen (W,66));
330 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0xf57d4f7fee6ed178), \
331 W[67 & 15] =
Wgen (W,67));
332 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0x06f067aa72176fba), \
333 W[68 & 15] =
Wgen (W,68));
334 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0x0a637dc5a2c898a6), \
335 W[69 & 15] =
Wgen (W,69));
336 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0x113f9804bef90dae), \
337 W[70 & 15] =
Wgen (W,70));
338 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0x1b710b35131c471b), \
339 W[71 & 15] =
Wgen (W,71));
340 SHA2STEP64 (a, b, c, d, e, f, g, h, UINT64_C (0x28db77f523047d84), \
341 W[72 & 15] =
Wgen (W,72));
342 SHA2STEP64 (h, a, b, c, d, e, f, g, UINT64_C (0x32caab7b40c72493), \
343 W[73 & 15] =
Wgen (W,73));
344 SHA2STEP64 (g, h, a, b, c, d, e, f, UINT64_C (0x3c9ebe0a15c9bebc), \
345 W[74 & 15] =
Wgen (W,74));
346 SHA2STEP64 (f, g, h, a, b, c, d, e, UINT64_C (0x431d67c49c100d4c), \
347 W[75 & 15] =
Wgen (W,75));
348 SHA2STEP64 (e, f, g, h, a, b, c, d, UINT64_C (0x4cc5d4becb3e42b6), \
349 W[76 & 15] =
Wgen (W,76));
350 SHA2STEP64 (d, e, f, g, h, a, b, c, UINT64_C (0x597f299cfc657e2a), \
351 W[77 & 15] =
Wgen (W,77));
352 SHA2STEP64 (c, d, e, f, g, h, a, b, UINT64_C (0x5fcb6fab3ad6faec), \
353 W[78 & 15] =
Wgen (W,78));
354 SHA2STEP64 (b, c, d, e, f, g, h, a, UINT64_C (0x6c44198c4a475817), \
355 W[79 & 15] =
Wgen (W,79));
362 static const uint64_t K[80] =
363 { UINT64_C (0x428a2f98d728ae22), UINT64_C (0x7137449123ef65cd),
364 UINT64_C (0xb5c0fbcfec4d3b2f), UINT64_C (0xe9b5dba58189dbbc),
365 UINT64_C (0x3956c25bf348b538), UINT64_C (0x59f111f1b605d019),
366 UINT64_C (0x923f82a4af194f9b), UINT64_C (0xab1c5ed5da6d8118),
367 UINT64_C (0xd807aa98a3030242), UINT64_C (0x12835b0145706fbe),
368 UINT64_C (0x243185be4ee4b28c), UINT64_C (0x550c7dc3d5ffb4e2),
369 UINT64_C (0x72be5d74f27b896f), UINT64_C (0x80deb1fe3b1696b1),
370 UINT64_C (0x9bdc06a725c71235), UINT64_C (0xc19bf174cf692694),
371 UINT64_C (0xe49b69c19ef14ad2), UINT64_C (0xefbe4786384f25e3),
372 UINT64_C (0x0fc19dc68b8cd5b5), UINT64_C (0x240ca1cc77ac9c65),
373 UINT64_C (0x2de92c6f592b0275), UINT64_C (0x4a7484aa6ea6e483),
374 UINT64_C (0x5cb0a9dcbd41fbd4), UINT64_C (0x76f988da831153b5),
375 UINT64_C (0x983e5152ee66dfab), UINT64_C (0xa831c66d2db43210),
376 UINT64_C (0xb00327c898fb213f), UINT64_C (0xbf597fc7beef0ee4),
377 UINT64_C (0xc6e00bf33da88fc2), UINT64_C (0xd5a79147930aa725),
378 UINT64_C (0x06ca6351e003826f), UINT64_C (0x142929670a0e6e70),
379 UINT64_C (0x27b70a8546d22ffc), UINT64_C (0x2e1b21385c26c926),
380 UINT64_C (0x4d2c6dfc5ac42aed), UINT64_C (0x53380d139d95b3df),
381 UINT64_C (0x650a73548baf63de), UINT64_C (0x766a0abb3c77b2a8),
382 UINT64_C (0x81c2c92e47edaee6), UINT64_C (0x92722c851482353b),
383 UINT64_C (0xa2bfe8a14cf10364), UINT64_C (0xa81a664bbc423001),
384 UINT64_C (0xc24b8b70d0f89791), UINT64_C (0xc76c51a30654be30),
385 UINT64_C (0xd192e819d6ef5218), UINT64_C (0xd69906245565a910),
386 UINT64_C (0xf40e35855771202a), UINT64_C (0x106aa07032bbd1b8),
387 UINT64_C (0x19a4c116b8d2d0c8), UINT64_C (0x1e376c085141ab53),
388 UINT64_C (0x2748774cdf8eeb99), UINT64_C (0x34b0bcb5e19b48a8),
389 UINT64_C (0x391c0cb3c5c95a63), UINT64_C (0x4ed8aa4ae3418acb),
390 UINT64_C (0x5b9cca4f7763e373), UINT64_C (0x682e6ff3d6b2b8a3),
391 UINT64_C (0x748f82ee5defb2fc), UINT64_C (0x78a5636f43172f60),
392 UINT64_C (0x84c87814a1f0ab72), UINT64_C (0x8cc702081a6439ec),
393 UINT64_C (0x90befffa23631e28), UINT64_C (0xa4506cebde82bde9),
394 UINT64_C (0xbef9a3f7b2c67915), UINT64_C (0xc67178f2e372532b),
395 UINT64_C (0xca273eceea26619c), UINT64_C (0xd186b8c721c0c207),
396 UINT64_C (0xeada7dd6cde0eb1e), UINT64_C (0xf57d4f7fee6ed178),
397 UINT64_C (0x06f067aa72176fba), UINT64_C (0x0a637dc5a2c898a6),
398 UINT64_C (0x113f9804bef90dae), UINT64_C (0x1b710b35131c471b),
399 UINT64_C (0x28db77f523047d84), UINT64_C (0x32caab7b40c72493),
400 UINT64_C (0x3c9ebe0a15c9bebc), UINT64_C (0x431d67c49c100d4c),
401 UINT64_C (0x4cc5d4becb3e42b6), UINT64_C (0x597f299cfc657e2a),
402 UINT64_C (0x5fcb6fab3ad6faec), UINT64_C (0x6c44198c4a475817)};
408#define SHA2STEP64RV(vA,vB,vC,vD,vE,vF,vG,vH,kt,wt) do { \
409 uint64_t tmp_h_ = (vH); \
410 SHA2STEP64((vA),(vB),(vC),(vD),(vE),(vF),(vG),tmp_h_,(kt),(wt)); \
418 (vA) = tmp_h_; } while (0)
423 for (t = 0; t < 16; ++t)
425 SHA2STEP64RV (a, b, c, d, e, f, g, h, K[t], \
431 for (t = 16; t < 80; ++t)
433 SHA2STEP64RV (a, b, c, d, e, f, g, h, K[t], \
434 W[t & 15] =
Wgen (W,t));