79#ifndef _MHD_GET_32BIT_LE_UNALIGNED
83 memcpy (X, M,
sizeof(X));
94#define F_FUNC(x,y,z) ((((y) ^ (z)) & (x)) ^ (z))
97#ifndef MHD_FAVOR_SMALL_CODE
98# define G_FUNC_1(x,y,z) ((~(z)) & (y))
99# define G_FUNC_2(x,y,z) ((z) & (x))
101# define G_FUNC_1(x,y,z) ((((x) ^ (y)) & (z)) ^ (y))
102# define G_FUNC_2(x,y,z) UINT32_C(0)
104#define H_FUNC(x,y,z) ((x) ^ (y) ^ (z))
106#define I_FUNC(x,y,z) (((~(z)) | (x)) ^ (y))
111#define MD5STEP_R1(va,vb,vc,vd,vX,vs,vT) do { \
112 (va) += (vX) + (vT); \
113 (va) += F_FUNC((vb),(vc),(vd)); \
114 (va) = _MHD_ROTL32((va),(vs)) + (vb); } while (0)
118#define GET_X_FROM_DATA(buf,t) \
119 _MHD_GET_32BIT_LE (((const uint32_t*) (buf)) + (t))
124#define MD5STEP_R2(va,vb,vc,vd,vX,vs,vT) do { \
125 (va) += (vX) + (vT); \
126 (va) += G_FUNC_1((vb),(vc),(vd)); \
127 (va) += G_FUNC_2((vb),(vc),(vd)); \
128 (va) = _MHD_ROTL32((va),(vs)) + (vb); } while (0)
133#define MD5STEP_R3(va,vb,vc,vd,vX,vs,vT) do { \
134 (va) += (vX) + (vT); \
135 (va) += H_FUNC((vb),(vc),(vd)); \
136 (va) = _MHD_ROTL32((va),(vs)) + (vb); } while (0)
141#define MD5STEP_R4(va,vb,vc,vd,vX,vs,vT) do { \
142 (va) += (vX) + (vT); \
143 (va) += I_FUNC((vb),(vc),(vd)); \
144 (va) = _MHD_ROTL32((va),(vs)) + (vb); } while (0)
146#if ! defined(MHD_FAVOR_SMALL_CODE)
150#if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
151 if ((
const void *) X == M)
155 MD5STEP_R1 (A, B, C, D, X[0], 7, UINT32_C (0xd76aa478));
156 MD5STEP_R1 (D, A, B, C, X[1], 12, UINT32_C (0xe8c7b756));
157 MD5STEP_R1 (C, D, A, B, X[2], 17, UINT32_C (0x242070db));
158 MD5STEP_R1 (B, C, D, A, X[3], 22, UINT32_C (0xc1bdceee));
160 MD5STEP_R1 (A, B, C, D, X[4], 7, UINT32_C (0xf57c0faf));
161 MD5STEP_R1 (D, A, B, C, X[5], 12, UINT32_C (0x4787c62a));
162 MD5STEP_R1 (C, D, A, B, X[6], 17, UINT32_C (0xa8304613));
163 MD5STEP_R1 (B, C, D, A, X[7], 22, UINT32_C (0xfd469501));
165 MD5STEP_R1 (A, B, C, D, X[8], 7, UINT32_C (0x698098d8));
166 MD5STEP_R1 (D, A, B, C, X[9], 12, UINT32_C (0x8b44f7af));
167 MD5STEP_R1 (C, D, A, B, X[10], 17, UINT32_C (0xffff5bb1));
168 MD5STEP_R1 (B, C, D, A, X[11], 22, UINT32_C (0x895cd7be));
170 MD5STEP_R1 (A, B, C, D, X[12], 7, UINT32_C (0x6b901122));
171 MD5STEP_R1 (D, A, B, C, X[13], 12, UINT32_C (0xfd987193));
172 MD5STEP_R1 (C, D, A, B, X[14], 17, UINT32_C (0xa679438e));
173 MD5STEP_R1 (B, C, D, A, X[15], 22, UINT32_C (0x49b40821));
182 UINT32_C (0xd76aa478));
184 UINT32_C (0xe8c7b756));
186 UINT32_C (0x242070db));
188 UINT32_C (0xc1bdceee));
191 UINT32_C (0xf57c0faf));
193 UINT32_C (0x4787c62a));
195 UINT32_C (0xa8304613));
197 UINT32_C (0xfd469501));
200 UINT32_C (0x698098d8));
202 UINT32_C (0x8b44f7af));
204 UINT32_C (0xffff5bb1));
206 UINT32_C (0x895cd7be));
209 UINT32_C (0x6b901122));
211 UINT32_C (0xfd987193));
213 UINT32_C (0xa679438e));
215 UINT32_C (0x49b40821));
220 MD5STEP_R2 (A, B, C, D, X[1], 5, UINT32_C (0xf61e2562));
221 MD5STEP_R2 (D, A, B, C, X[6], 9, UINT32_C (0xc040b340));
222 MD5STEP_R2 (C, D, A, B, X[11], 14, UINT32_C (0x265e5a51));
223 MD5STEP_R2 (B, C, D, A, X[0], 20, UINT32_C (0xe9b6c7aa));
225 MD5STEP_R2 (A, B, C, D, X[5], 5, UINT32_C (0xd62f105d));
226 MD5STEP_R2 (D, A, B, C, X[10], 9, UINT32_C (0x02441453));
227 MD5STEP_R2 (C, D, A, B, X[15], 14, UINT32_C (0xd8a1e681));
228 MD5STEP_R2 (B, C, D, A, X[4], 20, UINT32_C (0xe7d3fbc8));
230 MD5STEP_R2 (A, B, C, D, X[9], 5, UINT32_C (0x21e1cde6));
231 MD5STEP_R2 (D, A, B, C, X[14], 9, UINT32_C (0xc33707d6));
232 MD5STEP_R2 (C, D, A, B, X[3], 14, UINT32_C (0xf4d50d87));
233 MD5STEP_R2 (B, C, D, A, X[8], 20, UINT32_C (0x455a14ed));
235 MD5STEP_R2 (A, B, C, D, X[13], 5, UINT32_C (0xa9e3e905));
236 MD5STEP_R2 (D, A, B, C, X[2], 9, UINT32_C (0xfcefa3f8));
237 MD5STEP_R2 (C, D, A, B, X[7], 14, UINT32_C (0x676f02d9));
238 MD5STEP_R2 (B, C, D, A, X[12], 20, UINT32_C (0x8d2a4c8a));
242 MD5STEP_R3 (A, B, C, D, X[5], 4, UINT32_C (0xfffa3942));
243 MD5STEP_R3 (D, A, B, C, X[8], 11, UINT32_C (0x8771f681));
244 MD5STEP_R3 (C, D, A, B, X[11], 16, UINT32_C (0x6d9d6122));
245 MD5STEP_R3 (B, C, D, A, X[14], 23, UINT32_C (0xfde5380c));
247 MD5STEP_R3 (A, B, C, D, X[1], 4, UINT32_C (0xa4beea44));
248 MD5STEP_R3 (D, A, B, C, X[4], 11, UINT32_C (0x4bdecfa9));
249 MD5STEP_R3 (C, D, A, B, X[7], 16, UINT32_C (0xf6bb4b60));
250 MD5STEP_R3 (B, C, D, A, X[10], 23, UINT32_C (0xbebfbc70));
252 MD5STEP_R3 (A, B, C, D, X[13], 4, UINT32_C (0x289b7ec6));
253 MD5STEP_R3 (D, A, B, C, X[0], 11, UINT32_C (0xeaa127fa));
254 MD5STEP_R3 (C, D, A, B, X[3], 16, UINT32_C (0xd4ef3085));
255 MD5STEP_R3 (B, C, D, A, X[6], 23, UINT32_C (0x04881d05));
257 MD5STEP_R3 (A, B, C, D, X[9], 4, UINT32_C (0xd9d4d039));
258 MD5STEP_R3 (D, A, B, C, X[12], 11, UINT32_C (0xe6db99e5));
259 MD5STEP_R3 (C, D, A, B, X[15], 16, UINT32_C (0x1fa27cf8));
260 MD5STEP_R3 (B, C, D, A, X[2], 23, UINT32_C (0xc4ac5665));
264 MD5STEP_R4 (A, B, C, D, X[0], 6, UINT32_C (0xf4292244));
265 MD5STEP_R4 (D, A, B, C, X[7], 10, UINT32_C (0x432aff97));
266 MD5STEP_R4 (C, D, A, B, X[14], 15, UINT32_C (0xab9423a7));
267 MD5STEP_R4 (B, C, D, A, X[5], 21, UINT32_C (0xfc93a039));
269 MD5STEP_R4 (A, B, C, D, X[12], 6, UINT32_C (0x655b59c3));
270 MD5STEP_R4 (D, A, B, C, X[3], 10, UINT32_C (0x8f0ccc92));
271 MD5STEP_R4 (C, D, A, B, X[10], 15, UINT32_C (0xffeff47d));
272 MD5STEP_R4 (B, C, D, A, X[1], 21, UINT32_C (0x85845dd1));
274 MD5STEP_R4 (A, B, C, D, X[8], 6, UINT32_C (0x6fa87e4f));
275 MD5STEP_R4 (D, A, B, C, X[15], 10, UINT32_C (0xfe2ce6e0));
276 MD5STEP_R4 (C, D, A, B, X[6], 15, UINT32_C (0xa3014314));
277 MD5STEP_R4 (B, C, D, A, X[13], 21, UINT32_C (0x4e0811a1));
279 MD5STEP_R4 (A, B, C, D, X[4], 6, UINT32_C (0xf7537e82));
280 MD5STEP_R4 (D, A, B, C, X[11], 10, UINT32_C (0xbd3af235));
281 MD5STEP_R4 (C, D, A, B, X[2], 15, UINT32_C (0x2ad7d2bb));
282 MD5STEP_R4 (B, C, D, A, X[9], 21, UINT32_C (0xeb86d391));
286 static const uint32_t T[64] =
287 { UINT32_C (0xd76aa478), UINT32_C (0xe8c7b756), UINT32_C (0x242070db),
288 UINT32_C (0xc1bdceee), UINT32_C (0xf57c0faf), UINT32_C (0x4787c62a),
289 UINT32_C (0xa8304613), UINT32_C (0xfd469501), UINT32_C (0x698098d8),
290 UINT32_C (0x8b44f7af), UINT32_C (0xffff5bb1), UINT32_C (0x895cd7be),
291 UINT32_C (0x6b901122), UINT32_C (0xfd987193), UINT32_C (0xa679438e),
292 UINT32_C (0x49b40821), UINT32_C (0xf61e2562), UINT32_C (0xc040b340),
293 UINT32_C (0x265e5a51), UINT32_C (0xe9b6c7aa), UINT32_C (0xd62f105d),
294 UINT32_C (0x02441453), UINT32_C (0xd8a1e681), UINT32_C (0xe7d3fbc8),
295 UINT32_C (0x21e1cde6), UINT32_C (0xc33707d6), UINT32_C (0xf4d50d87),
296 UINT32_C (0x455a14ed), UINT32_C (0xa9e3e905), UINT32_C (0xfcefa3f8),
297 UINT32_C (0x676f02d9), UINT32_C (0x8d2a4c8a), UINT32_C (0xfffa3942),
298 UINT32_C (0x8771f681), UINT32_C (0x6d9d6122), UINT32_C (0xfde5380c),
299 UINT32_C (0xa4beea44), UINT32_C (0x4bdecfa9), UINT32_C (0xf6bb4b60),
300 UINT32_C (0xbebfbc70), UINT32_C (0x289b7ec6), UINT32_C (0xeaa127fa),
301 UINT32_C (0xd4ef3085), UINT32_C (0x04881d05), UINT32_C (0xd9d4d039),
302 UINT32_C (0xe6db99e5), UINT32_C (0x1fa27cf8), UINT32_C (0xc4ac5665),
303 UINT32_C (0xf4292244), UINT32_C (0x432aff97), UINT32_C (0xab9423a7),
304 UINT32_C (0xfc93a039), UINT32_C (0x655b59c3), UINT32_C (0x8f0ccc92),
305 UINT32_C (0xffeff47d), UINT32_C (0x85845dd1), UINT32_C (0x6fa87e4f),
306 UINT32_C (0xfe2ce6e0), UINT32_C (0xa3014314), UINT32_C (0x4e0811a1),
307 UINT32_C (0xf7537e82), UINT32_C (0xbd3af235), UINT32_C (0x2ad7d2bb),
308 UINT32_C (0xeb86d391) };
332 const unsigned int idx_add = i;
333 MD5STEP_R2 (A, B, C, D, X[(1U + idx_add) & 15U], 5, T[i]);
335 MD5STEP_R2 (D, A, B, C, X[(6U + idx_add) & 15U], 9, T[i]);
337 MD5STEP_R2 (C, D, A, B, X[(11U + idx_add) & 15U], 14, T[i]);
339 MD5STEP_R2 (B, C, D, A, X[(0U + idx_add) & 15U], 20, T[i]);
347 const unsigned int idx_add = i;
348 MD5STEP_R3 (A, B, C, D, X[(5U + 64U - idx_add) & 15U], 4, T[i]);
350 MD5STEP_R3 (D, A, B, C, X[(8U + 64U - idx_add) & 15U], 11, T[i]);
352 MD5STEP_R3 (C, D, A, B, X[(11U + 64U - idx_add) & 15U], 16, T[i]);
354 MD5STEP_R3 (B, C, D, A, X[(14U + 64U - idx_add) & 15U], 23, T[i]);
362 const unsigned int idx_add = i;
363 MD5STEP_R4 (A, B, C, D, X[(0U + 64U - idx_add) & 15U], 6, T[i]);
365 MD5STEP_R4 (D, A, B, C, X[(7U + 64U - idx_add) & 15U], 10, T[i]);
367 MD5STEP_R4 (C, D, A, B, X[(14U + 64U - idx_add) & 15U], 15, T[i]);
369 MD5STEP_R4 (B, C, D, A, X[(5U + 64U - idx_add) & 15U], 21, T[i]);