23 #define PUT_64BIT_LE(cp, value) do { \
24 (cp)[7] = (uint8_t)((value) >> 56); \
25 (cp)[6] = (uint8_t)((value) >> 48); \
26 (cp)[5] = (uint8_t)((value) >> 40); \
27 (cp)[4] = (uint8_t)((value) >> 32); \
28 (cp)[3] = (uint8_t)((value) >> 24); \
29 (cp)[2] = (uint8_t)((value) >> 16); \
30 (cp)[1] = (uint8_t)((value) >> 8); \
31 (cp)[0] = (uint8_t)((value)); } while (0)
33 #define PUT_32BIT_LE(cp, value) do { \
34 (cp)[3] = (uint8_t)((value) >> 24); \
35 (cp)[2] = (uint8_t)((value) >> 16); \
36 (cp)[1] = (uint8_t)((value) >> 8); \
37 (cp)[0] = (uint8_t)((value)); } while (0)
40 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
41 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
42 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
60 ctx->
state[0] = 0x67452301;
61 ctx->
state[1] = 0xefcdab89;
62 ctx->
state[2] = 0x98badcfe;
63 ctx->
state[3] = 0x10325476;
109 for (i = 0; i < 4; i++)
112 memset(ctx, 0,
sizeof(*ctx));
119 #define F1(x, y, z) (z ^ (x & (y ^ z)))
120 #define F2(x, y, z) F1(z, x, y)
121 #define F3(x, y, z) (x ^ y ^ z)
122 #define F4(x, y, z) (y ^ (x | ~z))
125 #define MD5STEP(f, w, x, y, z, data, s) \
126 ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
137 uint32_t a, b, c, d, in[MD5_BLOCK_SIZE / 4];
139 #if _MHD_BYTE_ORDER == _MHD_LITTLE_ENDIAN
140 memcpy(in, block,
sizeof(in));
142 for (a = 0; a < MD5_BLOCK_SIZE / 4; a++)
145 (uint32_t)(block[a * 4 + 0]) |
146 (uint32_t)(block[a * 4 + 1]) << 8 |
147 (uint32_t)(block[a * 4 + 2]) << 16 |
148 (uint32_t)(block[a * 4 + 3]) << 24);
157 MD5STEP(
F1, a, b, c, d, in[0] + 0xd76aa478, 7);
158 MD5STEP(
F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
159 MD5STEP(
F1, c, d, a, b, in[2] + 0x242070db, 17);
160 MD5STEP(
F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
161 MD5STEP(
F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
162 MD5STEP(
F1, d, a, b, c, in[5] + 0x4787c62a, 12);
163 MD5STEP(
F1, c, d, a, b, in[6] + 0xa8304613, 17);
164 MD5STEP(
F1, b, c, d, a, in[7] + 0xfd469501, 22);
165 MD5STEP(
F1, a, b, c, d, in[8] + 0x698098d8, 7);
166 MD5STEP(
F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
167 MD5STEP(
F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
168 MD5STEP(
F1, b, c, d, a, in[11] + 0x895cd7be, 22);
169 MD5STEP(
F1, a, b, c, d, in[12] + 0x6b901122, 7);
170 MD5STEP(
F1, d, a, b, c, in[13] + 0xfd987193, 12);
171 MD5STEP(
F1, c, d, a, b, in[14] + 0xa679438e, 17);
172 MD5STEP(
F1, b, c, d, a, in[15] + 0x49b40821, 22);
174 MD5STEP(
F2, a, b, c, d, in[1] + 0xf61e2562, 5);
175 MD5STEP(
F2, d, a, b, c, in[6] + 0xc040b340, 9);
176 MD5STEP(
F2, c, d, a, b, in[11] + 0x265e5a51, 14);
177 MD5STEP(
F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
178 MD5STEP(
F2, a, b, c, d, in[5] + 0xd62f105d, 5);
179 MD5STEP(
F2, d, a, b, c, in[10] + 0x02441453, 9);
180 MD5STEP(
F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
181 MD5STEP(
F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
182 MD5STEP(
F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
183 MD5STEP(
F2, d, a, b, c, in[14] + 0xc33707d6, 9);
184 MD5STEP(
F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
185 MD5STEP(
F2, b, c, d, a, in[8] + 0x455a14ed, 20);
186 MD5STEP(
F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
187 MD5STEP(
F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
188 MD5STEP(
F2, c, d, a, b, in[7] + 0x676f02d9, 14);
189 MD5STEP(
F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
191 MD5STEP(
F3, a, b, c, d, in[5] + 0xfffa3942, 4);
192 MD5STEP(
F3, d, a, b, c, in[8] + 0x8771f681, 11);
193 MD5STEP(
F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
194 MD5STEP(
F3, b, c, d, a, in[14] + 0xfde5380c, 23);
195 MD5STEP(
F3, a, b, c, d, in[1] + 0xa4beea44, 4);
196 MD5STEP(
F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
197 MD5STEP(
F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
198 MD5STEP(
F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
199 MD5STEP(
F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
200 MD5STEP(
F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
201 MD5STEP(
F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
202 MD5STEP(
F3, b, c, d, a, in[6] + 0x04881d05, 23);
203 MD5STEP(
F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
204 MD5STEP(
F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
205 MD5STEP(
F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
206 MD5STEP(
F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
208 MD5STEP(
F4, a, b, c, d, in[0] + 0xf4292244, 6);
209 MD5STEP(
F4, d, a, b, c, in[7] + 0x432aff97, 10);
210 MD5STEP(
F4, c, d, a, b, in[14] + 0xab9423a7, 15);
211 MD5STEP(
F4, b, c, d, a, in[5] + 0xfc93a039, 21);
212 MD5STEP(
F4, a, b, c, d, in[12] + 0x655b59c3, 6);
213 MD5STEP(
F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
214 MD5STEP(
F4, c, d, a, b, in[10] + 0xffeff47d, 15);
215 MD5STEP(
F4, b, c, d, a, in[1] + 0x85845dd1, 21);
216 MD5STEP(
F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
217 MD5STEP(
F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
218 MD5STEP(
F4, c, d, a, b, in[6] + 0xa3014314, 15);
219 MD5STEP(
F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
220 MD5STEP(
F4, a, b, c, d, in[4] + 0xf7537e82, 6);
221 MD5STEP(
F4, d, a, b, c, in[11] + 0xbd3af235, 10);
222 MD5STEP(
F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
223 MD5STEP(
F4, b, c, d, a, in[9] + 0xeb86d391, 21);
238 const uint8_t *input,
252 ctx->
count += (uint64_t)len << 3;
258 memcpy (ctx->
buffer + have,
271 (
const unsigned char *) input);
279 memcpy (ctx->
buffer + have,
void MD5Final(void *ctx_, unsigned char digest[MD5_DIGEST_SIZE])
static uint8_t PADDING[MD5_BLOCK_SIZE]
static void MD5Pad(struct MD5Context *ctx)
uint8_t buffer[MD5_BLOCK_SIZE]
#define MD5STEP(f, w, x, y, z, data, s)
macro definitions for host byte order
#define PUT_64BIT_LE(cp, value)
#define PUT_32BIT_LE(cp, value)
void MD5Update(void *ctx_, const uint8_t *input, size_t len)
static void MD5Transform(uint32_t state[4], const uint8_t block[MD5_BLOCK_SIZE])