79 unsigned char buffer[64];
90#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
91#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
92#define H(x, y, z) (((x) ^ (y)) ^ (z))
93#define H2(x, y, z) ((x) ^ ((y) ^ (z)))
94#define I(x, y, z) ((y) ^ ((x) | ~(z)))
99#define STEP(f, a, b, c, d, x, t, s) \
100 (a) += f((b), (c), (d)) + (x) + (t); \
101 (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
110 (MD5_u32plus)ptr[(n) * 4] | \
111 ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \
112 ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \
113 ((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
123 const unsigned char *ptr;
127 ptr = (
const unsigned char *)data;
141 STEP(
F, a, b, c, d,
SET(0), 0xd76aa478, 7)
142 STEP(
F, d, a, b, c,
SET(1), 0xe8c7b756, 12)
143 STEP(
F, c, d, a, b,
SET(2), 0x242070db, 17)
144 STEP(
F, b, c, d, a,
SET(3), 0xc1bdceee, 22)
145 STEP(
F, a, b, c, d,
SET(4), 0xf57c0faf, 7)
146 STEP(
F, d, a, b, c,
SET(5), 0x4787c62a, 12)
147 STEP(
F, c, d, a, b,
SET(6), 0xa8304613, 17)
148 STEP(
F, b, c, d, a,
SET(7), 0xfd469501, 22)
149 STEP(
F, a, b, c, d,
SET(8), 0x698098d8, 7)
150 STEP(
F, d, a, b, c,
SET(9), 0x8b44f7af, 12)
151 STEP(
F, c, d, a, b,
SET(10), 0xffff5bb1, 17)
152 STEP(
F, b, c, d, a,
SET(11), 0x895cd7be, 22)
153 STEP(
F, a, b, c, d,
SET(12), 0x6b901122, 7)
154 STEP(
F, d, a, b, c,
SET(13), 0xfd987193, 12)
155 STEP(
F, c, d, a, b,
SET(14), 0xa679438e, 17)
156 STEP(
F, b, c, d, a,
SET(15), 0x49b40821, 22)
159 STEP(
G, a, b, c, d,
GET(1), 0xf61e2562, 5)
160 STEP(
G, d, a, b, c,
GET(6), 0xc040b340, 9)
161 STEP(
G, c, d, a, b,
GET(11), 0x265e5a51, 14)
162 STEP(
G, b, c, d, a,
GET(0), 0xe9b6c7aa, 20)
163 STEP(
G, a, b, c, d,
GET(5), 0xd62f105d, 5)
164 STEP(
G, d, a, b, c,
GET(10), 0x02441453, 9)
165 STEP(
G, c, d, a, b,
GET(15), 0xd8a1e681, 14)
166 STEP(
G, b, c, d, a,
GET(4), 0xe7d3fbc8, 20)
167 STEP(
G, a, b, c, d,
GET(9), 0x21e1cde6, 5)
168 STEP(
G, d, a, b, c,
GET(14), 0xc33707d6, 9)
169 STEP(
G, c, d, a, b,
GET(3), 0xf4d50d87, 14)
170 STEP(
G, b, c, d, a,
GET(8), 0x455a14ed, 20)
171 STEP(
G, a, b, c, d,
GET(13), 0xa9e3e905, 5)
172 STEP(
G, d, a, b, c,
GET(2), 0xfcefa3f8, 9)
173 STEP(
G, c, d, a, b,
GET(7), 0x676f02d9, 14)
174 STEP(
G, b, c, d, a,
GET(12), 0x8d2a4c8a, 20)
177 STEP(
H, a, b, c, d,
GET(5), 0xfffa3942, 4)
178 STEP(
H2, d, a, b, c,
GET(8), 0x8771f681, 11)
179 STEP(
H, c, d, a, b,
GET(11), 0x6d9d6122, 16)
180 STEP(
H2, b, c, d, a,
GET(14), 0xfde5380c, 23)
181 STEP(
H, a, b, c, d,
GET(1), 0xa4beea44, 4)
182 STEP(
H2, d, a, b, c,
GET(4), 0x4bdecfa9, 11)
183 STEP(
H, c, d, a, b,
GET(7), 0xf6bb4b60, 16)
184 STEP(
H2, b, c, d, a,
GET(10), 0xbebfbc70, 23)
185 STEP(
H, a, b, c, d,
GET(13), 0x289b7ec6, 4)
186 STEP(
H2, d, a, b, c,
GET(0), 0xeaa127fa, 11)
187 STEP(
H, c, d, a, b,
GET(3), 0xd4ef3085, 16)
188 STEP(
H2, b, c, d, a,
GET(6), 0x04881d05, 23)
189 STEP(
H, a, b, c, d,
GET(9), 0xd9d4d039, 4)
190 STEP(
H2, d, a, b, c,
GET(12), 0xe6db99e5, 11)
191 STEP(
H, c, d, a, b,
GET(15), 0x1fa27cf8, 16)
192 STEP(
H2, b, c, d, a,
GET(2), 0xc4ac5665, 23)
195 STEP(
I, a, b, c, d,
GET(0), 0xf4292244, 6)
196 STEP(
I, d, a, b, c,
GET(7), 0x432aff97, 10)
197 STEP(
I, c, d, a, b,
GET(14), 0xab9423a7, 15)
198 STEP(
I, b, c, d, a,
GET(5), 0xfc93a039, 21)
199 STEP(
I, a, b, c, d,
GET(12), 0x655b59c3, 6)
200 STEP(
I, d, a, b, c,
GET(3), 0x8f0ccc92, 10)
201 STEP(
I, c, d, a, b,
GET(10), 0xffeff47d, 15)
202 STEP(
I, b, c, d, a,
GET(1), 0x85845dd1, 21)
203 STEP(
I, a, b, c, d,
GET(8), 0x6fa87e4f, 6)
204 STEP(
I, d, a, b, c,
GET(15), 0xfe2ce6e0, 10)
205 STEP(
I, c, d, a, b,
GET(6), 0xa3014314, 15)
206 STEP(
I, b, c, d, a,
GET(13), 0x4e0811a1, 21)
207 STEP(
I, a, b, c, d,
GET(4), 0xf7537e82, 6)
208 STEP(
I, d, a, b, c,
GET(11), 0xbd3af235, 10)
209 STEP(
I, c, d, a, b,
GET(2), 0x2ad7d2bb, 15)
210 STEP(
I, b, c, d, a,
GET(9), 0xeb86d391, 21)
218 }
while (
size -= 64);
260 data = (
unsigned char *)data +
available;
266 data =
body(
ctx, data,
size & ~(
unsigned long)0x3f);
273#define OUT(dst, src) \
274 (dst)[0] = (unsigned char)(src); \
275 (dst)[1] = (unsigned char)((src) >> 8); \
276 (dst)[2] = (unsigned char)((src) >> 16); \
277 (dst)[3] = (unsigned char)((src) >> 24);
283 used =
ctx->lo & 0x3f;
285 ctx->buffer[used++] = 0x80;
void create_md5sum(const unsigned char *input, int len, char output[MD5_HEX_BYTES+1])
static void md5_buffer(const unsigned char *buffer, size_t len, unsigned char *resblock)
#define STEP(f, a, b, c, d, x, t, s)
static void MD5_Final(unsigned char *result, MD5_CTX *ctx)
static const void * body(MD5_CTX *ctx, const void *data, unsigned long size)
static void MD5_Init(MD5_CTX *ctx)
static void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
#define MAX_MD5_BIN_BYTES