33#define MD5_BYTES_IN_WORD (32 / 8)
49 ctx->
state[0] = UINT32_C (0x67452301);
50 ctx->
state[1] = UINT32_C (0xefcdab89);
51 ctx->
state[2] = UINT32_C (0x98badcfe);
52 ctx->
state[3] = UINT32_C (0x10325476);
82 ctx->
buffer[have_bytes++] = 0x80;
87 ctx->
buffer[have_bytes++] = 0;
95 count_bits = ctx->
count << 3;
100#ifndef _MHD_PUT_32BIT_LE_UNALIGNED
123 memset (ctx, 0,
sizeof(*ctx));
130#define F1(x, y, z) (z ^ (x & (y ^ z)))
131#define F2(x, y, z) F1 (z, x, y)
132#define F3(x, y, z) (x ^ y ^ z)
133#define F4(x, y, z) (y ^ (x | ~z))
136#define MD5STEP(f, w, x, y, z, data, s) \
137 (w += f (x, y, z) + data, w = _MHD_ROTL32(w, s), w += x)
152#if (_MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN) || \
153 ! defined(_MHD_GET_32BIT_LE_UNALIGNED)
161 in = (
const uint32_t *) block;
164#if _MHD_BYTE_ORDER != _MHD_LITTLE_ENDIAN
189 MD5STEP (
F1, a, b, c, d, in[0] + UINT32_C (0xd76aa478), 7);
190 MD5STEP (
F1, d, a, b, c, in[1] + UINT32_C (0xe8c7b756), 12);
191 MD5STEP (
F1, c, d, a, b, in[2] + UINT32_C (0x242070db), 17);
192 MD5STEP (
F1, b, c, d, a, in[3] + UINT32_C (0xc1bdceee), 22);
193 MD5STEP (
F1, a, b, c, d, in[4] + UINT32_C (0xf57c0faf), 7);
194 MD5STEP (
F1, d, a, b, c, in[5] + UINT32_C (0x4787c62a), 12);
195 MD5STEP (
F1, c, d, a, b, in[6] + UINT32_C (0xa8304613), 17);
196 MD5STEP (
F1, b, c, d, a, in[7] + UINT32_C (0xfd469501), 22);
197 MD5STEP (
F1, a, b, c, d, in[8] + UINT32_C (0x698098d8), 7);
198 MD5STEP (
F1, d, a, b, c, in[9] + UINT32_C (0x8b44f7af), 12);
199 MD5STEP (
F1, c, d, a, b, in[10] + UINT32_C (0xffff5bb1), 17);
200 MD5STEP (
F1, b, c, d, a, in[11] + UINT32_C (0x895cd7be), 22);
201 MD5STEP (
F1, a, b, c, d, in[12] + UINT32_C (0x6b901122), 7);
202 MD5STEP (
F1, d, a, b, c, in[13] + UINT32_C (0xfd987193), 12);
203 MD5STEP (
F1, c, d, a, b, in[14] + UINT32_C (0xa679438e), 17);
204 MD5STEP (
F1, b, c, d, a, in[15] + UINT32_C (0x49b40821), 22);
206 MD5STEP (
F2, a, b, c, d, in[1] + UINT32_C (0xf61e2562), 5);
207 MD5STEP (
F2, d, a, b, c, in[6] + UINT32_C (0xc040b340), 9);
208 MD5STEP (
F2, c, d, a, b, in[11] + UINT32_C (0x265e5a51), 14);
209 MD5STEP (
F2, b, c, d, a, in[0] + UINT32_C (0xe9b6c7aa), 20);
210 MD5STEP (
F2, a, b, c, d, in[5] + UINT32_C (0xd62f105d), 5);
211 MD5STEP (
F2, d, a, b, c, in[10] + UINT32_C (0x02441453), 9);
212 MD5STEP (
F2, c, d, a, b, in[15] + UINT32_C (0xd8a1e681), 14);
213 MD5STEP (
F2, b, c, d, a, in[4] + UINT32_C (0xe7d3fbc8), 20);
214 MD5STEP (
F2, a, b, c, d, in[9] + UINT32_C (0x21e1cde6), 5);
215 MD5STEP (
F2, d, a, b, c, in[14] + UINT32_C (0xc33707d6), 9);
216 MD5STEP (
F2, c, d, a, b, in[3] + UINT32_C (0xf4d50d87), 14);
217 MD5STEP (
F2, b, c, d, a, in[8] + UINT32_C (0x455a14ed), 20);
218 MD5STEP (
F2, a, b, c, d, in[13] + UINT32_C (0xa9e3e905), 5);
219 MD5STEP (
F2, d, a, b, c, in[2] + UINT32_C (0xfcefa3f8), 9);
220 MD5STEP (
F2, c, d, a, b, in[7] + UINT32_C (0x676f02d9), 14);
221 MD5STEP (
F2, b, c, d, a, in[12] + UINT32_C (0x8d2a4c8a), 20);
223 MD5STEP (
F3, a, b, c, d, in[5] + UINT32_C (0xfffa3942), 4);
224 MD5STEP (
F3, d, a, b, c, in[8] + UINT32_C (0x8771f681), 11);
225 MD5STEP (
F3, c, d, a, b, in[11] + UINT32_C (0x6d9d6122), 16);
226 MD5STEP (
F3, b, c, d, a, in[14] + UINT32_C (0xfde5380c), 23);
227 MD5STEP (
F3, a, b, c, d, in[1] + UINT32_C (0xa4beea44), 4);
228 MD5STEP (
F3, d, a, b, c, in[4] + UINT32_C (0x4bdecfa9), 11);
229 MD5STEP (
F3, c, d, a, b, in[7] + UINT32_C (0xf6bb4b60), 16);
230 MD5STEP (
F3, b, c, d, a, in[10] + UINT32_C (0xbebfbc70), 23);
231 MD5STEP (
F3, a, b, c, d, in[13] + UINT32_C (0x289b7ec6), 4);
232 MD5STEP (
F3, d, a, b, c, in[0] + UINT32_C (0xeaa127fa), 11);
233 MD5STEP (
F3, c, d, a, b, in[3] + UINT32_C (0xd4ef3085), 16);
234 MD5STEP (
F3, b, c, d, a, in[6] + UINT32_C (0x04881d05), 23);
235 MD5STEP (
F3, a, b, c, d, in[9] + UINT32_C (0xd9d4d039), 4);
236 MD5STEP (
F3, d, a, b, c, in[12] + UINT32_C (0xe6db99e5), 11);
237 MD5STEP (
F3, c, d, a, b, in[15] + UINT32_C (0x1fa27cf8), 16);
238 MD5STEP (
F3, b, c, d, a, in[2] + UINT32_C (0xc4ac5665), 23);
240 MD5STEP (
F4, a, b, c, d, in[0] + UINT32_C (0xf4292244), 6);
241 MD5STEP (
F4, d, a, b, c, in[7] + UINT32_C (0x432aff97), 10);
242 MD5STEP (
F4, c, d, a, b, in[14] + UINT32_C (0xab9423a7), 15);
243 MD5STEP (
F4, b, c, d, a, in[5] + UINT32_C (0xfc93a039), 21);
244 MD5STEP (
F4, a, b, c, d, in[12] + UINT32_C (0x655b59c3), 6);
245 MD5STEP (
F4, d, a, b, c, in[3] + UINT32_C (0x8f0ccc92), 10);
246 MD5STEP (
F4, c, d, a, b, in[10] + UINT32_C (0xffeff47d), 15);
247 MD5STEP (
F4, b, c, d, a, in[1] + UINT32_C (0x85845dd1), 21);
248 MD5STEP (
F4, a, b, c, d, in[8] + UINT32_C (0x6fa87e4f), 6);
249 MD5STEP (
F4, d, a, b, c, in[15] + UINT32_C (0xfe2ce6e0), 10);
250 MD5STEP (
F4, c, d, a, b, in[6] + UINT32_C (0xa3014314), 15);
251 MD5STEP (
F4, b, c, d, a, in[13] + UINT32_C (0x4e0811a1), 21);
252 MD5STEP (
F4, a, b, c, d, in[4] + UINT32_C (0xf7537e82), 6);
253 MD5STEP (
F4, d, a, b, c, in[11] + UINT32_C (0xbd3af235), 10);
254 MD5STEP (
F4, c, d, a, b, in[2] + UINT32_C (0x2ad7d2bb), 15);
255 MD5STEP (
F4, b, c, d, a, in[9] + UINT32_C (0xeb86d391), 21);
270 const uint8_t *input,
284 ctx->
count += (uint64_t) len;
290 memcpy (ctx->
buffer + have,
303 (
const unsigned char *) input);
311 memcpy (ctx->
buffer + have,
#define MD5STEP(f, w, x, y, z, data, s)
void MHD_MD5Update(void *ctx_, const uint8_t *input, size_t len)
void MHD_MD5Final(void *ctx_, uint8_t digest[MD5_DIGEST_SIZE])
void MHD_MD5Init(void *ctx_)
static void MD5Transform(uint32_t state[4], const uint8_t block[MD5_BLOCK_SIZE])
#define MD5_BYTES_IN_WORD
#define _MHD_UINT32_ALIGN
macros for bits manipulations
#define _MHD_GET_32BIT_LE(addr)
_MHD_static_inline void _MHD_PUT_64BIT_LE_SAFE(void *dst, uint64_t value)
#define _MHD_PUT_32BIT_LE(addr, value32)
uint8_t buffer[MD5_BLOCK_SIZE]